「QEMU」カテゴリーアーカイブ

キーボードの多言語チェック

***本記事にはプロモーションが含まれています。***

ドイツ語キーボードがうまく動かないというメールがたびたびメーリングリストに登場したりして、すこし、チェックできないかなと調べてみました。
Windowsホストの場合、Windows 2000とXPには入力する言語を選択できる機能があります。また、スクリーンキーボードというのがアクセサリにあって、notepadに入力することができます。常用しているWinXPで試してみるのはちょっと怖くてゲスト内でQEMUを動かそうとしたのですが、みごとに動かなかったので、どうしましょう。
Linuxホストの場合、Fedora Coreだとキーボードの言語を変えることによりすぐにドイツ語入力ができるようになります。表示する言語を変えることももちろんできますけど、何言っているのかわからなくなりますのでキーボードだけでいいと思います。
また、Gnome on-screen keyboard(GOK)というのがあって、マウスを使ってスクリーン上で入力できます。xevでイベントを調べてみるとこちらもちゃんと動いているみたい。
これで、日本語環境でドイツ語キーボードのデバッグができるか試せるかな。

QEMUの中のQEMU

***本記事にはプロモーションが含まれています。***

WinXPホスト上で、WinXPゲストを立ち上げ、その中でQEMUを使ってLinuxゲストを立ち上げようとすると、なぜかQEMUがフリーズしてしまいます。
WinXPホストで、Win2kゲストの中でQEMUを動かすと動くんですけど。
Linuxホストでも同じ結果でした。
さて、困った。なにが原因だろう。
gdbstubを使って、Linuxカーネルの止まる位置を確認しようとしたりしてみたけど、フリーズする位置が不安定みたい。それに、エミュレーションの速度が遅すぎて非常にストレスがたまった。
ゲストOSの中で作業するには、QEMUがもう少し速いといいですけどね。
これは、すぐには直せないかもと思った。

Windows XPと-kernel-kqemu

***本記事にはプロモーションが含まれています。***

Windows XP SP1aは、-kernel-kqemuオプションつきでは動かないみたいです。ユーザーモードのkqemuだったら動くのですが。kqemu無しでは動かないのも相変わらずです。
Win2kでも、ツールバーの時計をクリックするとフリーズするのは、いつの間にか直っていますね。時間計測の方法が結構変わったからだと思うけれど。時間も正確に刻んでいるようです。

Win32のselect

***本記事にはプロモーションが含まれています。***

Windowsホストだと、VLANが遅いということで、selectを使わずに、イベントとWSAEventSelectを使う改造をやってみています。
実装して、QEMU同士で通信させてみると、TCPで3倍から5倍、UDPでは10倍くらいスピードが速くなりました。なんか、すごいと思った。
Winsock FAQにも書いてありますけど、Windowsでselectを使うのはやめましょう。イベントを使った方が、はるかに効率がいいということですね。Windowsのネットワークスタックは、BSDのものを流用しているはずなんですけど、どうしてこんなことが起こるんですかね。
でも、VLANを使っている人がいるのかどうかわからないのですけど。
パッチとバイナリは、ホームページのほうを更新しておきました。

QCOW/QCOW2用のバイナリとパッチ

***本記事にはプロモーションが含まれています。***

いろいろ調べていたら、パッチを使わなくてもQCOW/QCOW2が動くことがわかった。気づかないうちにバグが修正されていたみたい。結構一生懸命バグをつぶしてみたんだけどがっくり。でも、勉強になったからいいか。小さな不具合がいろいろあるので、そのパッチを作りました。
バイナリも用意しましたので、興味があれば使ってみてください。
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060906-qcow.zip
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060906-qcow.patch

VM snapshots

***本記事にはプロモーションが含まれています。***

