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

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

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

此功能的主要用户可见目的是为虚拟机暴露本地磁盘的持久序列号。此功能的一个有益结果是为块设备映射添加一个uuid,这在其他功能中已被频繁请求。

问题描述

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

用例

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

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

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

提议的变更

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

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

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

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

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

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

实例连接的所有磁盘,除了配置磁盘,都有一个块设备映射。我们将向块设备映射添加一个uuid字段,并确保为所有块设备映射填充它。我们将把这个uuid作为本地磁盘的序列号呈现给虚拟机。对于卷,我们将继续像目前一样呈现卷ID。

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

备选方案

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

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

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

这两种方案都具有无需更改数据模型的优势。前者被拒绝,因为它具有驱动程序特异性。后者被拒绝,因为它如果将来我们实现跨单元格迁移的能力,将会发生变化。

BDM uuid被选择是因为它是解决此问题的理想方案,并且之前也曾独立提出过用于解决另一个问题。

https://review.openstack.org/#/c/242602/

数据模型影响

block_device_mapping将添加一个uuid字段,该字段将允许为空。

Python代码将被更新,以便

  • 新的BDM对象总是使用uuid创建。

  • 没有uuid的BDM对象在读取或写入时会自动分配一个,对调用者透明。自动uuid分配将被编写成不会与在其他地方对同一BDM的自动uuid分配产生竞争。

在所有api和conductor节点升级后运行的在线迁移将批量填充数据库中所有空的uuid字段。

在下一个发布周期早期,我们应该为uuid字段添加非空约束,并删除处理数据库中空uuid字段的python代码。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

此更改将向block_device_mapping添加一个uuid字段,该字段将默认情况下为所有bdm查询获取。

在此更改之后首次访问任何BDM,无论是读取还是写入,都会遭受额外的数据库UPDATE以添加uuid。

其他部署者影响

开发人员影响

无。

实现

负责人

主要负责人

mbooth@redhat.com

工作项

  • 向block_device_mapping添加uuid字段。

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

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

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

依赖项

无。

测试

单元测试应涵盖

  • 新的BDM创建包含一个uuid。

  • 读取现有的BDM会在缺少时添加一个uuid。

  • 并发读取没有uuid的BDM会产生相同的uuid。

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

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

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

Tempest 测试应涵盖

  • 呈现给虚拟机的本地磁盘具有序列号。

  • 标记的本地磁盘的设备元数据包含呈现给虚拟机的序列号。

文档影响

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

参考资料

无。