通过 libvirt 与 VM 共享文件夹,9p,权限被拒绝

Fel*_*lix 13 server permissions virtualization qemu

Ubuntu Server 14.04 主机通过 libvirt/qemu-kvm 托管 Ubuntu Server 14.04 来宾。系统运行良好,但是 - 作为访客 - 我在写入共享文件夹 ( <filesystem>) 时遇到问题,这让我发疯。两台机器都是相对的香草安装。

我像这样附加了给定的文件夹:

[host] $ virsh edit guest-vm-name
# ...
<filesystem type='mount' accessmode='mapped'>
  <source dir='/data'/>
  <target dir='/data'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</filesystem>
# ...
Run Code Online (Sandbox Code Playgroud)

从来宾我挂载文件系统如下:

[guest] $ sudo -u www-data mkdir /tmp/mnt
[guest] $ sudo mount -t 9p -otrans=virtio,rw,version=9p2000.L /data /tmp/mnt
Run Code Online (Sandbox Code Playgroud)

我使用www-data用户,因为它稍后将成为有效用户,如果使用 p9,则组和用户 ID 必须匹配,afaiu。这也意味着在主机上,/data(这是 ext4 分区,RAID 上的 LVM)看起来像

[host] $ ls -lha /data
[host] $ drwxrwxr-x  4 www-data www-data 4.0K Nov 11 08:34 .
[host] $ drwxr-xr-x 24 root     root     4.0K Nov  7 16:58 ..
[host] $ drwxr-xr-x  2 www-data www-data 4.0K Nov 11 08:34 jail
# ...
Run Code Online (Sandbox Code Playgroud)

在来宾中,如果我尝试写入共享文件系统上的任何内容,我会收到权限错误(无论使用的用户如何):

[guest] $ sudo -u www-data touch /tmp/mnt/jail/letmeout
touch: cannot touch ‘/tmp/mnt/jail/letmeout’: Permission denied
Run Code Online (Sandbox Code Playgroud)

虽然我可以读取文件

[guest] $ cat /tmp/mnt/jail/throughthewindow
Great Weather!
Run Code Online (Sandbox Code Playgroud)

我尝试了各种方法,尤其是:

  • 停止 apparmor 服务并调用 aa-complain(我希望那是有效的)
  • 将 security 设置为 none /etc/libvirt/qemu.conf
  • 将用户和组设置为 root /etc/libvirt/qemu.conf

/var/log/syslog 和 dmesg 没有显示任何可疑内容。

有什么指点吗?!谢谢。

Ale*_*der 12

我知道,这是一个旧线程,但我刚刚遇到了一个类似的问题,并找到了一个至少部分有效的解决方案。

我也像你一样将 user 和 group 值更改/etc/libvirt/qemu.confroot
但我也改变了dynamic_ownership设置,因为描述听起来很有希望:

# libvirt 是否应该动态更改文件所有权
# 以匹配上面配置的用户/组。默认为 1。
# 设置为 0 以禁用文件所有权更改。

我的设置是:

  • 主持人:Debian 8 (Jessie)
  • 嘉宾:Debian 8 (Jessie)
  • 主机上的共享文件夹属于 root
  • id 为 1000 的本地用户是该组的成员libvirt(可能很重要)
  • 来宾 ( /mnt/data)上的挂载点属于用户 1000 ("alexander")

我现在终于可以写在安装共享文件夹中的文件与两个根(0)和亚历山大(1000)。(在我这样做之前,这里只允许 root 写入文件)

设置dynamic_ownership为 0 是必须在“映射”访问模式中完成的操作。

以下是有关我的设置的更多信息:

/etc/libvirt/qemu.conf:

user = "root"
group = "root"
dynamic_ownership = 0
Run Code Online (Sandbox Code Playgroud)

文件系统(virsh 编辑):

<!-- ... -->
    <filesystem type='mount' accessmode='mapped'>
      <source dir='/share/vm.localdomain/owncloud_data'/>
      <target dir='/data'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </filesystem>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

主持人:

ls -al /share/vm.localdomain/owncloud_data/
total 8
drwxr-xr-x 2 root      root      4096 Sep  8 00:15 .
drwxr-xr-x 7 root      root      4096 Sep  8 00:10 ..
Run Code Online (Sandbox Code Playgroud)

来宾上的 fstab:

/data  /mnt/data/  9p  trans=virtio  0  0
Run Code Online (Sandbox Code Playgroud)

客人:

root@debian:~# cd /mnt/data
root@debian:/mnt/data# touch touched_by_root
root@debian:/mnt/data# su - alexander
alexander@debian:~$ cd /mnt/data
alexander@debian:/mnt/data$ touch touched_by_user
alexander@debian:/mnt/data$ ls -al
total 16
drwxr-xr-x 2 alexander alexander 4096 Sep  8 00:30 .
drwxr-xr-x 6 root      root      4096 Sep  7 18:13 ..
-rw-r--r-- 1 root      root         0 Sep  8 00:30 touched_by_root
-rw-r--r-- 1 alexander alexander    0 Sep  8 00:30 touched_by_user
Run Code Online (Sandbox Code Playgroud)

回到主机:

root@Host /share/vm.localdomain # ls -al /share/vm.localdomain/owncloud_data/
total 16
drwxr-xr-x 2 root      root         4096 Sep  8 00:30 .
drwxr-xr-x 7 root      root         4096 Sep  8 00:10 ..
-rw------- 1 root      libvirt-qemu    0 Sep  8 00:30 touched_by_root
-rw------- 1 root      libvirt-qemu    0 Sep  8 00:30 touched_by_user
Run Code Online (Sandbox Code Playgroud)

结论

奇怪的是,在来宾上这两个文件属于不同的用户(root 与 alexander),而在主机上,这两个文件属于同一个用户(root:libvirt-qemu)。:-O
我不知道这个魔法究竟是如何工作的,但显然它确实如此。

希望这会有所帮助,
亚历山大


小智 0

我也遇到了这个问题,/home/user/shared在主机上创建了一个名为的文件夹,然后使用 virt-manager 添加该文件夹并将其作为 9p virtio 安装在 qemu 虚拟机上。

我检查了 /etc/apparmor.d/libvirt 中的设置,它有新的条目/home/user/shared,,我注意到它只具有 ' r' 权限/home/user/shared,但它rw具有/home/user/shared/. 我尝试添加 aw 以获得写入权限,但这似乎没有保存,所以我进入主机/home/user/shared并创建了一个子目录,并在该子目录上执行了 chmod 777 。这很有效,来宾虚拟机能够向 su 控制器写入任何创建和编辑的文件。

tldr:在共享文件夹中创建一个具有 777 权限的子目录,看看是否可以写入该子目录。