首頁 > 軟體

KVM虛擬化之巢狀虛擬化nested

2020-06-16 18:00:56

本文測試物理機為CentOS 6.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
...

--------------------------------------分割線 --------------------------------------


IT145.com E-mail:sddin#qq.com