OSSはアルミニウムの翼で飛ぶ: 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 : 0vendor_id : GenuineIntelcpu family : 6model  : 42model name : Intel(R) Core(TM) i3-2357M CPU @ 1.30GHzstepping : 7microcode : 0x25cpu MHz  : 800.000cache size : 3072 KBphysical id : 0siblings : 4core id  : 0cpu cores : 2apicid  : 0initial apicid : 0fpu  : yesfpu_exception : yescpuid level : 13wp  : yesflags  : 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 : 0vendor_id : GenuineIntelcpu family : 6model  : 15model name : Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHzstepping : 11cpu MHz  : 1297.053cache size : 4096 KBfpu  : yesfpu_exception : yescpuid level : 10wp  : yesflags  : 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_lmbogomips : 2594.10clflush size : 64cache_alignment : 64address sizes : 40 bits physical, 48 bits virtualpower 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が貧弱なのでこれ以上は試していないが、更にネストさせることもできるかもしれない。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中