Skip to content

virtiofsでゲストOSからファイルにアクセスしたとき

This content is a draft and will not be included in production builds.

virtiofsはFUSEのデーモンとして実装される。ゲストOSから実際にどういう経路でデーモンにアクセスするのか調べた。

ゲストLinuxはドライバを持っていて、virtiofsとしてマウントできる。

Terminal window
# mount -t virtiofs myfs /mnt

このmyfsはQEMUデバイスのタグと揃えておく。

QEMUはUnixソケットを通じて、ゲストOSとvirtiofsデーモンの通信を制御する。

Terminal window
$ 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からのファイルアクセスは、

  1. ゲストのデバイスドライバを通してQEMUが提供するchar0デバイスに届く
  2. QEMUはchar0へのアクセスをUnixソケットに転送する
  3. UnixソケットでQEMUとvirtiofsが繋がっているので、最終的にvirtiofsが処理して返す

となる。

また、公式の手順では共有メモリも割り当てている。

Terminal window
$ qemu-system-x86_64 -m 4G
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on
-numa node,memdev=mem

これは、ゲストのページキャッシュを使わずにホストのメモリにアクセスするものらしい。