Libvirt硬件策略来自libosinfo¶
https://blueprints.launchpad.net/nova/+spec/libvirt-hardware-policy-from-libosinfo
当启动实例时,Nova需要就如何配置虚拟硬件做出决策。目前,这些决策通常是硬编码的,或者由nova.conf设置驱动,有时也由Glance镜像属性驱动。此功能的目标是允许用户指定客户操作系统类型,然后根据这一事实,使用libosinfo数据库来驱动决策。
问题描述¶
当启动实例时,Nova需要就如何配置虚拟硬件做出决策,以优化客户操作系统的运行。正确的决策不可避免地会因正在运行的操作系统类型而异。对于Linux客户来说正确的决策,对于Windows客户或反之亦然可能是错误的决策。最重要的例子是磁盘和网络设备模型的选择。所有Linux客户都希望使用virtio,因为它提供了迄今为止最佳的性能,但Windows镜像中默认情况下不可用,因此对于它们来说不是一个好的默认设置。第二个例子是BIOS时钟是使用UTC(UNIX首选)还是本地时间(Windows首选)初始化。与时钟相关的是各种定时器策略设置,这些设置控制当hypervisor无法跟上所需的中断注入速率时,行为。Nova的默认设置适用于Linux和Windows,但不适用于某些其他专有操作系统。
虽然可以继续允许通过Glance镜像属性覆盖配置,但这并不是一个特别有吸引力的方法。许多设置都相当底层,因此不是云应用程序应该直接暴露给用户的类型。放置在Glance镜像上的hypervisor特定设置越多,就越难使用一个镜像在多个不同的hypervisor上启动虚拟机。它也给用户带来了记住必须放置在镜像上才能获得最佳操作效果的长期设置列表的负担。
从历史上看,大多数虚拟化应用都倾向于为每个操作系统创建一个硬件默认值数据库。然而,通常每个项目都会尝试重复造轮子,复制彼此的工作,导致大量不完整和不一致的数据库。libosinfo 项目最初是作为一种通用解决方案,供虚拟化应用在配置虚拟机时使用。它提供了一个用户可扩展的数据库,其中包含有关操作系统的信息,包括支持的设备类型、最低资源级别要求、安装介质等。围绕这个数据库的是一个用于查询信息的 C API,通过 GObject Introspection 的魔力,可以供非 C 语言(包括 Python)访问。virt-manager 和 GNOME Boxes 应用正在使用它来配置 KVM 和 Xen 访客,并且 Nova 的 libvirt 驱动程序可以轻松地使用它。
用例¶
核心目标是简化最终用户启动具有针对客户操作系统优化虚拟硬件配置的磁盘镜像的过程。
假设Nova配置为默认使用virtio磁盘和网络设备,从而优化常见Linux客户的性能。但是,在现代Linux中,可以选择使用更好的virtio SCSI驱动程序。目前,用户必须设置诸如
- # glance image-update
–property hw_disk_bus=scsi –property hw_scsi_model=virtio-scsi …其他属性… name-of-my-fedora21-image
如果用户想要运行完全不支持virtio驱动程序的客户,则存在类似的问题
- # glance image-update
–property hw_disk_bus=ide –property hw_nic_model=e1000 …其他属性… name-of-my-windows-xp-image
我们还希望支持每个操作系统的定时器漂移策略设置,并且不希望将它们作为属性公开,因为这会给用户带来更大的负担。例如
- # glance image-update
–property hw_rtc_policy=catchup –property hw_pit_policy=delay …其他属性… name-of-my-random-os-image
有了此功能,在常见情况下,只需将操作系统名称告知Nova就足够了
- # glance image-update
–property os_name=fedora21 name-of-my-fedora-image
项目优先级¶
无。
提议的变更¶
存在一个现有的‘os_type’ glance属性,可用于指示整体操作系统系列(windows与linux与freebsd)。这对于正确配置这些操作系统的不同版本来说太粗略了。例如,Windows XP的正确设置与Windows 2008的正确设置不同。我们的意图是声明对新标准属性‘os_name’的支持。此属性的可接受值将从libosinfo数据库获取,可以是以下属性之一
‘short-id’ - 操作系统的简称,例如fedora21、winxp、freebsd9.3
‘id’ - 操作系统的唯一URI标识符,例如http://fedoraproject.org/fedora/21、http://microsoft.com/win/xp、http://freebsd.org/freebsd/9.3
例如,用户可以设置以下其中一个
‘’’
- # glance image-update
–property os_name=fedora21 name-of-my-fedora-image
- # glance image-update
–property os_name=http://fedoraproject.org/fedora/21 name-of-my-fedora-image
在构建客户配置时,Nova libvirt驱动程序将查找此‘os_name’属性并查询libosinfo数据库以找到操作系统记录。然后它将使用此信息选择默认磁盘总线和网络模型。如果可用,它还将查找时钟和定时器设置,但这需要在libosinfo中进一步开发才能使用。
如果计算主机上未安装libosinfo,则当前的Nova libvirt驱动程序功能将保持不变。
可能需要在‘[libvirt]’部分添加一个新的nova.conf设置,以开启/关闭libosinfo用于硬件配置。这将使云管理员更容易控制行为,而无需更改安装的RPM/软件包。例如
- ‘’’
[libvirt] hardware_config=default|fixed|libosinfo
Where
default - 尝试使用libosinfo,否则回退到固定默认值
fixed - 始终使用固定默认值,即使安装了libosinfo
libosinfo - 始终使用libosinfo,如果未安装则中止
将来,有可能使用libguestfs自动检测磁盘镜像内的操作系统。这将消除设置‘os_name’镜像属性的需要,从而允许人们无需任何特殊配置任务即可获得最佳客户性能。但是,自动检测不在此蓝图的范围内。
备选方案¶
一个替代方案是让 Nova 维护其自己为每个操作系统优选硬件设置的数据库。这是大多数以前的虚拟化应用陷入的陷阱。由于现有操作系统的种类繁多,这会带来巨大的负担。试图重新发明已经基本成型的 libosinfo 轮子是不值得的。
第二种替代方案是让Nova公开Glance镜像属性,用于需要因客户操作系统类型而异的每个虚拟硬件配置方面。这意味着用户需要具备大量关于底层硬件配置的知识,这违背了通用的云范例。记住设置如此多的值也是一项重大负担。
数据模型影响¶
不会进行数据库模式更改。
将定义一个新的标准Glance镜像属性,该属性将存储在现有的数据库表中,应被视为长期支持的设置。
REST API 影响¶
不需要API更改。现有的Glance镜像属性支持足以实现此蓝图的目标。
安全影响¶
由于这只是关于调整虚拟硬件设置的选择,因此不应影响主机/云系统的安全性。
通知影响¶
没有变化。
其他最终用户影响¶
最终用户需要了解‘os_name’ glance属性和libosinfo项目定义的允许值列表。这主要是一项文档任务。
性能影响¶
从广义上讲,OpenStack服务的操作不应受到性能影响。但是,某些客户硬件的选择可能会对hypervisor施加额外的CPU开销。由于用户已经能够直接选择不同的磁盘/网络模型,因此这种潜在的性能影响不是一个新的(或重要的)问题。它属于通过资源利用限制实现客户虚拟机之间强隔离的一般问题空间。
其他部署者影响¶
nova.conf文件下的libvirt组中可能会有一个新的配置选项,以开启/关闭libosinfo用于硬件配置。大多数部署者可以忽略它并将其保留在默认值上,这应该在正常操作中“正确执行”。它存在于强制使用特定策略的覆盖选项中。
部署者可能希望在他们的计算节点上安装libosinfo库,以便允许Nova libvirt驱动程序使用此新功能。如果他们不安装libosinfo库,Nova的操作将与以前的版本相比保持不变。可以使用正常的发行版包管理工具进行安装。预计OpenStack特定的配置工具最终将在云部署期间自动执行此操作。
在私有云部署的情况下,云管理员可能希望提供额外的libosinfo数据库配置文件,以优化其组织使用的任何自定义操作系统。
开发人员影响¶
其他虚拟化驱动程序的维护者可能希望与libosinfo项目合作,以扩展其数据库,使其适用于KVM和Xen以外的更多虚拟化技术。这有可能使其能够在Nova内的其他virt驱动程序中使用。尽管如此,预计非libvirt virt驱动程序至少在短期到中期内会简单地忽略此新功能。
新的‘os_name’属性可能对VMWare有用,VMWare具有一种机制,可以告诉VMWare hypervisor安装在虚拟机中的客户操作系统是什么。这需要定义libosinfo值与VMWare所需值之间的映射,这是一项相当简单的任务。
实现¶
负责人¶
- 主要负责人
vladikr
- 其他贡献者
berrange
工作项¶
集成libosinfo以设置Nova libvirt驱动程序中的默认磁盘/网络设备模型
扩展devstack以安装libosinfo和对象内省包
与libosinfo社区合作,为每个操作系统类型定义时钟和定时器首选项的元数据
扩展Nova libvirt驱动程序以基于libosinfo数据库配置时钟/定时器
依赖项¶
Nova libvirt 驱动程序将获得对 libosinfo 项目/库的可选依赖。这将通过 GObject introspection Python 绑定进行访问。在 Fedora / RHEL 系统上,这将需要安装 ‘libosinfo’ 包以及 ‘pyobject2’ 或 ‘python3-gobject’ 包(是的,同时支持 Python 2 和 3)。其他现代 Linux 发行版也通常提供这些软件包。
请注意,GObject内省框架是在GNOME项目的伞下开发的,但它没有任何直接要求图形桌面基础设施。它是他们的低级gobject库的一部分,现在被许多非桌面相关项目利用。
测试¶
单元测试当然会涵盖新代码。
为了在 Tempest 中进行测试,需要一个 gate 作业,该作业安装了合适的软件包。这可以通过更新 devstack 来安装必要的组件来实现。需要创建一些新的测试来设置新的 glance 镜像属性,然后验证访客虚拟机是否已收到预期的配置更改。
文档影响¶
需要记录新的glance镜像属性。我们可能还希望记录此属性的有效值列表。或者记录用户如何了解libosinfo定义的有效值。