トップ «前の日記(04/16/2012) 最新 次の日記(05/01/2012)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


04/22/2012 ふむ [長年日記]

tDiary 3468日目

[日記][Linux] KVM 上の Guest として Windows8 Consumer Preview をインストール

先日ようやく重い腰を上げて自宅デスクトップを KVM Ready にした (ハードはサポートしてたけど面倒でやってなかった). とりあえず Guest Linux はそれっぽく動いたので,今度は Windows を入れてみる.

Windows8 は標準では virtio をサポートしていないので,以下のように cdrom ドライブが 2 台あることにして起動すると楽.

// Fedora Project から Windows 用 virtio ドライバ ISO をダウンロード
// Windows7 用ドライバがそのまま使える
$ wget http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/virtio-win-0.1-22.iso

// インストール先ディスクイメージ作成
$ sudo qemu-img create -f qcow2 /path/to/windows8.img 40G

// サウンドをチューニング
$ export QEMU_AUDIO_DRV=sdl
$ export QEMU_SDL_SAMPLES=8

// cdrom ドライブを 2 台積んでいることにして起動
$ sudo qemu-kvm \
   -name "Windows8" \
   -cpu host \
   -smp 2 \
   -m 2048 \
   -vga cirrus \
   -soundhw all \
   -usb \
   -usbdevice tablet \
   -drive file=/path/to/windows8.img,if=virtio,cache=writeback,media=disk,index=0 \
   -drive file=/path/to/Windows8-ConsumerPreview-64bit-Japanese.iso,media=cdrom,index=2 \
   -drive file=/path/to/virtio-win-0.1-22.iso,media=cdrom,index=3 \
   -net nic,macaddr=54:52:00:xx:yy:zz,model=virtio -net tap,ifname=vnet1,script=no \
   -boot d \
   -vnc :8 \
   -daemonize

ディスクを virtio で起動しているのでインストーラ起動直後はドライブがないと怒られる. ドライバを入れるぜボタンをクリックしてドライバをインストールしてやればドライブが見えるようになる.

ちなみに qcow2 イメージにインストールするのはかなり時間がかかる. インストールしてから思ったのだけれど,dd で raw イメージを作ってインストールした上で改めて qcow2 に convert すれば良かったかも知れない.

てかとりあえず vm をごりごり動かすにはメモリが足りないので足さないと...

追記

スペックが足りないのか何なのか,どうもサウンド関係がブツブツだったりと微妙なのでチューニングを入れた. 下記コマンドでサウンド関係の環境変数のヘルプを見ることができる.

$ qemu-kvm -audio-help

手元環境では下記くらいが最適で,いまいちよく分からないけれど QEMU_SDL_SAMPLES の値が小さい方が安定した. ちなみに alsa を使うとどう設定しても改善しなかった...

QEMU_AUDIO_DRV=sdl
QEMU_SDL_SAMPLES=8

てか Guest が Linux の場合はむしろいじらない方が安定していたので,Guest の OS やドライバによって最適な設定が異なる感じか.

追記 2

※不充分な点があったので修正.PID だけでなく全ての TID を指定してやらないと充分な効果は得られないね.

どうしてもサウンドが気になってしょうがないという場合は,以下のように qemu-kvm のスケジューリングポリシと優先度を変更してやると改善する可能性がある.

# chrt -rr -p 90 <qemu-kvm スレッド ID>

スレッド ID を調べるには,例えば以下のような感じで.

$ ls /proc/$(pgrep qemu)/task

ただしこの chrt 操作はゲスト OS が完全に起動した後で行った方が良い.

例えば chrt は nice と同じようにコマンドを引数に取ることでそのコマンドをあるスケジューリングポリシと優先度で起動させることができる. しかしゲスト OS 起動中の qemu-kvm プロセスを上記のような高い優先度で動作させてしまうと,ホスト OS 側の動作に必要なプロセスやスレッドの動作を阻害する可能性が高い. 結果として,ホストがハングアップしてしまったかのような動きを見せることになる (ゲスト起動後に復帰する). ゲスト OS 起動後の qemu-kvm くんはいい具合に寝たり起きたりしてくれるので,ホスト側にもきちんと CPU 時間が回ってくるという寸法.

ただ,ゲスト側が CPU 的に高負荷になるようなことをすると,やっぱりホスト側を阻害する可能性はある. 実施は自己責任で.

ちなみに優先度は以下のような感じで確認できる.

$ ps axo user,pid,ppid,c,stime,tty,time,rtprio,pri,cmd

この rtprio というのが chrt で設定した優先度.

ここで言うスケジューリングポリシとか優先度とかが一体何を示しているのかについては,sched_setscheduler(2) 辺りを見ると良い.