============================ Sharing files with Virtio-FS ============================ .. contents:: ========= Virtio-FS ========= Virtio-FS is a shared file system that lets virtual machines access a directory tree on the host. Unlike existing approaches, it is designed to offer local file system semantics and performance. See https://virtio-fs.gitlab.io/ ========== Host setup ========== The host-side virtiofsd daemon, like other vhost-user backed devices, requires shared memory between the host and the guest. As of QEMU 4.2, this requires specifying a NUMA topology for the guest and explicitly specifying a memory backend. Multiple options are available: Either of the following: * Use file-backed memory Configure the directory where the files backing the memory will be stored with the ``memory_backing_dir`` option in ``/etc/libvirt/qemu.conf`` :: # This directory is used for memoryBacking source if configured as file. # NOTE: big files will be stored here memory_backing_dir = "/dev/shm/" * Use hugepage-backed memory Make sure there are enough huge pages allocated for the requested guest memory. For example, for one guest with 2 GiB of RAM backed by 2 MiB hugepages: :: # virsh allocpages 2M 1024 =========== Guest setup =========== #. Specify the NUMA topology in the domain XML of the guest. For the simplest one-node topology for a guest with 2GiB of RAM and 8 vCPUs: :: <domain> ... <cpu ...> <numa> <cell id='0' cpus='0-7' memory='2' unit='GiB' memAccess='shared'/> </numa> </cpu> ... </domain> Note that the CPU element might already be specified and only one is allowed. #. Specify the memory backend Either of the following: * File-backed memory :: <domain> ... <memoryBacking> <access mode='shared'/> </memoryBacking> ... </domain> This will create a file in the directory specified in ``qemu.conf`` * Hugepage-backed memory :: <domain> ... <memoryBacking> <hugepages> <page size='2' unit='M'/> </hugepages> <access mode='shared'/> </memoryBacking> ... </domain> #. Add the ``vhost-user-fs`` QEMU device via the ``filesystem`` element :: <domain> ... <devices> ... <filesystem type='mount' accessmode='passthrough'> <driver type='virtiofs'/> <source dir='/path'/> <target dir='mount_tag'/> </filesystem> ... </devices> </domain> Note that despite its name, the ``target dir`` is actually a mount tag and does not have to correspond to the desired mount point in the guest. So far, ``passthrough`` is the only supported access mode and it requires running the ``virtiofsd`` daemon as root. #. Boot the guest and mount the filesystem :: guest# mount -t virtiofs mount_tag /mnt/mount/path Note: this requires virtiofs support in the guest kernel (Linux v5.4 or later) =================== Optional parameters =================== More optional elements can be specified :: <driver type='virtiofs' queue='1024'/> <binary path='/usr/libexec/virtiofsd' xattr='on'> <cache mode='always'/> <lock posix_lock='on' flock='on'/> </binary>