家里集群混合了英特尔和AMD一共3个系列的处理器,为了迁移和HA兼容性就顺便研究了一下QEMU虚拟化的CPU等配置。
省流
-
单机或同系列CPU选择
host或该系列代号最新版本(如EPYC-Rome-v4)即可。 -
集群选择最旧 CPU 的 x86-64 ABI 兼容等级(如 Broadwell 和 EPYC Milan 集群选择
x86-64-v3)。 -
win7等老系统选择
i440fx,新的系统选择q35,有直通设备打开virtio。 -
SCSI 控制器尽可能选择
VirtIO SCSI single

以下是详细的研究笔记。
CPU配置
在安全从业老哥的文章中,可以窥见,随着时代发展,长寿的 x86-64 架构也经历了多次升级。新的指令集与命令加入显著地提高了运行效率并且增加了不少 CPU 功能。撇去过于古老的 baseline(v1,代表为IvyBridge、3-4代酷睿),较为常见的有 v2-v4 架构。

kvm64 (x86-64-v1): Compatible with Intel CPU >= Pentium 4, AMD CPU >= Phenom.
x86-64-v2: Compatible with Intel CPU >= Nehalem, AMD CPU >= Opteron_G3. Added CPU flags compared to x86-64-v1: +cx16, +lahf-lm, +popcnt, +pni, +sse4.1, +sse4.2, +ssse3.
x86-64-v2-AES: Compatible with Intel CPU >= Westmere, AMD CPU >= Opteron_G4. Added CPU flags compared to x86-64-v2: +aes.
x86-64-v3: Compatible with Intel CPU >= Haswell, AMD CPU >= EPYC. Added CPU flags compared to x86-64-v2-AES: +avx, +avx2, +bmi1, +bmi2, +f16c, +fma, +movbe, +xsave.
x86-64-v4: Compatible with Intel CPU >= Skylake, AMD CPU >= EPYC v4 Genoa. Added CPU flags compared to x86-64-v3: +avx512f, +avx512bw, +avx512cd, +avx512dq, +avx512vl.
在Qemu文档可以快速根据自己的处理器架构查到对应的 x86-64 ABI 兼容版本。或者更简单粗暴地,认为支持 SSE4.2 即支持 v2,支持 AVX2 即支持 v3,支持 AVX512 即支持 v4。也可通过在宿主 Linux 机器上运行一个简单的脚本自动地判断:
1 |
|
在追求最大兼容的情况下,根据得到的 CPU ABI 兼容等级,即可挑选适合自己的虚拟CPU类型了。
当然,在单机运行或硬件统一的时候,也可以直接使用PVE为我们提供的命名类型或特性直通。单机/同型号处理器因为不存在迁移后宿主 CPU 支持指令集不同的问题,可以直接使用 host 取得最大性能。而在集群硬件同代但具体型号有别(如 E5 2686v4 + E5 2690v4)时,则可以采用该架构对应的命名类型。同时为避免硬件漏洞影响虚拟机安全,尽量选择最新的修订版(在 E5v4 的例子里就是 Broadwell-noTSX-IBRS)。

还要注意,有一个常见误区是默认使用已弃用的 kvm64,其实现在默认应该使用较新的 qemu64
BIOS、机型与SCSI控制器
这两都不需要想太多,按需即可。BIOS 引导就使用 SeaBIOS,要 UEFI 引导就使用 OVMF。
老旧的操作系统(如使用 EHCI 的 win7)使用 i440fx,较新的使用 q35 即可。另外,需注意 PCIe直通 功能必须使用 q35。
SCSI 控制器若无特殊情况直接选 VirtIO SCSI Single 即可,根据PVE官方文档,这是性能最佳的选择。