仮想化


linux での仮想化

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

kvm

  • ホストOS:ubuntu-8.04.3
  • virtualization 環境:KVM

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

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

ゲストOS のインストール

  • ホストOSと同じ環境を用意するならば,ubuntu-vm-builder コマンドを使うと良い.
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'
  • 好きな ゲスト OS を入れる場合は,インストール iso を落としてきて以下のように起動
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 のインストールにはどうしてもウィンドウが必要になるので,vnc, X forward のどれかを利用する必要あり.
  • 注意:ubuntu の通常インストーラーはなぜか動作せず.alternate というテキストベースインストーラーがあるので,それを利用してインストール.たぶんインストーラーで frame buffer 使うぜとか頑張っているのが原因だと思われる.FreeBSD インストーラーは原始的なので問題なく起動.

ゲスト 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
  • ゲスト OS に関するプロファイルを記述した xml を生成する
    • kvm(qemu) のコマンドライン起動オプションを記述したファイルを生成しておく.
% cat kvm.sh
kvm -hda /hoge/foo/lucid.img -boot c -m 512 -vnc 1.1.1.1:0 -serial pty 
  • xml を virsh コマンドで生成する
% 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>
  • <name>タグの名前は後々識別のために利用するのでちゃんとしたものに変更しておくこと.
  • xml を利用して仮想イメージを virsh に登録する
# virsh define hoge.xml
  • /etc/libvirt/qemu/testvm.xml として保存される.
  • virsh から操作
起動# virsh start testvm
表示# virsh list –all
コンソール接続# virsh console <id> *ゲストOS側でシリアルコンソールの設定が必要
シリアルコンソール番号取得# virsh ttyconsole <id>
終了# virsh shutdown <id>
強制終了# virsh destroy <id>

コンソールから抜けるには,Ctrl-] と打つ.

  • virsh console が腐っている時がある.その場合は,ttyconsole でシリアルコンソールのデバイス名を取得してから,minicom などで接続すると良い.
ex) # virsh ttyconsole 4
      /dev/pts/5
    # minicom -op /dev/pts/5
  • ゲストOS側のシリアルコンソール設定

基本,ここをみるべし.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>
  • model type で指定可能なデバイスは,“i82551”, “i82557b”, “i82559er”, “ne2k_pci”, “ne2k_isa”, “pcnet”, “rtl8139”, “e1000”, “smc91c111”, “lance”, “mcf_fec”, “virtio” など.詳細は # kvm -nic,mode=? で確認可能となっているができなかった.see detail: man qemu

ゲスト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>
  • target dev で指定する tap のデバイス番号は使われていないものを指定すること.
  • script は,先ほど作成した kvm-ifup-br1 に変更すること.

これで起動すれば,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 ファイルを毎度バックアップしなくても良くなるかも?

  • 既存の qcow2 ファイルを差分ファイル対応にする.
kvm-img create -b "base qcow2 file" -f qcow2 "diff qcow2 file"
  • 作成した diff ファイルから起動する.
kvm -m 1024 -boot c -hda "diff qcow2 file"
  • 既存(base qcow2 file)に変更(diff)をマージする.base のファイル名は多分 diff ファイル内に保存されているので指定しなくて良い.
kvm-img commit -f qcow2 "diff qcow2 file"

参考ページ

usb デバイス接続

  • 本来なら,Qemu / KVM のコンソールから,usb_add などで動的にできるが,

今回は取り外ししないので,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 の時

  • /boot/grub/menu.lst の kernel boot option に nosmp noapic nolapic を追加
kernel  /boot/vmlinuz-2.6.24-1-686 root=/dev/sda1 ro quiet nosmp noapic nolapic

vmware イメージの作り方

  • qemu を使う.
% 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"
  • 設定ファイルの名前はなんでも良い.config.vmx とか.
  • これでダブルクリックして,起動する.
  • iso は自分でダウンロードしておく.
  • あとは,通常のインストールと同じ.

