向实例注入 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

引入