9p(libvirt/QEMU)共享模式

有人能解释一下libvirt/QEMU配置中的共享模式 - 默认、映射、透传、压缩 - 是什么意思吗?

enter image description here

我在passthrough模式下拥有这个共享。我看到在虚拟机内部,它是由vagrant:vagrant用户拥有的(该用户在主机上不存在),并且共享具有rw位设置。但是尝试在那里创建文件会出现访问被拒绝的错误。
我需要了解发生了什么以解决这个问题。
2个回答

共享模式定义了虚拟化(p9fs)文件系统向客户机呈现的方式。这对于权限映射有重要影响。要理解这一点,重要的是要记住,虚拟文件系统需要管理文件的权限,而它们在主机和客户机中可能不相同。

我找到的关于模式的最好文档来自 libvirt docs

文件系统块有一个可选属性 accessmode,指定访问源的安全模式(自 0.8.5)。目前,这仅适用于 QEMU/KVM 驱动程序的 type='mount'。可能的值为:

  • passthrough 以客户机内部用户的权限访问source。如果未指定,则为默认的accessmode更多信息。请注意,对权限/所有权的更改将影响使用该文件系统的所有客户机。此模式通常非常快速。
  • mapped 以超级监视程序(QEMU进程)的权限访问源。更多信息。 这意味着您需要确保超级监视程序上的文件对QEMU进程(我的设置中的用户名为libvirt-qemu)可访问。优点是,文件属性和权限在客户机中被“映射”,因此它们是独立于其他地方的更改(只要文件仍然可访问)。如果您的主机系统支持ACL,此模式还将允许客户机正确支持ACL。此模式通常比透传模式稍慢。
  • squash 与“透传”类似,但特殊之处在于忽略了“chown”等特权操作的失败。这使得像我这样以非root用户运行超级监视程序的人可以使用类似透传的模式。更多信息

请注意,透传模式似乎在写入文件方面存在一些问题。我也遇到了这里列出的问题:https://serverfault.com/questions/559726/kvm-guest-cannot-write-to-9p-share-owned-by-non-root。压缩模式似乎效果更好。 - FGiorlando

我曾经遇到一个非常类似的问题,即提供共享文件夹的读写访问权限。我可以读取文件,但不能将文件写入共享源路径文件夹。

Unix & Linux - KVM / QEMU / Virt-Manager:如何将文件存储在挂载的共享文件夹中

根本原因是客户系统正在以 libvirt-qemu 用户身份运行。要在运行中的客户系统中的挂载共享文件夹中创建文件,需要执行以下步骤:

Virt-Manager 中 -> 添加硬件 -> 文件系统,选择 映射 作为虚拟机的 模式 设置。

更改共享文件夹的权限:sudo chmod -R 777 /<path-to-shared-folder>

将所有者更改为您的用户名:sudo chown -R user:user /<path-to-shared folder>

更改虚拟磁盘文件的权限:sudo chmod -R 777 / 将所有者更改为您的用户名:sudo chown -R user:user / 将您的用户名添加到libvirtd组:sudo usermod -G libvirtd -a libvirt-qemu用户完全权限:sudo setfacl -R -m u:libvirt-qemu:rwx /* 注意:* = 指定要授予libvirt-qemu权限的文件夹目录层次结构。
重新启动主机操作系统...现在您应该能够在客户系统中创建文件。
关于9p virtio的信息-> 与客户共享主机文件 | QEMU文档9p设置

Mode指定了访问源的安全模式。Mapped表示使用虚拟机监视器的权限设置来访问源。Passthrough表示使用用户在虚拟客户机内设置的权限来访问源。这是默认模式。SquashPassthrough类似,不同之处在于忽略特权操作(如chown)的失败,这使得Passthrough模式适用于没有提升权限运行虚拟机监视器的用户。


1这展示了一种解决方法,但并没有解释Mapping及其相关内容的含义。 - anatoly techtonik
这样更清楚了,谢谢。我不明白passthrough是如何工作的,因为我在主机上没有vagrant:vagrant用户。如果我在虚拟机中以root用户运行,那么它能够访问主机上的所有内容吗?只是因为名称匹配而处于passthrough模式? - anatoly techtonik
@anatolytechtonik:你可以试一下……但我猜你想以普通用户身份运行它,这是更安全的方式,也是为什么我建议的解决方案在我的情况下没有出现其他问题的原因。:) - cl-netbox
1在尝试之前,我想先了解它应该如何工作。 - anatoly techtonik
@anatolytechtonik:最相关的部分是关于授予必要权限和解释各种模式之间的差异。 :) - cl-netbox
“Mapped”模式有很好的解释,但我不明白在“passthrough”模式中,虚拟机内部的权限设置如何控制主机文件系统。 - anatoly techtonik
好的。我猜这个问题可能太复杂了,所以我在这里提问了 - http://askubuntu.com/questions/775104/how-does-passthrough-mode-work-in-9p-libvirt-qemu - anatoly techtonik
1@anatolytechtonik 页面找不到 - polynomial_donut
2我认为在文件夹上执行chmod 777并不是真正必要的,对于我来说,给予libvirt-qemu读写执行权限已经足够了。 - polynomial_donut