目次

仮想化


linux での仮想化

一時期は xen がもてはやされていたが,開発の流れの問題で linux 関係はほとんど kvm に流れてしまった模様.(2010/01)

kvm

HDD に相当するイメージ作成

% qemu-img(kvm-img) create -f qcow2 hoge.img 20G
-f: 仮想イメージのフォーマット選択.qcow2 は qemu で使われているものの模様.

ゲストOS のインストール

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 の管理

ゲスト OS の管理には複数の方法が考えられる.

  1. ssh のみで管理
  2. シリアルコンソールを設定し,ホスト OS から minicom などで接続
  3. vnc でいつも待ち受け.
  4. virsh で管理

1. の ssh のみは,ネットワークの設定がうまく行っている時のみ利用可能なため,OS 管理には不向き. 2. のシリアルコンソールは有力だが,シリアルコンソールを static にゲストOSに割り当てないといけないため少々固定的. 3. の vnc も2. と同様に IP/port を割り当てておかなければならないため固定的. 4. の場合,virsh console <vm 名>などとできるため,楽な気がする.

virsh 管理にするために

注意: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

ネットワーク設定

ホスト OS 側設定

kvm ゲスト側設定

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をマルチホームにする

ホスト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 です.

virtio ドライバ

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 以上で対応している.

nic

xml を以下のように書き換える

# virsh edit guestname
<interface type='network'>
  ...
  <model type='virtio' />
</interface>

disk ドライバ

xml を以下のように書き換える

# virsh edit guestname
<disk type='...' device='disk'>
  ...
  <target dev='vda' bus='virtio'/>
</disk>

qcow2 イメージを小さくする

使っているとだんだん肥大化してくるqcow2. 一度大きくなると小さくされないので,一度でもvm上にでかいファイルを置くと,qcow2 は大きいままになる.最適化する場合は,一度vmを止めて以下のコマンド.

# qemu-img(kvm-img) convert -O qcow2 hoge.qcow2 hoge.qcow2.new

vmdk から qcow2 に変換する

# 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"

参考ページ

usb デバイス接続

今回は取り外ししないので,xml ファイルに直書き.以下の通り.

 <devices>
   <hostdev mode='subsystem' type='usb'>
     <source>
       <vendor id='0x1234'/>
       <product id='0xbeef'/>
     </source>
   </hostdev>
 </devices>

vmware-player

時刻合わせ

ホストOS: windows, ゲストOS: linux, vmware-player の時

kernel  /boot/vmlinuz-2.6.24-1-686 root=/dev/sda1 ro quiet nosmp noapic nolapic

vmware イメージの作り方

% 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"

virtualbox

FreeBSD 9.1 における virtualbox インストール (2012/11)

以下は注意点.

/boot/loader.conf

vboxdrv_load="YES"
vboxnetadp_load="YES"
vboxdrv.ko
vboxnetadp.ko
vboxnetflt.ko

FreeBSD 7.4-stable における virtualbox 構築 (2012/01)

ports からのインストール

# 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

仮想マシンの作成

GUI の方法

% /usr/local/bin/VirtualBox

CUI の方法

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

参考 URL

windows における問題点

nat の時に,dns を proxy してくれない時の対処方法(2011/11/16)

 <DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
   ↓
 <DNS pass-domain="false" use-proxy="false" use-host-resolver="true"/>