BIOS 配置的硬件接口

https://bugs.launchpad.net/ironic/+bug/1712032

该提案旨在创建一个用于 BIOS 自动化配置的新硬件接口,并提供一种方法将 BIOS 配置作为手动清理过程的一部分[0]

问题描述

  • 在 OpenStack 裸机节点上,有几种用例需要配置 BIOS 选项以启用某些功能或获得性能优化。例如,为了使用 SRIOV [1] 或 DPDK [2] 技术,必须启用 ‘虚拟化技术’ BIOS 选项;为了在实时场景中实现确定性的低数据包延迟,必须禁用与电源管理、CPU 睡眠状态等相关的 BIOS 选项;另一个很好的例子是控制台重定向 BIOS 设置。

提议的变更

  • 在节点注册并可用基本硬件信息后,操作员可以定义 BIOS 配置。

  • 操作员将能够使用在新的 BIOSInterface 上定义的清理步骤,为特定节点设置 BIOS 配置。要更改的 BIOS 设置将以 JSON 字典的形式作为参数传递给清理步骤。目前,此清理步骤将是手动步骤,但将来可以扩展为自动清理步骤。

  • 类似于 RAIDInterface,该提案提出一个新的硬件接口,名为 BIOSInterface,它将用于硬件类型的带外 BIOS 配置。将其命名为 BIOSInterface 并不意味着该规范特定于 BIOS 系统,而是适用于 BIOS、UEFI 等系统的通用接口名称。请参阅驱动程序 API 影响,了解将为此接口添加的方法列表。

    注意

    选择 BIOS 而不是其他的原因是很难找到适用于所有系统的适当名称,并且 BIOS 被认为足够接近。

  • 在从注册到可管理状态的过程中,将验证 BIOS 配置的凭据,这些凭据将重用 driver_info 中的现有凭据。

  • 如果不存在,将创建一个新的数据库表 bios_settings,并且在进入 _do_node_clean 中的清理步骤时,将检索并更新节点的当前 BIOS 设置,这意味着它将对手动和自动清理都调用。在裸机上成功应用给定的 BIOS 选项后,它将使用应用后的更改更新缓存的 BIOS 设置。

  • 此接口将不可用于任何经典驱动程序。经典驱动程序将为此接口抛出 ‘UnsupportedDriverExtension’ 错误。

  • 如果节点没有 BIOS 接口(即 bios_interface=’no-bios’),则尝试更改 BIOS 配置将导致找不到清理步骤错误。

备选方案

  • 操作员可以根据需要手动更改 BIOS 配置。但这必须为每个节点完成,这既耗时又容易出错。

数据模型影响

  • 与 RAID 配置 [3] 不同,目标 BIOS 设置将作为参数传递给清理步骤,而不是存储在数据库中。

  • 当前的 BIOS 配置将被缓存,并存储在一个单独的 BIOS 表中。将添加以下数据库表和字段

    • 将添加一个名为 bios_settings 的新表,其中包含以下字段

      • node_id

        • Integer

        • PrimaryKeyConstraint

        • ForeignKeyConstraint(‘nodes.id’)

      • name

        • 字符串

        • PrimaryKeyConstraint

      • value

        • 字符串

      • created_at

        • DateTime

      • updated_at

        • DateTime

      它将存储从节点检索到的缓存 BIOS 信息,并在 BIOS 设置更改时进行更新。当添加新记录或更新现有记录时,将相应地更新 ‘created_at’ 和 ‘updated_at’ 字段。

    • node.bios_interface 将添加到节点表,它将包含我们希望用于 BIOS 自动化的硬件接口。

    • 将添加新的对象 ironic.objects.bios.BIOSSettingironic.objects.bios.BIOSSettingList 到对象模型。 BIOSSettingBIOSSettingList 字段将在 Python 对象模型中按需填充。

状态机影响

  • 在从注册到可管理状态的过程中,将验证凭据以确保用户具有访问 BIOS 配置的适当权限。

REST API 影响

建议在 BIOSInterface 上实现两个新的清理步骤

  • bios.factory_reset。它将触发给定节点的 BIOS 设置恢复出厂设置。例如

    {
      "target":"clean",
      "clean_steps": [{
        "interface": "bios",
        "step": "factory_reset"
      }]
    }
    
  • bios.apply_configuration。它将设置给定节点的 BIOS 设置。例如

    {
      "target":"clean",
      "clean_steps": [{
        "interface": "bios",
        "step": "apply_configuration",
        "args": {
          "settings": [
            {
              "name": <name>,
              "value": <value>
            },
            {
              "name": <name>,
              "value": <value>
            }
          ]
        }
      }]
    }
    
  • 将引入一个新的 REST API 来获取节点的缓存 BIOS 配置

    GET /v1/nodes/<node_ident>/bios
    

    该操作将返回当前缓存的设置,数据模式如下

    {
      "bios": [
        {
          "links": [
            {
              "href": "http://127.0.0.1:6385/v1/nodes/<node_ident>/bios/<name>",
              "rel": "self"
            },
            {
              "href": "http://127.0.0.1:6385/nodes/<node_ident>/bios/<name>",
              "rel": "bookmark"
            }
          ],
          "name": <name>,
          "value": <value>
        },
        {
          "links": [
            {
              "href": "http://127.0.0.1:6385/v1/nodes/<node_ident>/bios/<name>",
              "rel": "self"
            },
            {
              "href": "http://127.0.0.1:6385/nodes/<node_ident>/bios/<name>",
              "rel": "bookmark"
            }
          ],
          "name": <name>,
          "value": <value>
        }
      ]
    }
    

    如果驱动程序不支持 BIOS 配置,API 将返回 HTTP 400(错误请求);如果节点 BIOS 尚未配置,则返回 HTTP 404(资源未找到)。否则,它将返回 HTTP 200(确定)。

  • 要获取节点的指定 BIOS 设置

    GET /v1/nodes/<node_ident>/bios/<setting name>
    

    该操作将返回指定的 BIOS 设置,数据模式如下

    {
      "<setting name>":
        {
          "name": <setting name>,
          "value": <value>
        }
    }
    

