本文測試物理機為centos6.5
物理機使用Intel-V虛擬化架構,安裝qemu-kvm版本0.12
我們知道,在Intel處理器上,KVM使用Intel的vmx(virtul machine eXtensions)來提高虛擬機性能, 即硬件輔助虛擬化技術, 現在如果我們需要測試一個openstack集群,又或者單純的需要多台具備"vmx"支持的主機, 但是又沒有太多物理服務器可使用, 如果我們的虛擬機能夠和物理機一樣支持"vmx",那么問題就解決了,而正常情況下,一台虛擬機無法使自己成為一個hypervisors並在其上再次安裝虛擬機,因為這些虛擬機並不支持"vmx"
嵌套式虛擬nested是一個可通過內核參數來啟用的功能。它能夠使一台虛擬機具有物理機CPU特性,支持vmx或者svm(AMD)硬件虛擬化,關於nested的具體介紹,可以看這里
1.首先查看一台普通的KVM虛擬機CPU信息
[root@localhost ~]# lscpu Architecture: x86_64 ... Vendor ID: GenuineIntel Hypervisor vendor: KVM Virtualization type: full ... [root@localhost ~]# cat /pro/cpuinfo processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 13 model name : QEMU Virtual CPU version (cpu64-rhel6) ... flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm unfair_spinlock pni cx16 hypervisor lahf_lm
可以看到,這個虛擬機使用為全虛擬化,使用的CPU為QEMU模擬出來的CPU,並且不支持硬件虛擬化(flags中沒有vmx)
2.物理服務器上開啟nested支持
要使物理機內核支持nested,第一步需要升級系統內核到Linux 3.X版本,第二步要為內核添加新的引導參數
默認情況下,系統並不支持nested
#查看當前系統是否支持nested
systool -m kvm_intel -v | grep -i nested
nested = "N" #或者這樣查看 cat /sys/module/kvm_intel/parameters/nested N
第一步升級內核,用3.18內核做測試,升級內核很簡單,下載編譯好的內核rpm包,這里是下載地址,安裝,然后修改grub.conf默認引導內核為新內核
第二步添加引導參數同樣很簡單,只需要在 kernel 那一行的末端加上 "kvm-intel.nested=1"
#升級內核 rpm -ivh kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm #修改grub.conf default=0 #使用新內核 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (3.18.3-1.el6.elrepo.x86_64) root (hd0,0) kernel /vmlinuz-3.18.3-1.el6.elrepo.x86_64 ro root=UUID=9c1afc64-f751-473c-aaa6-9161fff08f6f rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcy rheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet kvm-intel.nested=1
...
上面修改之后,重啟系統,用"uname -r"查看系統內核,並檢查nested是否支持
3. 建立一台支持"vmx"的虛擬機
如果你使用libvirt管理虛擬機,需要修改虛擬機xml文件中CPU的定義,下面三種定義都可以
#可以使用這種 <cpu mode='custom' match='exact'> <model fallback='allow'>core2duo</model> <feature policy='require' name='vmx'/> </cpu> #這種方式為虛擬機定義需要模擬的CPU類型"core2duo",並且為虛擬機添加"vmx"特性
#也可以使用這種 <cpu mode='host-model'> <model fallback='allow'/> </cpu>
#或者這樣 <cpu mode='host-passthrough'> <topology sockets='2' cores='2' threads='2'/> </cpu>
#CPU穿透,在虛擬機中看到的vcpu將會與物理機的CPU同樣配置,這種方式缺點在於如果要對虛擬機遷移,遷移的目的服務器硬件配置必須與當前物理機一樣
如果你使用qemu-kvm命令行啟動虛擬機,那么可以簡單的添加
-enable-kvm -cpu qemu64,+vmx
#設置虛擬機CPU為qemu64型號,添加vmx支持
然后啟動虛擬機,查看配置
#下面虛擬機CPU定義為"host-model"
cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 26 model name : Intel Core i7 9xx (Nehalem Class Core i7)
... wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc unfair_spinlock pni vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic ...
本文出自http://www.cnblogs.com/jython/p/4458807.html,轉載請注明出處
參考文章
http://kashyapc.com/2012/01/14/nested-virtualization-with-kvm-intel/
http://networkstatic.net/nested-kvm-hypervisor-support/