1. 程式人生 > >讓Proxmox VE支援巢狀虛擬化

讓Proxmox VE支援巢狀虛擬化

目前公司的測試環境使用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的虛擬機器為列:

找到-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中開啟了巢狀虛擬化。