virtiofs: virtio-fs 主机<->访客共享文件系统

  • 版权所有 (C) 2019 Red Hat, Inc.

简介

Linux 的 virtiofs 文件系统实现了一个用于半虚拟化 VIRTIO “virtio-fs” 设备的驱动程序,用于访客<->主机文件系统共享。它允许访客挂载主机上导出的目录。

访客通常需要访问位于主机或远程系统上的文件。用例包括在安装期间向新访客提供文件、从位于主机上的根文件系统启动、无状态或临时访客的持久存储,以及在访客之间共享目录。

尽管可以使用现有的网络文件系统来完成某些这些任务,但它们需要难以自动化的配置步骤,并且它们将存储网络暴露给访客。virtio-fs 设备旨在通过提供无需联网的文件系统访问来解决这些问题。

此外,virtio-fs 设备利用访客和主机的共存来提高性能并提供网络文件系统无法实现的语义。

用法

使用标签 myfs/mnt 上挂载文件系统

guest# mount -t virtiofs myfs /mnt

有关如何配置 QEMU 和 virtiofsd 守护程序的详细信息,请参阅 https://virtio-fs.gitlab.io/

挂载选项

virtiofs 支持通用的 VFS 挂载选项,例如,remount、ro、rw、context 等。它还支持 FUSE 挂载选项。

atime 行为

与 atime 相关的挂载选项(例如 noatime、strictatime)将被忽略。virtiofs 的 atime 行为与主机上导出的目录的底层文件系统的行为相同。

内部结构

由于 virtio-fs 设备使用 FUSE 协议进行文件系统请求,因此 Linux 的 virtiofs 文件系统与 FUSE 文件系统客户端紧密集成。访客充当 FUSE 客户端,而主机充当 FUSE 服务器。内核和用户空间之间的 /dev/fuse 接口被 virtio-fs 设备接口取代。

FUSE 请求被放入 virtqueue 中并由主机处理。缓冲区中的响应部分由主机填充,访客处理请求完成。

将 /dev/fuse 映射到 virtqueue 需要解决 /dev/fuse 和 virtqueue 之间语义的差异。每次读取 /dev/fuse 设备时,FUSE 客户端可以选择要传输的请求,从而可以优先处理某些请求。Virtqueue 具有队列语义,并且无法更改已排队请求的顺序。如果 virtqueue 已满,这尤其重要,因为此时无法添加高优先级请求。为了解决此差异,virtio-fs 设备使用专门用于优先级高于普通请求的“hiprio” virtqueue。