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。