|.. SPDX-License-Identifier: GPL-2.0
|virtiofs: virtio-fs host<->guest shared file system
|- Copyright (C) 2019 Red Hat, Inc.
|The virtiofs file system for Linux implements a driver for the paravirtualized
|VIRTIO "virtio-fs" device for guest<->host file system sharing. It allows a
|guest to mount a directory that has been exported on the host.
|Guests often require access to files residing on the host or remote systems.
|Use cases include making files available to new guests during installation,
|booting from a root file system located on the host, persistent storage for
|stateless or ephemeral guests, and sharing a directory between guests.
|Although it is possible to use existing network file systems for some of these
|tasks, they require configuration steps that are hard to automate and they
|expose the storage network to the guest. The virtio-fs device was designed to
|solve these problems by providing file system access without networking.
|Furthermore the virtio-fs device takes advantage of the co-location of the
|guest and host to increase performance and provide semantics that are not
|possible with network file systems.
|Mount file system with tag ``myfs`` on ``/mnt``:
|.. code-block:: sh
| guest# mount -t virtiofs myfs /mnt
|Please see https://virtio-fs.gitlab.io/ for details on how to configure QEMU
|and the virtiofsd daemon.
|virtiofs supports general VFS mount options, for example, remount,
|ro, rw, context, etc. It also supports FUSE mount options.
|The atime-related mount options, for example, noatime, strictatime,
|are ignored. The atime behavior for virtiofs is the same as the
|underlying filesystem of the directory that has been exported
|on the host.
|Since the virtio-fs device uses the FUSE protocol for file system requests, the
|virtiofs file system for Linux is integrated closely with the FUSE file system
|client. The guest acts as the FUSE client while the host acts as the FUSE
|server. The /dev/fuse interface between the kernel and userspace is replaced
|with the virtio-fs device interface.
|FUSE requests are placed into a virtqueue and processed by the host. The
|response portion of the buffer is filled in by the host and the guest handles
|the request completion.
|Mapping /dev/fuse to virtqueues requires solving differences in semantics
|between /dev/fuse and virtqueues. Each time the /dev/fuse device is read, the
|FUSE client may choose which request to transfer, making it possible to
|prioritize certain requests over others. Virtqueues have queue semantics and
|it is not possible to change the order of requests that have been enqueued.
|This is especially important if the virtqueue becomes full since it is then
|impossible to add high priority requests. In order to address this difference,
|the virtio-fs device uses a "hiprio" virtqueue specifically for requests that
|have priority over normal requests.