Skip to content

QEMU上のPlan 9でvirtio-9pを使う

9legacyが配布する boot/qemuvirtio-9p 対応が追加された。

Terminal window
qemu-system-x86_64 -fsdev local,id=root9p,path=$PWD,security_model=none \
-device virtio-9p-pci,fsdev=root9p,mount_tag=root,disable-legacy=on

QEMUの virtio-9p アーキテクチャの概要は以下のドキュメントにある。

ORCLOSEを指定してもファイルが消えない問題

Section titled “ORCLOSEを指定してもファイルが消えない問題”

9Pの opencreate には ORCLOSE フラグを渡すことができる。このフラグは与えたファイルディスクリプタが close されるときにファイルを消すためのフラグで、主に一時ファイルの削除に使われる。

2026年7月時点のQEMUは、このフラグを実装していなかったので、Plan 9ゲストが消えるはずだと思っているファイルが消えてくれずに残り続け、それが原因で file is exist エラーになってしまうことがあった。具体的には replica/pull を実行するとファイルのハッシュ値を計算するため /tmp/replicaXXXXXX としてファイルを作るのだが、これが残ってしまって、空きファイルがなく最終的にエラーとなっていた。X の数が多いので取りうる値は多いように見えるけれど、実際は XXXXXX の最初にある文字が a から z の範囲で推移し、残りの X はプロセス番号で埋められる実装になっており、テンポラリファイルとして使える名前は見た目ほど多くない。

virtio-9phw/9pfs以下で実装されているので眺めたところ、open 等に渡した mode を処理するのはomode_to_uflags関数が行っているのだけど、確かに ORCLOSE を処理しているコードが全くなかった。対応方法としては XXX の置き換え処理をもう少し取りうる範囲が広くなるよう変更するなどいくつかあるが、ネイティブPlan 9では ORCLOSE を使っている場所が残っているし、使える方がより良い状態となるのでQEMUにパッチを送る方法を調べて修正した。