客户端 (CLI) 影响

“ironic” CLI

ironic CLI 将不会更新。

“openstack baremetal” CLI

  • 使用 node-uuid 检索缓存的 BIOS 配置

    $ openstack baremetal node bios setting list <node-uuid>
    
  • 使用 node-uuid 显示指定的 BIOS 设置

    $ openstack baremetal node bios setting show <node-uuid> <setting-name>
    
  • BIOS 接口的验证结果将通过标准的验证接口返回。

RPC API 影响

驱动程序 API 影响

将为驱动程序提供一个新的 BIOSInterface,以允许它们实现 BIOS 配置。接口中将有几个新方法和清理步骤

  • do_factory_reset() - 此方法在驱动程序支持的情况下,将所有 BIOS 设置重置为出厂默认值。一旦重置操作成功,它还将更新 bios_settings 数据库表的记录为已知的默认值。厂商决定将设置的 BIOS 默认设置。

  • factory_reset() - 此清理步骤将把实际的重置工作委托给抽象方法 do_factory_reset()

    操作员可以选择将其作为手动清理步骤的一部分调用。相应的手动清理步骤将是 bios.factory_reset

  • do_apply_configuration(configuration={}) - 此驱动程序实现将从配置字典中获取设置,并将应用到裸机上的 BIOS 配置。驱动程序负责在应用设置之前进行相应的验证,以及/或在设置无效的 BIOS 配置时管理失败。此方法需要在第一次失败时回滚以前的设置。如果需要密码来更新 BIOS 配置,它将从 driver_info 属性中获取。实现细节取决于驱动程序。

  • apply_configuration(configuration={}) - 此清理步骤将把实际的配置工作委托给抽象方法 do_apply_configuration(configuration={})

    操作员可以选择将其作为手动清理步骤的一部分调用。相应的手动清理步骤将是 bios.apply_configuration

  • cache_bios_settings() - 此方法将在 bios_settings 数据库表中更新 BIOS 配置。它将尝试获取当前的 BIOS 设置并将它们存储在 bios_settings 数据库表中。它还将相应地更新 ‘created_at’ 和 ‘updated_at’ 时间戳字段。实现细节取决于驱动程序,例如,是否使用子方法共享 do_factory_resetdo_apply_configurationcache_bios_settings 以检索和保存 bios_settings 表中的 BIOS 信息。

Nova 驱动程序影响

Ramdisk 影响

安全影响

对 BIOS 配置的未授权访问可能会暴露敏感的 BIOS 信息和可配置的 BIOS 选项给攻击者,这可能导致破坏性后果。建议这种能力仅限于管理角色。更改 BIOS 设置需要凭据,这些凭据将重用 driver_info 中的现有凭据,而不是创建新的字段。

其他最终用户影响

可扩展性影响

性能影响

BIOS 配置可能会延长节点上手动清理所需的时间。

其他部署者影响

  • 添加新的配置选项

    • enabled_bios_interfaces:一个启用的 BIOS 接口列表。

    • default_bios_interface:要使用的默认 BIOS 接口。

  • 操作员可以使用 bios.apply_configurationbios.factory_reset 作为手动清理任务来执行 BIOS 管理。

开发人员影响

开发人员可以为各自的驱动程序实现 BIOSInterface

实现

负责人

主要负责人

zshi yroblamo

工作项

  • 在 Node 对象中添加 BIOS 接口字段。

  • 创建数据库模型和 API,用于节点 BIOS 表和操作。

  • 创建 BIOSInterface,其中包括以下项目

    • BIOSInterface 基本驱动程序中添加新的方法,例如 do_apply_configurationdo_factory_resetcache_bios_settings

    • BIOSInterface 基本驱动程序中添加新的清理步骤,例如 apply_configurationfactory_reset

    • 在进入 _do_node_clean 中的清理步骤时,添加缓存 BIOS 配置。

  • BIOSInterface 派生创建“假”和“无 BIOS”实现。

  • 创建 BIOS 配置的 REST API 端点。

  • 创建 BIOS 配置的 RPC 对象。

  • 实现 OSC 裸机 CLI 更改。

依赖项

测试

  • 将为代码添加单元测试。将提供带有 do_apply_configuration 方法的 BIOSInterface 的“假”实现,用于测试目的,并且可以作为手动清理的一部分运行。

  • 每个驱动程序负责提供第三方 CI 来测试 BIOS 配置。

  • 将使用假驱动程序添加 Tempest 测试。

升级和向后兼容性

  • 在驱动程序中不支持 BIOSInterface 时引发错误。

文档影响

  • 将提供有关如何配置节点以进行 BIOS 的文档。

  • 将更新 API 参考。

  • 各自的厂商应记录默认 BIOS 值以供参考。

参考资料