迁移到使用 Libvirt 设备别名

https://blueprints.launchpad.net/nova/+spec/libvirt-dev-alias

目前,我们通过多种方法识别 Libvirt 客户机 XML 中的设备,具体取决于设备类型(至少)。Libvirt 现在提供了一种设备别名机制,我们可以将虚拟客户机设备绑定到一个标识符,以便以稳定且通用的方式查找它们。Nova 应该迁移到使用该机制,这将提高一致性,降低一些复杂性,并解决我们当前策略的一些问题。

问题描述

Nova 当前使用多种方法在 XML 中查找客户机设备,用于附加/分离和其他修改。例如,磁盘设备使用 serial 属性来唯一标识它们。但是,libvirt 和 qemu 不支持在所有磁盘设备类型上设置此属性,这意味着 Nova 无法以通用的方式使用它来查找磁盘设备。此外,如果我们有多个具有相同 MAC 地址的网络接口,使用它作为唯一标识符是不够的。

卷附加示例

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native'/>
  <source dev='/dev/sda' index='5'/>
  <backingStore/>
  <target dev='vdb' bus='virtio'/>
  <serial>ada5af06-300e-4d07-931d-3cc2bff8a8a9</serial>
  <alias name='virtio-disk1'>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

用例

作为开发者,我希望 Nova 能够以稳定且一致的方式管理 libvirt 客户机设备。

作为部署者,我希望 Nova 支持 SCSI LUN 直通,该机制不支持在 libvirt 中设置设备序列号。

提议的变更

Nova 的 libvirt 驱动程序应迁移到使用设备别名机制 [1] 来标识所有可附加或可分离的设备类型。对于卷和网络接口等设备,应使用卷或端口 UUID。对于其他设备,需要一些其他稳定的标识符,该标识符与 Nova 或其他服务数据库中的内容相关联。Libvirt 对别名格式有特定要求,必须遵守。但是,对于大多数使用 UUID 作为主要标识符的设备,我们应该能够将其嵌入到别名中。

这是使用 Nova 指定的别名的上述磁盘示例的外观

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native'/>
  <source dev='/dev/sda' index='5'/>
  <backingStore/>
  <target dev='vdb' bus='virtio'/>
  <serial>ada5af06-300e-4d07-931d-3cc2bff8a8a9</serial>
  <alias name='ua-ada5af06-300e-4d07-931d-3cc2bff8a8a9'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

备选方案

我们可以保留现有配置,并继续不支持不支持使用 serial 的磁盘设备。

我们可以为这些设备类型维护我们自己的数据库映射。

数据模型影响

Nova 自身的数据模型不受此影响,并且此更改仅限于 nova-compute 和 libvirt 驱动程序。但是,我们当前维护的 libvirt XML 数据需要更改(并且现有实例需要迁移)以相应地设置设备别名。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

最终用户当前可以请求基于 SCSI LUN 的磁盘设备映射,但由于我们无法在该配置中指定设备序列号,因此它无法工作。在进行此更改后,现有机制将开始工作。

性能影响

Nova 本身不会产生重大性能影响,尽管通过别名查找设备会更容易且计算量更小。此外,libvirt 提供的通过别名分离例程 [2] 可能比我们当前需要通过生成和提供 XML blob 来分离设备更容易。

其他部署者影响

无。

开发人员影响

在此更改后,libvirt 驱动程序最终会更简单。

升级影响

唯一的升级影响来自于迁移现有的实例 XML 文档以指定设备别名。由于我们可能正在将实例迁移到/从较旧的节点,因此我们应该在一段时间内保留与无别名 XML 的兼容性。

实现

负责人

主要负责人

dansmith

其他贡献者
  • kashyap

  • sean-k-mooney

功能联络人

dansmith

工作项

  • 启用磁盘、接口和 PCI 设备上的设备别名设置和解析

  • 在驱动程序的各个部分实际设置这些设备别名,这些部分创建这些配置

  • 使通过设备特定标识符查找设备的代码优先使用别名,并回退到旧方法

  • 在启动时迁移现有的实例 XML,当缺少设备别名时

依赖项

测试

现有的 devstack 作业应提供足够的覆盖范围,除了将添加的单元和功能覆盖范围外。潜在地启用(并使用)LUN 直通附加机制是有益的,但这有些超出了此工作的范围,该工作的范围只是更改枚举行为。

文档影响

实际上没有太多文档影响,因为这应该对操作员和用户是透明的。

参考资料

历史

修订版

发布名称

描述

2024.1

引入