向实例注入 NMI¶
https://blueprints.launchpad.net/nova/+spec//inject-nmi
此规格添加了一个新的 API,用于向实例注入 NMI(不可屏蔽中断),以触发特殊功能,例如内核崩溃转储机制。
问题描述¶
NMI(不可屏蔽中断)用于触发特殊功能。例如,在关键任务领域,有必要触发内核崩溃转储机制。
可以使用以下命令手动触发内核崩溃转储
$ echo c > /proc/sysrq-trigger
如果内核遇到错误(内核崩溃),它将自行触发内核崩溃转储。使用 NMI 的原因/优点是我们可以对停滞的实例触发内核崩溃转储。
虽然 hypervisor 支持向实例注入 NMI 的函数,但 Nova 并没有注入 NMI 的 API。
Virsh 支持命令“virsh inject-nmi” [1]。
Ipmitool 支持命令“ipmitool chassis power diag” [2]。
Hyper-V Cmdlets 支持命令“Debug-VM -InjectNonMaskableInterrupt” [3]
用例¶
使用在其实例上触发 NMI 的功能的最终用户需要一个 API 来向实例发送 NMI。
通过触发,内核崩溃转储机制会将生产内存镜像转储为转储文件,并再次重新启动内核。之后,最终用户可以获取存储在其实例中的转储文件,并基于该文件调查问题原因。
项目优先级¶
无
提议的变更¶
此规格建议添加一个新的 API 用于注入 NMI,并在驱动程序上实现一种注入 NMI 的方法。收到 NMI 后,实例将按照最终用户配置的方式执行。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
方法的规范
适合在用户文档中使用的对方法描述
向服务器注入 NMI。
方法类型
PUT
正常的 HTTP 响应代码
202: Accepted
预期的错误 HTTP 响应代码
badRequest(400)
当驱动程序未实现 API 时,将使用此代码并附带错误消息,遵循指南 [4]。
当 hypervisor 无法发送 NMI 时,将使用此代码并附带包含原因的错误消息。
itemNotFound(404)
没有具有指定 uuid 的实例。
conflictingRequest(409)
服务器状态必须为 ACTIVE 或 ERROR。如果不是,则返回此代码。
如果指定的服务器已锁定,则此代码将返回给没有管理员权限的用户。在使用内核转储机制时,会导致服务器重新启动。因此,只有管理员才能像其他电源操作一样向锁定的服务器发送 NMI。
资源的 URL
/v2.1/servers/{server_id}/action
可以通过 url 传递的参数
传递了一个服务器 uuid。
JSON schema 定义了 body 数据
{ "inject_nmi": null }
响应数据的 JSON schema 定义
当结果成功时,不返回响应 body。
当发生错误时,响应数据包括错误消息 [5]。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
python-novaclient 将添加一个用于此新 API 的客户端 API
python-novaclient 将添加一个用于新 API 的 CLI。
nova inject-nmi <server>
性能影响¶
无
其他部署者影响¶
此 API 的默认策略是默认情况下管理员和所有者。
开发人员影响¶
此更改为驱动程序添加了一个新的 API。此规格将在 libvirt 驱动程序上实现新的 API。
实现¶
负责人¶
- 主要负责人
shiina-horonori (hshiina)
- 其他贡献者
无
工作项¶
添加一个新的 REST API。
添加一个新的驱动程序 API。
在 libvirt 驱动程序上实现 API。
依赖项¶
此规格与 ironic 中的蓝图相关。
当蓝图获得批准时,ironic 驱动程序将使用另一个蓝图实现 API。
测试¶
将添加单元测试。
文档影响¶
新的 API 应该添加到文档中。
参考资料¶
[1] http://linux.die.net/man/1/virsh
[2] http://linux.die.net/man/1/ipmitool
[3] https://technet.microsoft.com/en-us/library/dn464280.aspx
[4] https://review.openstack.org/#/c/183456
[5] https://docs.openstack.org/developer/nova/v2/faults.html
历史¶
发布名称 |
描述 |
|---|---|
Liberty |
引入 |