#topicpath
contrib に仮想環境のパッケージが置かれているので QEMU-KVM を使用してみました。
「 qemu kvm 」 などで検索すれば十分な情報が得られますので、開発中の Plamo-5.0(64bit) 環境(ホスト)で動作させた時の記録です。 Plamo-4.73(ホスト)でも同様だと思いますが 64bit 環境のゲストOSは利用できません。
パッケージのインストール
$ sudo installpkg qemu_kvm-0.13.0-x86_64-P2.txz
モジュールのロード
$ sudo modprobe kvm-amd ( or kvm-intel )
ここでの利用範囲なら以下は一般ユーザで実行できるはずである
仮想ディスクの作成
$ qemu-img create -f raw image.raw 10G
( qcow2 イメージへのインストールは非常に時間が掛かるので raw イメージへインストールし qcow2 イメージへ変換するのがよいと思われる )
ゲストOSのインストールCD を起動
$ qemu-kvm -hda image.raw -cdrom /dev/sr0 -boot d [ -k ja -localtime ] -m 512 [ & ]
( /dev/sr0 は iso イメージファイルでもよい )
インストール実行
( ここでは、ゲストOSのネットワーク設定は DHCP による自動設定にしておく )
インストール終了
Ctrl+Alt+2 で QEMU のモニターに移行して
(qemu) system_powerdown
で終了できる。
インストールしたゲストOSの起動
$ qemu-kvm -hda image.raw -cdrom /dev/sr0 -boot c [ -k ja -localtime ] -m 512 [ & ]
ブラウザを起動して Google 等にアクセスできれば OK 。
このままではホスト、他のマシン(他のゲストOS)とのネットワーク接続ができない。
ホスト (Plamo-5.0 の場合) の設定
# modprobe tun
# ifconfig eth0 0.0.0.0 promisc up
# brctl addbr br0
# brctl addif br0 eth0
# ifconfig br0 ???.xxx.aaa.bbb <-- DHCP の場合は # dhclient br0
# route add default gw ???.xxx.yyy.zzz <-- DHCP の場合は必要無し
ゲストOSの起動
# qemu-kvm -hda ゲストOS.qcow2 [ -cdrom /dev/sr0 -k ja -localtime -smp 2 ] -boot c -m 512 -net nic[ ,macaddr=52:54:00:12:34:56 ] -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup <-- ルート権限で起動する必要がある。
kvm-ifup スクリプトの内容 --- ホストの /etc/kvm/ 以下に用意(任意に変更可)する。
#! /bin/sh
/sbin/ifconfig $1 0.0.0.0 promisc up
/usr/sbin/brctl addif br0 $1
ゲストOSの設定 ( Plamo の場合なら /etc/rc.d/rc.inet1 (rc.inet1.tradnet) の内容 ) で初期化される。
vmdk のイメージそのままで起動できる。
但し、
ゲストOSが Linux の場合は、起動時 (grubなど) のデバイス名、/etc/fstab でのデバイス名に違いが生じて正常に起動できない事がある。 1CD, レスキューモードなどで起動して修正すれば問題ない。 Ubuntu などのように grub, fstab で UUID を利用している物は問題ないと思われる。
Windows の場合は、ブルースクリーン (0x0000007B) が出てしまう問題があるようです。
参照先 ( (WinXP) (Win2K) )
対応策はレジストリに以下を追加する。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlCriticalDeviceDatabase\pci#ven_8086&dev_7010] "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}" "Service"="intelide"
上記の対応を施しても同じ問題が発生する場合は、レジストリをチェックして以下の内容が無ければ、追加する事で起動できるかもしれません。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlCriticalDeviceDatabase\primary_ide_channel] "ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}" "Service"="atapi"
起動オプションに -usb を付けてゲストOSを起動する。
( $ sudo qemu-kvm -hda ゲストOS.qcow2 ..... -usb )
ctrl+alt+2 で monitor console に移行し
(qemu) info usbhost デバイス表示(確認)
(qemu) usb_add host:X.X 接続
( (qemu) usb_del host:X.X 切断 )
ctrl+alt+1 で仮想マシンに戻る。
通常の USB デバイスを利用するようにゲストOSで利用できる。
( Pixux-560i(Canon), PM-730C(Epson) プリンタ、 CanoScan 5200F(Canon) スキャナ、 USB Flash メモリがゲストOSの Win2k から利用できました(スキャナ以外は ゲストLinux からも利用できました)。)
起動オプションに
-usb -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=1,hostport=2
を追加する。
hostbus=, hostport= は dmesg の
usb 1-2: new high speed USB device using ehci_hcd and address 4
で bus, port, addr を確認し、設定する。ここでは、hostbus=1, hostport=2, (hostaddr=4) である。
【注意】 ホストマシンの接続ポートにより変化するので、接続先を変更した場合は確認・変更が必要である。
( ソースの qemu-kvm-0.15.0/docs/usb2.txt も一読を .. )
virtio については動作してるなぁ程度の確認なので、実性能の向上度などについては分かりません。
ゲストOSが Plamo の場合 virtio でディスクを利用するには、ドライバーをカーネル組み込みにする必要がある。
これは、ゲスト側のカーネルに必要な事なのでホスト側は起動時のオプション指定だけである。
(Ubuntu などのように起動が initrd 対応ならドライバーがモジュールでも問題ないし、 UUID 指定ならなお楽である。)
ゲストOSが Plamo-4.73 の場合の例
CONFIG_VIRTIO_BLK=y CONFIG_VIRTIO_NET=m ----- y でもよい CONFIG_VIRTIO_CONSOLE=y CONFIG_HW_RANDOM_VIRTIO=m ----- y でもよい CONFIG_VIRTIO=y CONFIG_VIRTIO_RING=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y
でカーネルを再構築する。
grub.conf の root= と resume= のデバイス指定を sda?? --> vda?? に変更する。
fstab の / と swap のデバイス指定を sda?? --> vda?? に変更する。
ゲストOSを終了して再起動する。
$ sudo qemu-kvm -drive file=ゲストOS.qcow2,if=virtio,boot=on -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup -usb
正常に起動できればデバイスファイル /dev/vda? で /dev/sda? がない状態である。
ゲストOS側の lspci でも確認できる。
(参考まで)
fstab でのデバイス記述を UUID にしておけば grub のコマンドラインでの変更だけで起動できて少し便利である。 rootfs をマウントできない(どこにあるの?)なんて事がなくなるので
ネットワークだけ virtio を利用する場合はゲストOS (Plamo の場合) のカーネル再構築は必要ない。
起動オプション指定だけでよい。
ディスクの virtio を利用しない場合
$ sudo qemu-kvm -hda ゲストOS.qcow2 -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic,model=virtio -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup -usb
ディスクも virtio を利用する場合
$ sudo qemu-kvm -drive file=ゲストOS.qcow2,if=virtio,boot=on -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic,model=virtio -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup -usb
ゲストOS側の lspci や lsmod で virtio_net を確認できる。
ホスト (Plamo-5.0) のカーネルが
# CONFIG_VHOST_NET is not set
で構築されてますので、有効にして再構築する。
$ sudo qemu-kvm -drive file=ゲストOS.qcow2,if=virtio,boot=on -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic,model=virtio -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup,vhost=on
でゲストOSを起動する。
ホストでプロセスを見ると
$ ps axww
3753 pts/7 Ss+ 0:00 bash 3795 pts/1 S 0:00 sudo qemu-kvm -drive file=plamo-473_virtio.qcow2,if=virtio,boot=on -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic,model=virtio -net tap,ifname=tap0,script=/etc /kvm/kvm-ifup,vhost=on -usb 3796 pts/1 Sl 0:28 qemu-kvm -drive file=plamo-473_virtio.qcow2,if=virtio,boot=on -cdrom /dev/sr0 -boot c -k ja -localtime -m 512 -smp 2 -net nic,model=virtio -net tap,ifname=tap0,script=/etc/kvm/kvm- ifup,vhost=on -usb 3797 ? S< 0:00 [kvm-pit-wq] 3805 ? S 0:00 [vhost-3796] 3815 pts/1 R+ 0:00 ps axww
とカーネルスレッドで動作してるのが確認できる。
ゲスト起動時に -soundhw ? の指定で利用できる。
? に指定できる内容は
$ qemu-kvm -soundhw ?
で確認できます。
ホスト側、ゲスト側のミキサーの設定に影響されるので、その辺は自身の環境でテストが必要かも知れません。
diskimage_diff.qcow2 を作成し (backing file の作成)
$ qemu-img create -b diskimage.qcow2 -f qcow2 diskimage_diff.qcow2
diskimage_diff.qcow2 を利用して仮想マシンを起動し
$ sudo qemu-kvm -hda diskimage_diff.qcow2 -boot c -m 256 -k ja -localtime ...
操作すれば diskimage.qcow2 は変更されない。