如何在QEMU-KVM中实现客户机用Shadow Paging、嵌套客户机用EPT的嵌套虚拟化?
实现L1用Shadow Paging、L2用EPT的嵌套虚拟化方案
你要的这种分层内存虚拟化配置是可行的,核心逻辑是宿主机开启EPT和嵌套虚拟化,同时强制L1客户机使用Shadow Paging,但向L1暴露EPT特性,让L1能为L2启用EPT。具体步骤如下:
1. 宿主机层面准备
首先确保宿主机的kvm_intel模块开启嵌套虚拟化和EPT(这是L2能使用EPT的前提,不能全局禁用EPT):
- 临时生效:
modprobe -r kvm_intel modprobe kvm_intel nested=1 ept=1 - 永久生效(重启后保留):
在/etc/modprobe.d/kvm.conf中添加:
然后重启系统或重新加载模块。options kvm_intel nested=1 ept=1
验证配置:
cat /sys/module/kvm_intel/parameters/nested # 输出应为Y cat /sys/module/kvm_intel/parameters/ept # 输出应为Y
2. 启动L1客户机(强制使用Shadow Paging)
启动L1时,通过QEMU的-cpu参数,禁用L1自身使用EPT,但保留EPT特性的暴露,这样L1会用Shadow Paging,同时L1内部的KVM可以为L2启用EPT。
示例QEMU启动命令:
qemu-system-x86_64 \ -enable-kvm \ -cpu host,-ept \ -m 4G \ -hda l1_vm_disk.img \ -smp 2 \ -machine q35
关键参数说明:
-enable-kvm:启用KVM加速-cpu host,-ept:继承宿主机CPU特性,但禁用L1自身使用EPT(强制L1用Shadow Paging),同时EPT作为CPU特性仍会暴露给L1-m/-smp:根据需要分配内存和CPU核心
3. L1客户机配置与启动L2
在L1客户机内部:
- 安装KVM依赖包(如
qemu-kvm、libvirt等) - 加载
kvm_intel模块并开启嵌套和EPT:modprobe -r kvm_intel modprobe kvm_intel nested=1 ept=1 - 启动L2客户机时,使用正常的EPT配置即可,比如:
此时L2会自动使用EPT,因为L1已经暴露了EPT特性且自身开启了ept=1。qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -m 2G \ -hda l2_vm_disk.img
注意事项
- 内核版本要求:建议使用Linux内核4.10以上版本,旧版本可能对这种分层内存虚拟化的支持不完善
- QEMU版本:推荐QEMU 2.12以上,确保
-cpu参数的特性过滤功能正常 - 性能预期:L1用Shadow Paging会带来一定性能损耗,这是该方案的必然代价
内容的提问来源于stack exchange,提问作者CreamBrulee216
相关产品推荐
相关产品推荐