virtualbox

  • 一時期 kvm がはやっていたが,virtualbox の完成度も上がっている模様.いつの間にか Oracle に吸収されていたんだね.

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

以下は注意点.

  • python は 2.x (記述時点で2.7がデフォルト)
  • /usr/src/ 以下にちゃんとシステムのソースがすべて入っていること.

/boot/loader.conf

  • 下記のように記述.
vboxdrv_load="YES"
vboxnetadp_load="YES"
  • 下記 3 つがロードされるはず.
vboxdrv.ko
vboxnetadp.ko
vboxnetflt.ko

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

ports からのインストール

  • 記述時点で,emulators/virtualbox-ose は FreeBSD 8.x 以上でないと動作しない.
  • emulators/virtualbox-ose-legacy を利用する.
# portsupgrade -N emulators/virtualbox-ose-legacy
  • ちなみに,FreeBSD 7.2 → 7.4 くらいの間で,gtk 周りの管理が変更になったり,gcc がシステムから外れる騒動の最中だったりするので,ports のコンパイルが少々不安定.詳しくは,http://www.tsukune.org/skk/hns/ の 20120103 の記事みて.
  • インストール完了後は,以下をそれぞれのファイルに記述しておく.
# 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 がロードされる)
  • /etc/group の vboxusers に自分のユーザを追加しておく.
vboxusers:*:920:skk

仮想マシンの作成

  • GUI を使う方法と,CUI のみでやる方法.

GUI の方法

  • 以下のコマンドで GUI が立ち上がるので,マウスでぽちぽちする.
% /usr/local/bin/VirtualBox
  • ちなみに,ユーザ権限で起動すること./home/<user>/.VirtualBox/ 以下に,VM 本体もマシンの構成が書かれた xml も保存される.

CUI の方法

  • コマンドラインで行なう場合は,virtualbox.pdf が,VirtualBox 3 系統を使う上では,もっとも参考になった.(神保様ありがとうございます.)
  • 以下は修正して利用しなければならない.
    • windows xp をインストールする場合
      • SATA の IntelAHCI コントローラは windows xp に入っていないので,「準備する(4)」は以下のようなコマンド群にする.数が減ってるけど,これで正しい.
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をマウント
  • 起動方法:vrdp がはやっている?ようなのだけど,僕は VNC が慣れているので,以下のコマンドラインで立ち上げています.
% nohup VBoxHeadless --startvm Win2008 --vnc --vncport 5900 --vncpass abcd1234 & 
  • nohup.out というファイルができて,stdout の情報はその中に置かれます.
  • shell を exit しても生き続けてくれます.
  • kill -KILL が効くのかはわからないです…
  • この状態で,hostip:5900 で起動時から VNC で操作可能です.また,guest os の中に VNC サーバ立ち上げて,固定 IP 振ってあげてもいいかもです.

ぱっと使うコマンド

  • インストールされている VM のリスト確認
% VBoxManage list vms
  • マシン構成の詳細
% VBoxManage showvminfo <vmname>
  • 起動
% nohup VBoxHeadless --startvm Win2008 --vnc --vncport 5900 --vncpass abcd1234 & 
  • シャットダウン
%  VBoxManage controlvm <vmname> poweroff
  • VirtualBox
% /usr/local/bin/VirtualBox

参考 URL

windows における問題点

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

  • 自動で作成される vbox ファイルの中の以下の記述が間違っているため,ローカルホスト内のアドレスが dns を proxy してくれない.下記の修正を該当箇所すべてに行なえば解決.
 <DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
   ↓
 <DNS pass-domain="false" use-proxy="false" use-host-resolver="true"/>
  • dns 問い合わせ用のアドレスは,10.0.2.3.default gateway ではないので注意.なぜ gateway アドレスで同時に処理してくれないのかは不明…
���۲�.txt · 最終更新: 2012/11/14 13:52 by 127.0.0.1
文書の先頭へ
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0