我正在绞尽脑汁试图解决这个权限问题,即客户机创建的文件无法在主机上访问。
设置:
我有一个通过 KVM 运行的 Ubuntu 20.04 主机和一个 Ubuntu 20.04 客户机。我在映射模式。主机目录可/home/user/VMs/shared/syncthing/
通过 上的来宾虚拟机访问/hostmount
。我正在使用 来宾内部进行挂载sudo mount -t 9p -o trans=virtio,version=9p2000.L /hostmount /hostmount
。使用 常规帐户下的 virt-manager 启动来宾虚拟机user
。
当前状态:
- 主机可以在共享中创建文件,以供客户机读取和修改。
- 客人可以在共享中创建文件,但主机用户不能读取或修改这些文件。
touch /hostmount/test.file
如果我以普通用户身份从来宾内部访问user
,则在主机端我会看到以下权限ls –l test.file
:
-rw------- 1 libvirt-qemu kvm 0 Feb 4 02:51 /home/user/VMs/shared/syncthing/test.file
期望状态:
当然,我可以chown
在创建后使用该文件,但是我该如何做呢?
user
强制客户虚拟机像在主机上一样创建文件user
授予主机对来宾虚拟机创建的文件的访问权限(libvirt-qemu
在主机上)
我已经尝试过这个答案。它们适用于预先存在的文件,但不适用于来宾创建新文件的情况。
答案1
我找到了解决这个问题的方法这篇相关文章不过我猜想存在更优雅的解决方案。如果您从命令行运行虚拟机,只需将fmode
和dmode
选项添加到命令中即可。例如:--filesystem "/path/to/share","sharename",mode=mapped,fmode='0777',dmode='0777'
。这将使目录可由所有人写入。
如果您正在使用 libvirt xml 或 virt-manager,您可以删除现有的共享文件夹并在 结束之前添加此 xml <domain>
。请注意,您可能需要调整其中一些参数,我不知道它们都有什么作用。
<qemu:commandline>
<qemu:arg value="-fsdev"/>
<qemu:arg value="local,security_model=mapped,id=fsdev-fs0,path=/path/to/share,fmode=0777,dmode=0777"/>
<qemu:arg value="-device"/>
<qemu:arg value="virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=sharename,bus=pci.1,addr=0x0"/>
</qemu:commandline>
如果你和我一样使用 Ubuntu,你还需要编辑你的文件并在末尾/etc/apparmor.d/abstractions/libvirt-qemu
添加以下行。这将授予所有访客访问此路径的权限。/path/to/share/{,**} rw,
答案2
我遇到了同样的问题,而您的回答 T 先生启发了我,我想我找到了更优雅的解决方案:我搜索了 libvirt 文档,看看是否可以在映射挂载的现有 xml 中添加那些“fmode”和“dmode”选项,而不是那些自定义 qemu 命令指令,然后我就在这里找到了示例:
https://libvirt.org/formatdomain.html#filesystems
因此,在我的解决方案中,virt-manager 中映射挂载的 xml 的第一行如下所示,其余部分保持不变:
<filesystem type="mount" accessmode="mapped" fmode="0770" dmode="0770">
在主机中,我将我的用户添加到组“libvirt-qemu”并注销登录以使其生效。这满足了我的需求(可从两侧编辑目录)。
当然,我找到了大量看似复杂的解决方案来达到相同的目标,但我只是对 virt-manager 进行了基本的使用,这对我来说似乎是一个很好的折衷方案。
为了完整性,以下是映射挂载的完整 xml。也许不同的权限会更好,我不知道。
<filesystem type="mount" accessmode="mapped" fmode="0770" dmode="0770">
<driver type="path" wrpolicy="immediate"/>
<source dir="/host/path/to/shared/folder"/>
<target dir="labelonguest"/>
<address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
</filesystem>
第二行是我从其他地方添加的,但我记不清“驱动程序类型”起什么作用了。它不应该改变任何东西。