libvirt的很多配置选项其实是调用了qemu的接口,但也有增加和优化的地方,本文主要总结这些配置选项,当个手册来查询。
按照centos停服前最后一版centos-8.5.2111提供的rpm查看http://mirrors.aliyun.com/centos/8.5.2111/AppStream/aarch64/os/Packages/,两者间的版本对应是
qemu-4.2.0 <===> libvirt-6.0.0
之前遇到过一个bugfix,里面提到两者对应的版本是
qemu-6.0.0 <===> RHEL-8.5 <===> libvirt.6.0.0 (此处有待考证,感觉libvirt应该更高才对)
1991898 – Live migration fails with latest QEMU with migrate_set_speed missing error (redhat.com)
Log In | Red Hat IDPhttps://access.redhat.com/downloads/content/rhel---8/aarch64/7459/libvirt/6.0.0-37.1.module+el8.5.0+13858+39fdc467/aarch64/fd431d51/package
一、CPU配置
1.1使用QEMU/KVM配置CPU型号的两种方法
1.Host passthrough 主机直通 (qemu-system-aarch64 -cpu host)
这会将主机CPU模型特性、模型、步进准确地传递给guest。请注意,如果虚拟化不支持某些主机CPU型号的功能,KVM可能会过滤掉这些功能。
当使用此模式时,实时迁移是不安全的,因为libvirt / QEMU不能保证跨主机向guest暴露稳定的CPU。
这是推荐使用的CPU,前提是不需要实时迁移。
2.Named model 命名模型 (qemu-system-aarch64 -cpu cortex-a57)
QEMU附带了许多预定义的命名CPU模型(qemu-system-aarch64 cpu --help),这些模型通常指的是Intel和AMD发布的特定一代硬件。
这允许guest VM与主机CPU有一定程度的隔离,从而在具有不同硬件的主机之间实现更大的实时迁移灵活性。
在这两种情况下,都可以选择添加或删除单个CPU功能,以更改默认情况下呈现给guest的内容。
-cpu cortex-a57,psi=off,vmx=off
1.2 Libvirt支持三种配置CPU模型的方式
1.Host passthrough:
这种模式的优点是性能高,缺点是guest环境不能在不同的硬件上重现。因此,如果你遇到任何bug,你就只能靠自己了;
如果源主机和目标主机在硬件、QEMU版本、微码版本和配置方面都不相同,则使用host-passthrough迁移是危险的。
1.1)主机直通:
<cpu mode='host-passthrough'/>
1.2)具有自定义功能的主机直通:
<cpu mode='host-passthrough' migratable='off'>
<feature name="vmx" policy="disable"/>
...
</cpu>
2.Custom (Named model):
在这种模式下,cpu元素描述了应该呈现给guest的CPU。这是未指定mode属性时的默认值。
这种模式使得持久guest无论在什么主机上启动都将看到相同的硬件。
2.1)命名型号:
<cpu mode='custom'>
<model name="Westmere"/>
</cpu>
2.2)具有功能自定义的命名模型:
<cpu mode='custom'>
<model name="Westmere"/>
<feature name="pcid" policy="require"/>
...
</cpu>
3.Host model: 【需要迁移的最佳选择】
(qemu的介绍:Libvirt支持第三种配置CPU模型的方式,称为“主机模型”。这使用了QEMU的“命名模型”特性,自动选择一个与主机CPU相似的CPU模型,然后添加额外的特性以尽可能接近主机模型。(属于qemu两种模型的折中优化,支持迁移)
这并不能保证具备和“Host passthrough”一样的功能(如 CPU系列、步进等将与主机CPU精确匹配),但是提供了很多直通的好处,同时使实时迁移安全。)
主机模型模式本质上是从capabilities XML 中复制host CPU 的定义到domain XML。由于CPU定义是在启动域之前复制的,因此可以在不同的主机上使用完全相同的XML,同时仍然提供每个host支持的最佳guest CPU。
Libvirt并没有对每个CPU的各个方面进行建模,因此 guest CPU不会与host CPU完全匹配。
在迁移过程中,完整的CPU模型定义被传输到目标主机,因此即使目标主机包含更多功能的CPU或更新的内核,迁移的guest也会看到与guest运行实例完全相同的CPU模型;但是根据新主机的功能,关闭和重启guest后可能会呈现出不同的硬件。
2.1)主机型号:
<cpu mode='host-model'/>
2.2)具有功能自定义的主机型号:
<cpu mode='host-model'>
<model>xxx</model>
<feature name="vmx" policy="disable"/>
...
</cpu>
4.maximum 额外综合出来的一个选项
当使用硬件虚拟化运行guest时,此CPU模型在功能上与host-passthrough相同;
当运行具有CPU模拟的guest时,此CPU模型将启用模拟引擎能够支持的最大功能集。请注意,即使使用migratable='on',迁移也是危险的。
如果应用程序不关心具体的CPU,只是想要最佳的功能集而且不需要迁移兼容性,那么maximum模型是一个很好的选择。
4.1)最大模型:
<cpu mode='maximum'/>
2.2)具有功能自定义的最大模型:
<cpu mode='maximum' migratable='off'>
<cache mode='passthrough'/>
<feature policy='disable' name='lahf_lm'/>
...
</cpu>
1.3官网参考
https://qemu-project.gitlab.io/qemu/system/qemu-cpu-models.html
https://libvirt.org/formatdomain.html#cpu-model-and-topology