VMwarePlayer+Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(2)
はじめに
前回は KVM Host を用意したところまでで終わったので、今回は KVM Guest (KVM用語だとdomain)をたてるところから。
上の図の ofvm01-04 を作っていくあたりです。
libvirt で KVM Guest (domain) をつくる
qemu のコマンドでベタに作る方法とかもやったけど、正直面倒なので、libvirt 使う方向で。
インストールには virt-install
コマンドを使う。オプション指定が面倒なのでスクリプトを作る。
#!/bin/sh VINST=/usr/bin/virt-install NUM='01' NAME=ofvm${NUM} ISO=/home/stereocat/iso/ubuntu-12.04.1-server-amd64.iso DISK=/home/stereocat/virt-vmimages/${NAME}.img DISKSIZE=5 MEM=512 MAC="54:52:00:00:00:${NUM}" VNCPORT=59${NUM} echo "install domain:${NAME}, VNC=tcp/${VNCPORT}" if [ ! -e $DISK ] then /usr/bin/qemu-img create -f qcow2 $DISK ${DISKSIZE}G fi sudo $VINST \ -connect=qemu:///system \ --name=$NAME \ --cdrom=$ISO \ --ram=$MEM \ --disk path=$DISK,size=$DISKSIZE,format=qcow2 \ --vcpus=1 \ --network bridge=br0,mac=$MAC \ --os-type=linux \ --hvm \ --virt-type=kvm \ --graphics vnc,port=$VNCPORT,listen=0.0.0.0,keymap=ja
- ISO: Ubuntu 12.04 (64bit) の iso image からインストール
- DISK: 保存ディレクトリは適当…。なければ自動で作る。
- MAC: '54:52:00' は QEMU でリザーブされているそうだ。と思って調べてみたけど、standards.ieee.org の oui.txt には載ってないみたい。
- ネットワーク設定は本とかだと
--network network=default
で書いてあることが多いけど、OVS いれてて、libvirt default は消してしまっている (virsh net-destroy default
した) のでbr0
を明示する。- OVS 利用に KVM Guest (domain) どうつなぐかについては libvirt: Domain XML format を参考に。OVS をサポートしている場合
を使う、という話が書いてありますが、今回は OVS の Linux bridge compatibility を有効にしている (BRCOMPAT=yes
) ので、普通に bridge 指定でインストールして大丈夫なはず。
- OVS 利用に KVM Guest (domain) どうつなぐかについては libvirt: Domain XML format を参考に。OVS をサポートしている場合
- 各所サンプル見てると
--vnc
系のオプションで VNC 設定書いてあることが多いけど、--graphics
使えって man みるとかいてあるのでそちらに。
実行してみる
stereocat@oftest01:~$ ./virt-install.sh install domain:ofvm01, VNC=tcp/5901 Formatting '/home/stereocat/virt-vmimages/ofvm01.img', fmt=qcow2 size=5368709120 encryption=off clus ter_size=65536 Starting install... Creating domain... | 0 B 00:00 WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt -viewer' package. Domain installation still in progress. You can reconnect to the console to complete the installation process. stereocat@oftest01:~$
virt-viewer
がないって言われてるけど特に使ってないので放置。
確認
stereocat@oftest01:~$ sudo virsh virsh # list --all Id Name State ---------------------------------- - ofvm01 shut off virsh # dominfo ofvm01 Id: - Name: ofvm01 UUID: 1b4edc02-ce2e-71e9-f7f6-40ed3c602303 OS Type: hvm State: shut off CPU(s): 1 Max memory: 524288 kB Used memory: 524288 kB Persistent: yes Autostart: disable Managed save: no Security model: apparmor Security DOI: 0 virsh #
OVS側で見てみる。vnet0
でつながっている。
stereocat@oftest01:~$ sudo ovs-vsctl show 73ffb051-5d54-4226-bebf-d180b32debda Bridge "br0" Port "eth1" Interface "eth1" Port "vnet0" Interface "vnet0" Port "br0" Interface "br0" type: internal ovs_version: "1.4.0+build0" stereocat@oftest01:~$
KVM Guest (domain) 設定の編集
あとからパラメタ変えたいときは virsh edit で XML ファイルをいじる。MAC指定間違えたとかVNCポート変えたいとか。
virsh # edit ofvm01
KVM Guest (domain) の複製
あとは仮想マシンを量産していけばいい。ただいちいちインストールするのも時間がかかって面倒なので、いったん作ったイメージを使い回してみる。
#!/bin/sh VINST=/usr/bin/virt-install NUM='02' NAME=ofvm${NUM} ORIG_DISK=/home/stereocat/virt-vmimages/ofvm01.img DISK=/home/stereocat/virt-vmimages/${NAME}.img MEM=512 MAC="54:52:00:00:00:${NUM}" VNCPORT=59${NUM} echo "import domain:${NAME}, VNC=tcp/${VNCPORT}, from:${ORIG_DISK}" if [ ! -e $DISK ] then echo "copy disk image $ORIG_DISK to $DISK" sudo cp $ORIG_DISK $DISK fi sudo $VINST \ --import \ --force \ --name=$NAME \ --ram=$MEM \ --vcpus=1 \ --disk path=$DISK,format=qcow2 \ --os-variant=ubuntuprecise \ --accelerate \ --network bridge=br0,mac=$MAC \ --graphics vnc,port=$VNCPORT,listen=0.0.0.0,keymap=ja
インストール用のスクリプトとほぼ同じなので気をつけるところはそれほどないかな…。--os-variant
とかインポートするOSに応じて設定が必要というとこくらいか。設定する値については virt-install(1) 参照。
元のイメージをそのままコピーして起動するので、IPとホスト名は起動後に変更が必要。Ubuntu の場合、/etc/hosts
, /etc/hostname
, /etc/network/interfaces
を変更してやればよい。
KVM Host から Guest の console にアクセスする。
KVM Host から virsh console
で KVM Guest (domain) の console に接続することができます。が、これは Guest 側で GRUB の設定が必要です。
- /etc/default/grub
--- grub.orig 2013-01-13 13:40:40.482796975 +0900 +++ grub 2013-01-13 13:42:10.498795498 +0900 @@ -9,7 +9,7 @@ GRUB_TIMEOUT=2 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="" -GRUB_CMDLINE_LINUX="" +GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0" # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains
変更したら update-grub
で /boot
下のファイルを更新します。
stereocat@ofvm01:/etc/default$ sudo update-grub Generating grub.cfg ... Found linux image: /boot/vmlinuz-3.2.0-29-generic Found initrd image: /boot/initrd.img-3.2.0-29-generic Found memtest86+ image: /memtest86+.bin done stereocat@ofvm01:/etc/default$
あとは TTY の設定も。
- /etc/init/ttyS0.conf
# ttyS0 start on stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -8 115200 ttyS0 vt102
再起動後、virsh console
でドメインに接続すると KVM ホスト側からドメインのコンソールにアクセスできるようになります。コンソールから抜ける場合は ^]
(Ctrl-]
) です。
virsh # console ofvm01 Connected to domain ofvm01 Escape character is ^]