virtiofsでゲストOSからファイルにアクセスしたとき
This content is a draft and will not be included in production builds.
virtiofsはFUSEのデーモンとして実装される。ゲストOSから実際にどういう経路でデーモンにアクセスするのか調べた。
ゲストLinuxはドライバを持っていて、virtiofsとしてマウントできる。
# mount -t virtiofs myfs /mntこのmyfsはQEMUデバイスのタグと揃えておく。
QEMUはUnixソケットを通じて、ゲストOSとvirtiofsデーモンの通信を制御する。
$ virtiofsd --socket-path=/tmp/vhostqemu ...
$ qemu-system-x86_64 -chardev socket,id=char0,path=/tmp/vhostqemu -device vhost-user-fs-pci,chardev=char0,tag=myfsなので、ゲストOSからのファイルアクセスは、
- ゲストのデバイスドライバを通してQEMUが提供するchar0デバイスに届く
- QEMUはchar0へのアクセスをUnixソケットに転送する
- UnixソケットでQEMUとvirtiofsが繋がっているので、最終的にvirtiofsが処理して返す
となる。
また、公式の手順では共有メモリも割り当てている。
$ qemu-system-x86_64 -m 4G -object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on -numa node,memdev=memこれは、ゲストのページキャッシュを使わずにホストのメモリにアクセスするものらしい。