VMwarePlayer+Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(2)

はじめに

前回KVM Host を用意したところまでで終わったので、今回は KVM Guest (KVM用語だとdomain)をたてるところから。

上の図の ofvm01-04 を作っていくあたりです。

libvirtKVM 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 指定でインストールして大丈夫なはず。
  • 各所サンプル見てると --vnc 系のオプションで VNC 設定書いてあることが多いけど、--graphics 使えって man みるとかいてあるのでそちらに。
    • 日本語キーボード使用している場合、keymap=ja を指定しないと非常に面倒なので要注意。
    • 実行すると、指定したポートでVNC接続すると跡は普通にインストール作業に入れる。VNC Client は TigerVNC がシンプルで使いやすい。

実行してみる

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

ドメイン定義(XML)の確認は 'virsh dumpxml' とか。コマンドはかなりあるので参考資料を参照。

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 の設定が必要です。

--- 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 ^]

おわりに

今回は KVM + libvirt をつかって仮想マシンをつくって OVS に接続するというところまでです。
とりあえず OVS 単体の環境で…。複数 OVS 起動して相互接続させるとかできると思うんだけどやり方がまだ調べ切れてないので今後の課題です。次は Controller をたてて OVS を OpenFlow でコントロールしてみるところをやります。