61 lines
2.6 KiB
ReStructuredText
61 lines
2.6 KiB
ReStructuredText
![]() |
.. SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
===================================================
|
||
|
virtiofs: virtio-fs host<->guest shared file system
|
||
|
===================================================
|
||
|
|
||
|
- Copyright (C) 2019 Red Hat, Inc.
|
||
|
|
||
|
Introduction
|
||
|
============
|
||
|
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.
|
||
|
|
||
|
Usage
|
||
|
=====
|
||
|
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.
|
||
|
|
||
|
Internals
|
||
|
=========
|
||
|
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.
|