-snapshotモード

-snapshotモードを動かそうと思って、いろいろいじってはみたのですが、なかなか難しい。
aiocb(aioコントロールブロック)というのを使って、データの入出力の管理をしています。qemu_aio_getでaiocbを確保して、qemu_aio_releaseで開放というかdrv->free_aiocbというリストに登録しておくことで再利用しています。
この、drv->free_aiocbは単方向リストなのですが、リストの次が自分を指してしまって循環してしまったり、そのせいで、データが二重に使われたりして動かなくなっています。
というところまでは把握したのですが、じゃあなぜ動かないのかがよくわからず。
余談になりますが、LinuxホストのgdbでSIGUSR1/SIGUSR2というシグナルを無視するように設定しても、無視してくれないのですね。なんだか、QEMU自身のデバッグがますますしづらくなってきている気がします。
非同期なんか使うものじゃないかも。

AIOとQCOW

QEMUの非同期I/O(AIO)の欠けていた部分を実装することで、QCOWのハードディスクイメージが読めるようになりました。qemu-imgも同様な問題があって、非同期でなくすことも考えたけど、すべて非同期でやることで動くようになりました。RawからQCOWへと、QCOWからRawへの両方コンバートできることを確認しました。
とりあえず動くことは確認できたけど、AIOって本当に難しい。コールバック関数がどう呼ばれ、何をやっているのかまだイマイチわからなかったりします。パッチに直すときは、ちゃんと理解できていたほうがいいですよね。
ハードディスクに関することなので、バグがあったりするとデータの消失につながりますよね。簡単な確認では大丈夫みたいだけれど、負荷がかかったり、ディスクがいっぱいになったときの安定性とかがなんだか心配です。この辺の、データの整合性を試験したりするにはどうすればいいのでしょう。

Linuxホストでwindbg

Linuxホストで、Windows 2003 serverゲストを走らせ、シリアルケーブルを使って、Windowsホストからwindbgを使ってデバッグしようとした人がいます。
でも、パッチを使うと接続はできたのですが、起動途中でフリーズしてしまったそうです。Windowsホストと何が違うのでしょう。
windbgのパフォーマンスは、シリアルの転送速度に影響されるので、物理的なケーブルより名前つきパイプのほうが速いです。1つのマシン上のWindowsホストでデバッグするのが素直だと思いますけど。

日本語キーボード

CVSに、日本語キーボードのパッチを取り込んでもらえました。
これで、Linuxホストでもキーボードがちゃんと動くと思います。
X.orgではなく、XFree86を使った古いホストだとバックスペースがうまく動かないかもしれませんが、いいですよね。その場合は、-k jaオプションが使えると思います。

AIOのいろいろ

QCOWを何とか動かそうと見ているのですが、なんかすごく難しい。
READだけ見てみると、非同期I/O(AIO)は、2段階のレベルがあります。
外部に公開するインターフェースとしては、bdrv_readとbdrv_aio_readがあります。bdrv_readは同期で、bdrv_aio_readは非同期です。
その下に、ドライバと呼ぶ関数があって、RAW、QCOWなど、形式ごとに読み書きをする関数が用意されています。
RAWフォーマットには、raw_preadが同期で、raw_aio_readが非同期の関数として実装されています。
でも、QCOWフォーマットには、非同期のqcow_aio_readしか実装されていません。それに、QCOWのドライバは、それ自身で読み書きするわけではなく、bdrv_readを介してRAWフォーマットのドライバを呼び出しています。つまり、実質4段階のレベルを通してデータが行き来するという何とも複雑なやり取りをしています。
それだけでなく、同期操作を非同期の関数でエミュレートしたり(bdrv_read_em)、逆に非同期の関数を同期関数でエミューレートする関数bdrv_aio_read_emも存在します。
また、ドライバの呼び出しは、コールバック関数を登録することで行っていて、一体どの関数がいつ呼び出されるのかわかりづらくなっています。
デバッガで追いかけようとしているのですが、Linux上だとデバッグパッチだけでは不十分だったりして、難航しています。

CD-ROMふたたび

CD-ROMのサイズも得られるようにして、-cdrom /dev/cdromと指定すると、最初のCD-ROMドライブを使うように設定するようにして、パッチを作って送っておいた。これでいいと思うけど。
それより、QCOWが動かないのがなんともよくわからないんだけど。非同期の関数を完全に実装しないと動かないのかな。