Proxmox VE 中 VirtIO-FS 指南:高效共享宿主机与虚拟机文件

(本文由Gemini 2.5 Pro赞助生成)

在 Proxmox VE (PVE) 环境中,我们经常需要在宿主机和虚拟机 (VM) 之间共享文件。虽然有多种方法可以实现,例如传统的网络共享 (Samba/NFS) 或不被推荐的直接操作直通磁盘(这可能导致文件不同步甚至数据损坏的问题),但 VirtIO-FS 提供了一种专为虚拟化设计的高效、高性能的解决方案。

本文将详细介绍 VirtIO-FS 的概念、为何选择它、如何在 Proxmox VE 中进行设置,以及如何在客户机操作系统中使用它,并解释其背后的一些工作原理。


为什么选择 VirtIO-FS?

在讨论 VirtIO-FS 之前,我们先回顾一个常见的问题:当宿主机能访问到直通给虚拟机的硬盘上新添加的文件时,虚拟机内却可能无法立即看到这些文件,需要重启虚拟机才能显示。这通常是因为:

  1. 缓存不一致:宿主机和虚拟机各自维护文件系统的缓存。当一方直接修改磁盘(尤其是非集群文件系统被宿主机和虚拟机同时不恰当地读写时),另一方的缓存不会自动更新。
  2. 缺乏协调机制:对于非集群文件系统,同时被两个操作系统(PVE 宿主机和 VM 客户机)进行读写操作是非常危险的,极易导致数据损坏。操作系统通常假定自己对文件系统有独占访问权。

VirtIO-FS 正是为了解决这类共享需求而设计的,它提供了一个安全且高效的官方推荐方式,用于在 PVE 宿主机和 KVM 虚拟机之间共享目录。它绕过了传统的网络协议栈,直接通过 virtio 半虚拟化接口通信,性能优越。

VirtIO-FS 前提条件

在开始之前,请确保满足以下条件:

  • Proxmox VE 版本:建议使用较新版本 (如 PVE 7.x 或更高版本)。
  • 虚拟机操作系统
    • Linux 客户机:内核版本通常需要 5.4 或更高,以确保内置 VirtIO-FS 驱动。
    • Windows 客户机:需要安装最新的 VirtIO Windows 驱动包,并确保其中包含 virtiofs 驱动。
  • QEMU Guest Agent:强烈建议在虚拟机内部安装并运行 QEMU Guest Agent,它能改善宿主机与虚拟机的交互。

设置 VirtIO-FS:一步步指南

第一步:在 Proxmox VE 宿主机上准备共享目录

在 PVE 宿主机上创建一个您希望共享给虚拟机的目录。

1
2
sudo mkdir /mnt/my_shared_data
sudo chmod 777 /mnt/my_shared_data # 初始测试权限,后续可根据需求调整

第二步:为虚拟机添加 VirtIO-FS 设备

  1. 在 PVE Web UI 中,选择您的目标虚拟机(请先关闭虚拟机)。
  2. 进入 “硬件” (Hardware) -> “添加” (Add) -> “VirtIO-FS”。
  3. 配置参数:
    • **VirtIO-FS ID (或 Tag/Mount Tag)**:这是关键的挂载标签,虚拟机内部挂载时会用到。例如:myshare (请使用简短、无特殊字符的名称)。
    • **共享路径 (Share Path/Host Path)**:填写您在宿主机上创建的目录绝对路径,例如:/mnt/my_shared_data
    • **高级选项 (可选)**:
      • **xattr support (扩展属性支持)**:如果应用依赖文件扩展属性 (如 SELinux 标签),则启用。一般情况可禁用。
      • **POSIX ACLs (POSIX 访问控制列表支持)**:如果需要精细的 ACL 权限控制,并且宿主机和客户机均支持,则启用。一般情况可禁用。
      • Allow Direct IO (允许直接IO)**:除非特定应用(如某些数据库)明确需要并能从中受益,否则建议禁用**此选项,以利用宿主机缓存获得更好通用性能。

第三步:在虚拟机内部使用(挂载)共享文件夹

1. Linux 客户机

  • 创建挂载点
    1
    sudo mkdir /mnt/host_files
  • 手动挂载 (使用您之前设置的 Mount Tag,例如 myshare):
    1
    sudo mount -t virtiofs myshare /mnt/host_files
  • 开机自动挂载 (编辑 /etc/fstab):
    1
    myshare   /mnt/host_files   virtiofs   defaults,nofail,uid=your_vm_user,gid=your_vm_group   0   0
    your_vm_useryour_vm_group 替换为您虚拟机中实际的用户名和组名 (或UID/GID)。nofail 选项可防止因挂载失败导致启动卡住。

2. Windows 客户机

  • 安装 VirtIO-win 驱动:确保从 Fedora 官网下载并安装了最新的 virtio-win 驱动包,特别是 virtiofs 驱动。
  • 映射共享文件夹
    1. 打开“文件资源管理器”。
    2. 右键点击“此电脑” -> “映射网络驱动器…”。
    3. 在“文件夹”输入框中,尝试使用 \\.\YourMountTag 的格式,例如:\\.\myshare
    4. 选择一个驱动器号,并勾选“登录时重新连接”。

揭秘:“挂载标签”是如何工作的?

您可能会好奇,在虚拟机里并没有一个叫做 myshare 的设备文件,那这个挂载标签是如何工作的呢?

  • 并非传统块设备:VirtIO-FS 不是一个像 /dev/sda 那样的块设备。
  • 标识符与通信通道:挂载标签(如 myshare)是您为这个特定的 VirtIO-FS 共享实例定义的一个唯一标识符。它代表了宿主机和虚拟机之间建立的一个文件共享通道。
  • 驱动与宿主机协作
    • 当您在虚拟机中执行 mount -t virtiofs myshare ... 命令时,虚拟机内的 virtiofs 驱动会捕获这个请求。
    • 驱动程序使用 myshare 这个标签通过 VirtIO 通道向宿主机 (QEMU/KVM) 发出请求,表明它想访问标记为 myshare 的共享。
    • 宿主机的 QEMU 已经将 myshare 标签与您在 PVE 中配置的宿主机物理路径(如 /mnt/my_shared_data)关联起来。
    • QEMU 随后充当虚拟机文件操作请求与宿主机实际目录操作之间的桥梁。
  • 抽象层:挂载标签提供了一个抽象层。虚拟机不需要知道宿主机上共享目录的实际物理路径,只需要知道这个约定的标签即可。

简单来说,挂载标签就像是一个“服务名称”,虚拟机内的驱动用它来连接到宿主机提供的特定文件共享“服务”。

总结

VirtIO-FS 为 Proxmox VE 用户提供了一种在宿主机与虚拟机之间进行文件共享的强大、高效且安全的方式。通过简单的配置,您可以轻松实现高性能的文件交互,避免了传统共享方式可能带来的复杂性和潜在风险。希望本指南能帮助您顺利启用并充分利用 VirtIO-FS!

Author: kwin
Link: https://blog.kwin.win/2025/06/02/virtiofs/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.