目前公司的測(cè)試環(huán)境使用Proxmox VE(PVE),PVE虛擬出來(lái)的主機(jī)CPU默認(rèn)不支持vmx,即不支持嵌套虛擬化,在虛擬機(jī)中使用egrep “vmx|svm” /proc/cpuinfo驗(yàn)證,無(wú)輸出,那么如何讓他支持呢?其實(shí)PVE的內(nèi)核還是采用了KVM+Qemu的方式模擬,那么參照如何讓KVM支持嵌套虛擬化的方法操作,開(kāi)啟nested即可
nested是一個(gè)可通過(guò)內(nèi)核參數(shù)來(lái)啟用的功能。它能夠使一臺(tái)虛擬機(jī)具有物理機(jī)CPU特性,支持vmx或者svm(AMD)硬件虛擬化。Proxmox VE是運(yùn)行于Debian操作系統(tǒng)上的,也是支持嵌套式虛擬nested的,但默認(rèn)情況下并未開(kāi)啟。開(kāi)啟nested很容易,我們可以通過(guò)命令檢驗(yàn)嵌套虛擬化功能是否已被開(kāi)啟(實(shí)驗(yàn)環(huán)境,PVE4.4):
cat /sys/module/kvm_intel/parameters/nested
N
可見(jiàn)默認(rèn)狀態(tài)下是未開(kāi)啟的,下面讓我們來(lái)打開(kāi)嵌套虛擬化,首先需要關(guān)閉所有虛擬機(jī)
列出所有虛擬機(jī):
qm list
關(guān)閉虛擬機(jī):
qm stop <vmid>
以上操作也可以在PVE網(wǎng)頁(yè)控制臺(tái)操作
開(kāi)啟內(nèi)核支持:
modprobe -r kvm_intel
modprobe kvm_intel nested=1
執(zhí)行modprobe -r kvm_intel時(shí)如果報(bào)錯(cuò)Module kvm_intel is in use,請(qǐng)檢查你的虛擬機(jī)是否全部關(guān)閉
現(xiàn)在再看看nested是否已開(kāi)啟:
cat /sys/module/kvm_intel/parameters/nested
Y
編輯配置文件:
echo “options kvm_intel nested=1” >> /etc/modprobe.d/modprobe.conf
這樣系統(tǒng)重啟也會(huì)自動(dòng)加載netsted
查看虛擬機(jī)啟動(dòng)命令行,下面以我的環(huán)境中vmid為100的虛擬機(jī)為列:
# 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,表示開(kāi)啟vmx
-cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,+vmx,enforce
關(guān)閉虛擬機(jī):
qm stop 100
重新啟動(dòng)虛擬機(jī):
/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
列出虛擬機(jī):
qm list
發(fā)現(xiàn)vmid為100的虛擬機(jī)狀態(tài)已變更為running
進(jìn)入該虛擬機(jī),使用命令驗(yàn)證是否已開(kāi)啟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中開(kāi)啟了嵌套虛擬化。