仮想化
一時期は 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
% VBoxManage unregistervm <vmname> --delete
% /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"/>