linux libvirt kvm enable/disable CPU 指令集

背景

项目运行依赖着 DPDK 程序库
现存至少4类运行环境:

  1. 功能开发环境 – 指令集完备 虚拟环境
  2. 功能测试环境 – 老旧的CPU 缺少AES,AVX2,AVX512等相关指令
  3. 性能测试环境 – 志强银牌CPU
  4. 项目运行环境 – ACTA刀片

出现的问题:
功能开发环境 编译出来的程序, 测试人员此时只想测试其某个功能, 手头仅有老旧的设备。 没有最新的志强CPU可以使用。

DPDK的编译选项里, 虽然可以禁用某些 CPU 特性,
但是 ACL 模块的编译不受限制,

我们当然知道可以通过手动修改完成目的,
但是要修改多少处代码呢?
又怎么维护这些修改项呢?
别人是否认同这种做法呢?

最简单的做法,将整个项目, 在一台非常老旧的机器上编译。
结果是: 这种2008年之前的机器, 特别难找!!!

还好, 强大的虚拟机再一次的发挥了至关重要的能力!

KVM 虚拟机可以通过 启用/禁用相关指令集。
VMware 里我只看到了 XV-T 指令集的 控制,其他的没有找到。
KVM 可以控制各种 特种的指令集。

  1. disable 禁用相关指令集
  2. require 启用相关指令集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
关闭目标虚拟机
root@debian:~# virsh destroy XXXXXXXXXX

更改指令集
root@debian:~# vim /etc/libvirt/qemu/XXXXXXXXXX.xml
<cpu mode='host-passthrough' check='none' migratable='on'>
<topology sockets='1' dies='1' cores='1' threads='1'/>
<feature policy='disable' name='abm'/>
<feature policy='disable' name='aes'/>
<feature policy='disable' name='arat'/>
<feature policy='disable' name='avx'/>
<feature policy='disable' name='avx2'/>
<feature policy='disable' name='bmi1'/>
<feature policy='disable' name='bmi2'/>
<feature policy='disable' name='erms'/>
<feature policy='disable' name='f16c'/>
<feature policy='disable' name='fma'/>
<feature policy='disable' name='fsgsbase'/>
<feature policy='disable' name='invpcid'/>
<feature policy='disable' name='movbe'/>
<feature policy='disable' name='pcid'/>
<feature policy='disable' name='pdpe1gb'/>
<feature policy='disable' name='popcnt'/>
<feature policy='disable' name='rdrand'/>
<feature policy='disable' name='rdtscp'/>
<feature policy='disable' name='smep'/>
<feature policy='disable' name='tsc_adjust'/>
<feature policy='disable' name='x2apic'/>
<feature policy='disable' name='xsave'/>
<feature policy='disable' name='xsaveopt'/>
</cpu>

保存退出

更新配置文件
root@debian:~# virsh define /etc/libvirt/qemu/blog.xml

开启目标虚拟机
root@debian:~# virsh start XXXXXXXXXX

无法控制的指令

也存在这相当一部分的指令, 无法控制
原因未明

1
2
3
4
5
6
7
8
9
error: unsupported configuration: unknown CPU feature: sdbg
error: unsupported configuration: unknown CPU feature: sdbg
error: unsupported configuration: unknown CPU feature: shadow_vmcs
error: unsupported configuration: unknown CPU feature: sse4_2
error: unsupported configuration: unknown CPU feature: tsc_offset
error: unsupported configuration: unknown CPU feature: unrestricted_guest
error: unsupported configuration: unknown CPU feature: vapic
error: unsupported configuration: unknown CPU feature: vnmi
error: unsupported configuration: unknown CPU feature: vpid

效果

更改之前

更改之后

已经没有了 AES,AVX指令功能