必须先确认宿主机CPU支持并启用VT-x/AMD-V,再通过cat /sys/module/kvm_intel/parameters/nested(Intel)或cat /sys/module/kvm_amd/parameters/nested(AMD)检查嵌套虚拟化是否启用,返回Y表示已启用;否则需配置modprobe.d、重载模块,并在libvirt XML中显式添加vmx或svm特性。

必须先确认宿主机 CPU 支持并已启用 VT-x/AMD-V,否则所有后续操作都无效。
检查当前嵌套虚拟化是否已启用
直接读取内核模块参数是最可靠的方式。Intel 和 AMD 平台命令不同,别混用:
- Intel:
cat /sys/module/kvm_intel/parameters/nested—— 返回Y表示已启用,N表示未启用 - AMD:
cat /sys/module/kvm_amd/parameters/nested—— 同样只认Y或N
注意:返回 N 不代表硬件不支持,只说明当前内核模块没加载对应参数;也别依赖 kvm-ok 或 egrep -c 'vmx|svm' /proc/cpuinfo,它们只能确认 CPU 有虚拟化能力,不能反映嵌套是否透传给 VM。
启用 kvm-intel 或 kvm-amd 的 nested 参数
核心动作是让内核模块加载时带上 nested=1。关键点不是“加参数”,而是“加对位置、加对时机”:
- 创建配置文件:
/etc/modprobe.d/kvm-nested.conf,内容严格为一行(Intel):options kvm-intel nested=1 ept=1;AMD 则写:options kvm-amd nested=1 npt=1 - 不能只改配置就完事——必须卸载再重载模块:
modprobe -r kvm_intel(或kvm_amd),再modprobe kvm_intel - 如果报错
Module kvm_intel is in use,说明还有运行中的 KVM 虚拟机,先关掉它们,别强行卸载 - 重启后参数会丢失,所以必须把配置文件写进
/etc/modprobe.d/,靠 initramfs 或 systemd 在启动早期加载
验证外层 VM 是否暴露了虚拟化特性
即使宿主机启用了 nested,外层虚拟机默认也不会把 vmx 或 svm 标志暴露给内层 VM。libvirt/QEMU 需显式配置:
- 编辑虚拟机 XML:
virsh edit - 在
段中加入:(Intel)或(AMD) - 不要只加
或改mode='host-passthrough',这些不等于暴露虚拟化扩展 - 改完需
virsh destroy再virsh start,热修改不生效
验证方式:进外层 VM,执行 grep -E 'vmx|svm' /proc/cpuinfo。没输出?说明暴露失败,不是内层 VM 的问题。
常见报错“VT-x is disabled in the BIOS”其实是假阳性
这个错误几乎从不意味着你真要进 BIOS 关闭再打开 VT-x。它实际表示:内层 VM 启动时,CPU 的 IA32_FEATURE_CONTROL MSR 未被正确设置,或外层 VM 没把 vmx 标志写进自己的 CPUID 响应里。
- 宿主机 BIOS 中 VT-x 必须是 Enabled(这是前提),但开启后仍报此错,99% 是上面三步中某一步漏了
- 别信网上“在 VM 设置里勾选‘Enable Nested VT-x’就完事”的说法——QEMU/KVM 没这个图形开关,全靠 XML 配置和内核参数
- Multipass 用户特别注意:它默认用
qemu-system-x86_64启动,但不会自动加-cpu ...,vmx=on,得改/var/snap/multipass/common/data/或换用/config.json libvirt后端
嵌套虚拟化不是开个开关就能跑起来的链路,它是硬件 → 宿主内核 → Hypervisor → 外层 VM → 内层 VM 五层能力叠加。少一层,cat /proc/cpuinfo 里就看不到 vmx,内层 VM 就起不来。











