目前公司的測試環境使用Proxmox VE(PVE),PVE虛擬出來的主機CPU默認不支持vmx,即不支持嵌套虛擬化,在虛擬機中使用egrep “vmx|svm” /proc/cpuinfo驗證,無輸出,那么如何讓他支持呢?其實PVE的內核還是采用了KVM+Qemu的方式模擬,那么參照如何讓KVM支持嵌套虛擬化的方法操作,開啟nested即可
nested是一個可通過內核參數來啟用的功能。它能夠使一臺虛擬機具有物理機CPU特性,支持vmx或者svm(AMD)硬件虛擬化。Proxmox VE是運行于Debian操作系統上的,也是支持嵌套式虛擬nested的,但默認情況下并未開啟。開啟nested很容易,我們可以通過命令檢驗嵌套虛擬化功能是否已被開啟(實驗環境,PVE4.4):
cat /sys/module/kvm_intel/parameters/nested
N
可見默認狀態下是未開啟的,下面讓我們來打開嵌套虛擬化,首先需要關閉所有虛擬機
列出所有虛擬機:
qm list
關閉虛擬機:
qm stop <vmid>
以上操作也可以在PVE網頁控制臺操作
開啟內核支持:
modprobe -r kvm_intel
modprobe kvm_intel nested=1
執行modprobe -r kvm_intel時如果報錯Module kvm_intel is in use,請檢查你的虛擬機是否全部關閉
現在再看看nested是否已開啟:
cat /sys/module/kvm_intel/parameters/nested
Y
編輯配置文件:
echo “options kvm_intel nested=1” >> /etc/modprobe.d/modprobe.conf
這樣系統重啟也會自動加載netsted
查看虛擬機啟動命令行,下面以我的環境中vmid為100的虛擬機為列:
# qm showcmd 100
/usr/bin/kvm -id 100 -chardev socket,id=qmp,path=/var/run/qemu-server/100.qmp,server,nowait -mon chardev=qmp,mode=control -pidfile /var/run/qemu-server/100.pid -daemonize -smbios type=1,uuid=a1f4fefc-3d14-41c7-aeb1-bf9b79ef03df -name ops-test-172.16.30.20 -smp 2,sockets=1,cores=2,maxcpus=2 -nodefaults -boot menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg -vga cirrus -vnc unix:/var/run/qemu-server/100.vnc,x509,password -cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,enforce -m 4096 -k en-us -device pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e -device pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device usb-tablet,id=tablet,bus=uhci.0,port=1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 -iscsi initiator-name=iqn.1993-08.org.debian:01:6775cf970ba -drive file=/var/lib/vz/template/iso/CentOS-7-x86_64-DVD-1611.iso,if=none,id=drive-ide2,media=cdrom,aio=threads -device ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=200 -device virtio-scsi-pci,id=scsihw0,bus=pci.0,addr=0x5 -drive file=/dev/pve/vm-100-disk-1,if=none,id=drive-scsi0,format=raw,cache=none,aio=native,detect-zeroes=on -device scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=100 -netdev type=tap,id=net0,ifname=tap100i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown,vhost=on -device virtio-net-pci,mac=D2:15:25:81:73:BD,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300
找到-cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,enforce
在后面加上+vmx,表示開啟vmx
-cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,+vmx,enforce
關閉虛擬機:
qm stop 100
重新啟動虛擬機:
/usr/bin/kvm -id 100 -chardev socket,id=qmp,path=/var/run/qemu-server/100.qmp,server,nowait -mon chardev=qmp,mode=control -pidfile /var/run/qemu-server/100.pid -daemonize -smbios type=1,uuid=a1f4fefc-3d14-41c7-aeb1-bf9b79ef03df -name ops-test-172.16.30.20 -smp 2,sockets=1,cores=2,maxcpus=2 -nodefaults -boot menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg -vga cirrus -vnc unix:/var/run/qemu-server/100.vnc,x509,password -cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,+vmx,enforce -m 4096 -k en-us -device pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e -device pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device usb-tablet,id=tablet,bus=uhci.0,port=1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 -iscsi initiator-name=iqn.1993-08.org.debian:01:6775cf970ba -drive file=/var/lib/vz/template/iso/CentOS-7-x86_64-DVD-1611.iso,if=none,id=drive-ide2,media=cdrom,aio=threads -device ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=200 -device virtio-scsi-pci,id=scsihw0,bus=pci.0,addr=0x5 -drive file=/dev/pve/vm-100-disk-1,if=none,id=drive-scsi0,format=raw,cache=none,aio=native,detect-zeroes=on -device scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=100 -netdev type=tap,id=net0,ifname=tap100i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown,vhost=on -device virtio-net-pci,mac=D2:15:25:81:73:BD,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300
列出虛擬機:
qm list
發現vmid為100的虛擬機狀態已變更為running
進入該虛擬機,使用命令驗證是否已開啟vmx:
#egrep “vmx|svm” /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl pni vmx cx16 x2apic hypervisor lahf_lm tpr_shadow vnmi flexpriority ept vpid
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl pni vmx cx16 x2apic hypervisor lahf_lm tpr_shadow vnmi flexpriority ept vpid
至此,成功在PVE中開啟了嵌套虛擬化。