2012年2月12日日曜日

KVM on KVM(nested KVM)


このエントリーをはてなブックマークに追加


KVMの上でKVMを起動する方法。

何が嬉しいかというと、OpenStackやWakameのような仮想マシンを管理するIaaSソフトウェアのテストが捗る。

少し前まではAMD CPUでないと出来なかったりとか、カーネルにパッチを当てないとダメだったが、Kernel3.2以降はIntel CPUでも利用できるようになっており、標準機能としても取り込まれている。

以下ではSL6(guest) on SL6(nested kvm guest) on Fedora16(kvm host)を稼働させている。


はじめに

今回テストした環境は以下

# cat /etc/redhat-release
Fedora release 16 (Verne)

# uname -a
Linux f16-x121e.sol-net.jp 3.2.5-3.fc16.x86_64 #1 SMP Thu Feb 9 01:24:38 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 42
model name : Intel(R) Core(TM) i3-2357M CPU @ 1.30GHz
stepping : 7
microcode : 0x25
cpu MHz  : 800.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id  : 0
cpu cores : 2
apicid  : 0
initial apicid : 0
fpu  : yes
fpu_exception : yes
cpuid level : 13
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx lahf_lm arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid

準備

まず最初に、kvm_intelのnestedを有効にしてロードする。

# modinfo kvm_intel |grep nested
parm:           nested:bool

最初は有効になっていない。
# cat /sys/module/kvm_intel/parameters/nested
N

設定を追加
# vim /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1

モジュールをアンロード&ロードして有効化する。

# modprobe -r kvm_intel
# modprobe kvm_intel
# cat /sys/module/kvm_intel/parameters/nested
Y


仮想マシンの作成

仮想マシンの作成は普通に実施(今回はvirt-managerから)。SL6.2 RC2を使用。
/usr/bin/qemu-kvm -S -M pc-0.14 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1
 -name sl-nested-kvm -uuid 89dcce12-a0a1-a3a7-14b7-bf1e9ed4af0b
 -nodefconfig -nodefaults
 -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/sl-nested-kvm.monitor,server,nowait
 -mon chardev=charmonitor,id=monitor,mode=control
 -rtc base=utc -no-reboot -kernel /var/lib/libvirt/boot/virtinst-vmlinuz.DCX7LU
 -initrd /var/lib/libvirt/boot/virtinst-initrd.img.sLqHgQ
 -append method=http://ftp.jaist.ac.jp/pub/Linux/scientific/6.2/x86_64/os/
 -drive file=/var/lib/libvirt/images/sl62.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=writeback
 -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0
 -netdev tap,fd=24,id=hostnet0,vhost=on,vhostfd=25
 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:e9:a9:5b,bus=pci.0,addr=0x3
 -chardev pty,id=charserial0
 -device isa-serial,chardev=charserial0,id=serial0
 -usb
 -device usb-tablet,id=input0
 -vnc 127.0.0.1:0
 -vga cirrus -device intel-hda,id=sound0,bus=pci.0,addr=0x4
 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6

仮想マシンを停止してCPU機能を編集
# vim /etc/libvirt/qemu/sl-nested-kvm.xml
以下を追記
<cpu match='exact'>
    <model>Nehalem</model>
    <vendor>Intel</vendor>
    <feature policy='require' name='tm2'/>
    <feature policy='require' name='est'/>
    <feature policy='require' name='monitor'/>
    <feature policy='require' name='ss'/>
    <feature policy='require' name='vme'/>
    <feature policy='require' name='rdtscp'/>
    <feature policy='require' name='ht'/>
    <feature policy='require' name='ds'/>
    <feature policy='require' name='pbe'/>
    <feature policy='require' name='tm'/>
    <feature policy='require' name='vmx'/>
    <feature policy='require' name='ds_cpl'/>
    <feature policy='require' name='xtpr'/>
    <feature policy='require' name='acpi'/>
    <feature policy='require' name='x2apic'/>
  </cpu>

この編集はF16の場合、virt-mangerのProcessorからも可能。「ホストCPUのコピー設定」で一括設定可能。

*CPUの設定はcore2duo + vmx だけでOKっぽい。

仮想マシンを起動するとvmxが有効になっていることが確認できる。
nested-guest# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 15
model name : Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz
stepping : 11
cpu MHz  : 1297.053
cache size : 4096 KB
fpu  : yes
fpu_exception : yes
cpuid level : 10
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc up unfair_spinlock pni vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm
bogomips : 2594.10
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:


この時のゲスト起動オプションは以下
/usr/bin/qemu-kvm -S -M pc-0.14
 -cpu core2duo,+lahf_lm,+rdtscp,+popcnt,+x2apic,+sse4.2,+sse4.1,+xtpr,+cx16,+tm2,+est,+vmx,+ds_cpl,+pbe,+tm,+ht,+ss,+acpi,+ds
 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1
 -name sl-nested-kvm -uuid 89dcce12-a0a1-a3a7-14b7-bf1e9ed4af0b -nodefconfig
 -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/sl-nested-kvm.monitor,server,nowait
 -mon chardev=charmonitor,id=monitor,mode=control
 -rtc base=utc
 -drive file=/var/lib/libvirt/images/sl62.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=writeback
 -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1
 -netdev tap,fd=24,id=hostnet0,vhost=on,vhostfd=25
 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:e9:a9:5b,bus=pci.0,addr=0x3
 -chardev pty,id=charserial0
 -device isa-serial,chardev=charserial0,id=serial0
 -usb
 -device usb-tablet,id=input0
 -vnc 127.0.0.1:0 -vga cirrus
 -device intel-hda,id=sound0,bus=pci.0,addr=0x4
 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6


実際にゲスト上でKVM仮想マシンを作成する

nested-guest# yum install qemu-kvm libvirt virt-manager
nested-guest# reboot
nested-guest# lsmod |grep kvm
kvm_intel              50380  0 
kvm                   305113  1 kvm_intel

KVMをインストールしたら後は普通にゲストをインストールすればよい。



CPUが貧弱なのでこれ以上は試していないが、更にネストさせることもできるかもしれない。

1 件のコメント:

匿名 さんのコメント...

enable-nestingが無いみたいなの言われて動かせなかったんですが、 の追加したら動きました。
参考になりました。

コメントを投稿