仮想化
一時期は xen がもてはやされていたが,開発の流れの問題で linux 関係はほとんど kvm に流れてしまった模様.(2010/01)
% qemu-img(kvm-img) create -f qcow2 hoge.img 20G -f: 仮想イメージのフォーマット選択.qcow2 は qemu で使われているものの模様.
ex) ubuntu-vm-builder kvm jaunty -o -v --dest=test1 --domain test1 --arch amd64 \ --hostname test1 --mem 512 --ip 203.143.124.182 --mask 255.255.255.248 \ --gw 203.143.124.177 --dns 203.143.124.177 --libvirt qemu:///system \ --addpkg openssh-server --user='test' --pass='hogehoge'
kvm -hda hoge.img -cdrom installer.iso -boot d -m 512 -monitor stdio (単純に X を飛ばす場合) kvm -hda hoge.img -cdrom installer.iso -boot d -m 512 -monitor stdio -vnc 112.78.193.181:0 (vnc 接続する場合)
ゲスト OS の管理には複数の方法が考えられる.
1. の ssh のみは,ネットワークの設定がうまく行っている時のみ利用可能なため,OS 管理には不向き. 2. のシリアルコンソールは有力だが,シリアルコンソールを static にゲストOSに割り当てないといけないため少々固定的. 3. の vnc も2. と同様に IP/port を割り当てておかなければならないため固定的. 4. の場合,virsh console <vm 名>などとできるため,楽な気がする.
注意:virsh のバージョンは 0.65 が現状(2010/01) 一番良い.新しすぎると 後述の serial console の設定がうまく動作しない.古いと xmldom-… の コマンドがない.
--without-xen --without-sasl
% cat kvm.sh kvm -hda /hoge/foo/lucid.img -boot c -m 512 -vnc 1.1.1.1:0 -serial pty
% virsh domxml-from-native qemu-argv kvm.sh > hoge.xml
<domain type='kvm'> <name>testvm</name> <uuid>746bb0d2-026f-fdd7-06ea-2a170cdefdcf</uuid> <memory>524288</memory> <currentMemory>524288</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <pae/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <source file='/home/skk/kvmtest/lucid.img'/> <target dev='hda' bus='ide'/> </disk> <console type='pts'> <target port='0'> </console> <interface type='ethernet'> <mac address='52:54:00:bc:55:76'/> <script path='/etc/kvm/kvm-ifup'/> <target dev='tap1'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='5900' autoport='no' listen='1.1.1.1'/> <video> <model type='cirrus' vram='9216' heads='1'/> </video> </devices> </domain>
# virsh define hoge.xml
起動 | # virsh start testvm |
表示 | # virsh list –all |
コンソール接続 | # virsh console <id> *ゲストOS側でシリアルコンソールの設定が必要 |
シリアルコンソール番号取得 | # virsh ttyconsole <id> |
終了 | # virsh shutdown <id> |
強制終了 | # virsh destroy <id> |
コンソールから抜けるには,Ctrl-] と打つ.
ex) # virsh ttyconsole 4 /dev/pts/5 # minicom -op /dev/pts/5
基本,ここをみるべし.ubuntu バージョンによってやり方が違う.https://help.ubuntu.com/community/SerialConsoleHowto
xml を以下のように書き換える
# virsh edit guestname <interface type='ethernet'> <mac address='52:54:00:04:7b:a8'/> <script path='/etc/kvm/kvm-ifup'/> <target dev='tap0'/> <model type='virtio'/> </interface>
ホストOSがマルチホームの場合,ゲストもマルチホームにしたいかも.eth0, eth1 が実ホストにあるとしたとき,まず,br0, br1 をそれぞれ作成する.
次に,/etc/kvm/kvm-ifup の br1 版を以下のように作成する
# cp /etc/kvm/kvm-ifup /etc/kvm/kvm-ifup-br1 # vi /etc/kvm/kvm-ifup-br1 #!/bin/sh
# NOTE: For this script to operate properly, it is expected that # you have a br0
BRIDGE=''br1''
/sbin/ifconfig $1 0.0.0.0 up /usr/sbin/brctl addif $BRIDGE $1
}}
最後に,以下のエントリを virsh 管理 xml に追加する
# virsh edit <gust name> <interface type='ethernet'> <mac address='52:54:00:5b:8b:4a'/> <script path='/etc/kvm/kvm-ifup-br1'/> <target dev='tap2'/> </interface>
これで起動すれば,multi-home な vm です.
See detail: http://wiki.libvirt.org/page/Virtio
KVM では nic として intel, realtek などを選択できるが,それは nic の動作を完全に emulate している結果である.つまり emulation のオーバヘッドがある.ハードウェア的な emulation ではなく,準仮想化ドライバとなっているのが virtio ドライバである.VMware の vmware tools も同様のことをやっているらしい.virtio は nic と disk に対して提供されているドライバである.guest os が linux の場合,kernel 2.6.25 以上で対応している.
xml を以下のように書き換える
# virsh edit guestname <interface type='network'> ... <model type='virtio' /> </interface>
xml を以下のように書き換える
# virsh edit guestname <disk type='...' device='disk'> ... <target dev='vda' bus='virtio'/> </disk>
使っているとだんだん肥大化してくるqcow2. 一度大きくなると小さくされないので,一度でもvm上にでかいファイルを置くと,qcow2 は大きいままになる.最適化する場合は,一度vmを止めて以下のコマンド.
# qemu-img(kvm-img) convert -O qcow2 hoge.qcow2 hoge.qcow2.new
# qemu-img convert -f vmdk source.vmdk -O qcow2 dest.qcow2
差分ファイル対応にすれば,大きな qcow2 ファイルを毎度バックアップしなくても良くなるかも?
kvm-img create -b "base qcow2 file" -f qcow2 "diff qcow2 file"
kvm -m 1024 -boot c -hda "diff qcow2 file"
kvm-img commit -f qcow2 "diff qcow2 file"
今回は取り外ししないので,xml ファイルに直書き.以下の通り.
<devices> <hostdev mode='subsystem' type='usb'> <source> <vendor id='0x1234'/> <product id='0xbeef'/> </source> </hostdev> </devices>
kernel /boot/vmlinuz-2.6.24-1-686 root=/dev/sda1 ro quiet nosmp noapic nolapic
% qemu-img create -f vmdk image.vmdk 5G
config.version = "8" memsize = "256" ide0:0.present = "true" ide0:0.fileName = "image.vmdk" ide1:0.present = "true" # CD-ROMを利用 ide1:0.fileName = "auto detect" ide1:0.deviceType = "atapi-cdrom" # ISOイメージを利用する場合はこちらのコメントを外す #ide1:0.fileName = "C:\cygwin\home\skk\vmtest\5.5-RELEASE-i386-disc1.iso" #ide1:0.deviceType = "cdrom-image" ethernet0.present = "true" ethernet0.connectionType = "nat" guestOS = "freebsd"
vboxdrv_load="YES" vboxnetadp_load="YES"
vboxdrv.ko vboxnetadp.ko vboxnetflt.ko
# portsupgrade -N emulators/virtualbox-ose-legacy
# vi /etc/rc.conf vboxnet_enable="YES" # vi /boo/loader.conf vboxdrv_load="YES"
# /usr/local/etc/rc.d/vboxnet start ; virtualbox 用の networking # kldload vboxdrv ; (VT サポート,ネットワーキングサポート向けの kernel module がロードされる)
vboxusers:*:920:skk
% /usr/local/bin/VirtualBox
VBoxManage createhd --filename Win2008.vdi --size 40000 --variant Standard → 40GBのHDDをVDI形式で作る VBoxManage storagectl Win2008 --name ide --add ide --controller ICH6 → ideという名称で、ICH6のIDEコントローラを追加 VBoxManage storageattach Win2008 --storagectl ide --port 0 --device 0 --type hdd --medium Win2008.vdi → HDDを追加 VBoxManage storageattach Win2008 ?storagectl ide --port 1 --device 0 --type dvddrive --medium Win2008.iso → DVDドライブを作成し、ISO IMAGEをマウント
% nohup VBoxHeadless --startvm Win2008 --vnc --vncport 5900 --vncpass abcd1234 &
% VBoxManage list vms
% VBoxManage showvminfo <vmname>
% nohup VBoxHeadless --startvm Win2008 --vnc --vncport 5900 --vncpass abcd1234 &
% VBoxManage controlvm <vmname> poweroff
% /usr/local/bin/VirtualBox
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/> ↓ <DNS pass-domain="false" use-proxy="false" use-host-resolver="true"/>