WindowsホストでもQCOW2フォーマットが使えるようになって、VMスナップショットという機能を使うことができます。
loadvm/savevmとQCOW2フォーマットのハードディスクイメージを組み合わせることで、多段階のスナップショットを保存したり、復元したりできるようになります。
これにともなって、QCOW2以外を使用したときのloadvm/savevmの使用は出来なくなりました。
DOS> qemu-img convert -f raw redhat.img -O qcow2 test.qcow2
というように、QCOW2フォーマットのディスクを用意します。
DOS> qemu -L ../pc-bios -hda test.qcow2
で、ゲストOSを起動し、Ctrl-Alt-2でモニターに切り替え、仮想マシンの状態を保存します。
(qemu) savevm test
(qemu) info snapshots
ID TAG    VM SIZE DATE VM CLOCK
1 test 4M 2006-09-01 12:00:00 00:00:01.000
Ctrl-Alt-1でゲストOSに戻り、ファイルを作ります。
Guest OS$ echo test >test.txt
Guest OS$ ls
test.txt
Ctrl-Alt-2で、もう一度状態を保存します。
(qemu) savevm test2
(qemu) info snapshots
ID TAG    VM SIZE DATE VM CLOCK
1 test 4M 2006-09-01 12:00:00 00:00:01.000
2 test2 5M 2006-09-01 12:01:00 00:00:02.000
すると、IDもしくはTagでファイルを作る前の状態に戻したり、後の状態に戻したりできます。
(qemu) loadvm test
もしくは、
(qemu) loadvm 1
スナップショットを削除するのは、delvmです。
TAGを付け忘れても、それぞれのスナップショットは番号で指定することができます。
また、QEMUの起動時に-loadvmオプションを使うことで、瞬時にゲストOSを起動することも可能です。
DOS> qemu.exe -L ../pc-bios -hda test.qcow2 -loadvm test
使ってみると、結構使えそうです。以前のsavevm/loadvmは、メモリーの状態しか保存しなかったためゲストOSのディスクキャッシュとハードディスクの内容の整合性が問題になったのですが、ハードディスクの内容と一緒に保存され、問題が解消されています。
注意したほうがいいことは、状態を保存せずにloadvmをしてしまうと、それまでやっていた作業が消えてしまうこと。スナップショットの途中で作業を再開すると木の枝みたいに内容が枝分かれになってしまうことなどです。

名前つきスナップショット

***本記事にはプロモーションが含まれています。***

-snapshotオプションを使わずに、一時ファイルに名前を付けて使用する方法があります。
まず、RedHatのハードディスクイメージがあるとして、それに対する一時ファイルredhat-tmp.qcowを作ります。フォーマットは、QCOWもしくはQCOW2を選びます。
DOS> qemu-img create -b redhat.img -f qcow redhat-tmp.qcow
その後、作った一時ファイルをハードディスクとして指定してQEMUを起動します。
DOS> qemu -L ../pc-bios -hda redhat-temp.qcow
すると、RedHatが立ち上がります。
変更点は、redhat-temp.qcowに書き込まれますので、ベースファイルredhat.imgは保護されています。
変更を反映したい場合は、QEMUモニターでcommitします。
(qemu) commit hda
名前を付ける利点は、QEMUを終了しても、一時ファイルを指定することで変更点が残ることです。作業を継続することができます。また、元のハードディスクに変更を反映することが出来ます。

-snapshotオプションの使い方

***本記事にはプロモーションが含まれています。***

使い方は、
DOS> qemu -L ../pc-bios -hda redhat.img -snapshot
とやると、一時ファイルがC:Documents and Settings(user name)Local SetttingsTempに出来ます。ハードディスクの形式は、RAWフォーマットでもいいです。
作業をやったあと、QEMUモニターで、
(qemu) commit hda
をするまで、ハードディスクイメージには変更したところが書き込まれません。
逆に言うと、commitしないでQEMUを終了してしまうと、変更点がすべて消えてしまいます。
もし、2つのハードディスクを使っている場合は、それぞれ別の一時ファイルが作られます。commit時に、変更点を反映するハードディスクを指定することが出来ます。

-snapshotオプション

***本記事にはプロモーションが含まれています。***

やっと-snapshotオプションが動き出した。多分大丈夫だと思うけれど、バグは取れたと思う。
オブジェクトの生成と消失を確実に管理できるとプログラムは安定する気がする。
WaitForMultipleObjectsは、待っているハンドルの優先順位が無いです。だから、イベントを受け取ったらなるべく早く配列から取り除いてあげないと、思った動作をしないことがわかった。複数のイベントをネストさせて、新しく登録したイベントから検出させるとかできないんですよね。
調べてみると、スナップショットを使うには3通りほど方法があります。-snapshotオプションを使う方法、一時ファイルに名前をつける方法、QCOW2ファオーマットを使ってVMスナップショットを使う方法です。
使い方を整理してみようと思います。