给你的PVE虚拟机自定义CPU模型/型号
通常我们的PVE虚拟机习惯把CPU的类别设置为host模型,这样既能获得与宿主机CPU几乎完全相同的指令集和性能又可以在虚拟机看到的CPU就是宿主机CPU型号。
如何查看虚拟机的CPU有哪些特征和指令集?qm show vmid --pretty
# 查看107虚拟机CPU支持哪些指令集和特征
qm show 107 --pretty
# 以下是截取的部分CPU信息
...
-cpu 'host,hv_ipi,hv_relaxed,hv_reset,hv_runtime,hv_spinlocks=0x1fff,hv_stimer,hv_synic,hv_time,hv_vapic,hv_vpindex,+kvm_pv_eoi,+kvm_pv_unhalt'
...可以看到虚拟机给CPU设置host模型后会有以上特征和指令集。
自定义CPU模型
如果我们想删掉/增加一些特征或者指令集,则可以在PVE上创建一个自定义CPU模型。比如我要创建一个支持"套娃"和隐藏虚拟机特征来绕过某些反作弊机制的游戏:nano /etc/pve/virtual-guest/cpu-models.conf使用nano命令创建以下内容
# Intel处理器
cpu-model: Intel-Gaming
flags -hypervisor;+invtsc;+hv-frequencies;+hv-evmcs;+hv-reenlightenment;+hv-emsr-bitmap;+hv-tlbflush-direct;+vmx;+pcid;+ssbd;+md-clear;+stibp;-vmware-cpuid-freq
phys-bits host
hidden 1
hv-vendor-id intel
reported-model host
# AMD处理器
cpu-model: AMD-Gaming
flags -hypervisor;+invtsc;+hv-frequencies;+hv-reenlightenment;+hv-emsr-bitmap;+hv-tlbflush-direct;+svm;+pcid;+ssbd;-vmware-cpuid-freq
phys-bits host
hidden 1
hv-vendor-id amd
reported-model host语法如下:
cpu-model: 自定义CPU模型名称;flags: CPU的特征或者指令集,+号就是增加,-号就是去除;hidden: 填0|1,是否隐藏虚拟机特征,0否,1是;phys-bits: 填32-64或者host(宿主机本身),可以理解为多少位处理器;hv-vendor-id: 供应商 ID。自定义填写reported-model: 链接CPU模型,例如Skylake-Client-v4|EPYC-Milan-v2|kvm64|host...设置好后,我们在CPU类别处就能看到我们自定义好的CPU模型

如宿主机用的是Intel处理器则用
Intel-Gaming如果用的是AMD处理器则选AMD-Gaming
可以看到我们使用原始
host模型和使用自定义Intel-Gaming模型差别还是挺大的,取消了虚拟机特征和支持套娃在虚拟机跑hyperV,安卓模拟器,docker和玩些不让在虚拟机运行的端游都是没有问题的。自定义CPU型号
如果不想暴露宿主机CPU型号给虚拟机,我们还可以对CPU型号进行随意模拟伪装。先在网上找张CPU-Z图片,比如这张:Intel(R) Core(TM) i9-9900
可以看到i9-9900的family值为6;model值为9E,Stepping值为C。由于我们qemu虚拟机只支持10进制,还需要将model值、Stepping值从16进制转为10进制。转为10进制的model值为:158;转为10进制的Stepping值为:12;
# 将VMID换成自己要模拟的虚拟机ID
qm set <VMID> --args "-global cpu.model-id='Intel(R) Core(TM) i9-9900 @ 3.60GHz' -global cpu.family=6 -global cpu.model=158 -global cpu.stepping=12"
完全CPU欺诈伪装
i9-9900是一颗8核16线程的处理器,上面只是对型号做了更改,并为对核心跟线程进行伪装。如要把核心和线程进行伪装可以使用-smp参数(注意smp参数是真实有效的并非装饰,当然如果你宿主机本身就只有4核4线程,把它设置成8核16线程也只能有4核4线程性能,你逛论坛看到某某IDC严重超售啊,明明买的是8核心的VPS跑分只有单核的性能就是这么来的,真靠北啦)
# 将VMID换成自己要模拟的虚拟机ID
qm set <VMID> --args "-global cpu.model-id='Intel(R) Core(TM) i9-9900 @ 3.60GHz' -global cpu.family=6 -global cpu.model=158 -global cpu.stepping=12 -smp 16,sockets=1,cores=8,threads=2,maxcpus=16"这样你就拥有一颗i9-9900 8核16线程的处理器了:
总结
当然并非一定要创建自定义模型,你可以直接在虚拟机添加args引导参数将CPU的特征和指令集增加/移除,创建自定义模型可以更灵活使用,不需要为每个虚拟机都往args加一堆参数。增加/移除CPU特征对性能损耗肯定是有的这个就自己去测了。