何が嬉しいかというと、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が無いみたいなの言われて動かせなかったんですが、 の追加したら動きました。
参考になりました。
コメントを投稿