为本地磁盘暴露持久序列号

https://blueprints.launchpad.net/nova/+spec/local-disk-serial-numbers

有可能为虚拟机硬盘分配序列号,该序列号可以被客户操作系统查询。我们目前对附加卷这样做,但我们不为本地磁盘这样做:本地根磁盘、临时磁盘或交换磁盘。

此功能的主要面向用户目的是为虚拟机暴露本地磁盘的持久序列号。

问题描述

向客户操作系统呈现磁盘本质上是非确定性的。解决磁盘的最可靠方法是磁盘的某种持久属性,序列号是最方便的。这个问题对于附加卷来说最为严重,我们已经将卷 ID 作为磁盘的序列号暴露出来。为了稳健性和一致性,我们应该将此功能扩展到涵盖本地磁盘。

用例

作为运行 Windows 客户机的用户,我需要避免由于缺乏稳定的磁盘序列号而导致激活问题。

作为管理员,我需要能够迁移 Windows 客户机以解决数据中心的维护需求,而无需冒着由于磁盘序列号不稳定而使客户 Windows 实例失效的风险。

作为用户,我希望有一种通用的机制来识别我的工作负载中的附加卷和临时磁盘。

提议的变更

此规范提出了一种与 virt 驱动程序的新契约。对于实现稳定本地磁盘序列号的驱动程序,以下条件将成立

  • 本地根磁盘、临时磁盘和交换磁盘都将具有一个序列号。

  • 此序列号在实例的整个生命周期内都不会更改。

  • 对于标记的磁盘,此序列号将在设备元数据中暴露给客户机。

用于生成和持久化本地磁盘序列号的方法未定义,只要上述条件成立,驱动程序之间可能会有所不同。例如,ironic 驱动程序由于物理磁盘具有持久且稳定的序列号,因此可以自动满足前两点。ironic 驱动程序只需将这些序列号暴露在标记的本地磁盘的设备元数据中即可实现此规范。

该规范提出了一种为 libvirt 驱动程序实现上述功能的特定方案,该方案也可能对其他 virt 驱动程序有用。

实例连接的所有磁盘,除了配置磁盘,都有一个块设备映射,该映射具有持久的 UUID。我们将把此 UUID 作为本地磁盘的序列号呈现给虚拟机。对于卷,我们将继续像目前一样呈现卷 ID。

序列号将通过将 serial 字段添加到 DriverBlockDevice 来暴露给 virt 驱动程序。这还需要我们暴露本地根磁盘的块设备映射给 virt 驱动程序,而我们目前没有这样做。我们将通过在 block_device_info 字典中添加一个额外的字段来实现这一点,这意味着不了解此字段的现有驱动程序将不受其影响。

备选方案

考虑了其他生成本地磁盘持久序列号的方法。这些包括

  • 使用实例 UUID 和驱动程序特定的磁盘标识符的组合

  • 使用实例 UUID 和 BDM ID 的组合

前者被拒绝,因为它特定于驱动程序。后者被拒绝,因为如果我们将来实现跨单元格迁移的能力,它将会改变。

数据模型影响

为了此功能,在 Queens 周期中向 BDM(块设备映射)添加了一个 uuid 字段。为了完成此过程,在 Rocky 周期中,我们应该向 uuid 字段添加非空约束,并删除数据库中处理空 uuid 字段的 Python 代码。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

开发人员影响

无。

升级影响

block_device_mapping.uuid 将变为不可为空。在 Queens 周期中合并了填充此列的在线迁移(变更 I4b33751b)。除非操作员执行了在线迁移,否则此模式更改将失败。

实现

负责人

主要负责人

mbooth@redhat.com

工作项

  • 通过 block_device_info 将本地根磁盘暴露给 virt 驱动程序。

  • 向 DriverBlockDevice 添加 serial 字段,其中包含卷的现有行为,以及本地磁盘的新 BDM UUID。

  • 更新 libvirt 驱动程序以对所有磁盘使用 DriverBlockDevice.serial。

依赖项

无。

测试

单元测试应涵盖

  • block_device_info 包含来自卷引导和本地根的根磁盘。

  • DriverVolumeBlockDevice 及其子类应包含一个包含卷 ID 的 serial 字段。

  • 其他 DriverBlockDevice 子类应包含一个包含 BDM UUID 的 serial 字段。

Tempest 测试应涵盖

  • 呈现给虚拟机的本地磁盘在设备元数据中存在时具有序列号。

文档影响

这是一个用户可见的更改。应更新涵盖设备标记的文档,以反映标记本地磁盘的能力。

参考资料

无。

历史

修订版

发布名称

描述

Queens

  • 引入

  • 合并了 block_device_mapping.uuid 的添加。

  • 部分合并了将 block_device_mapping.uuid 暴露给驱动程序。

Rocky

  • 重新提出