如何在 SMB/CIFS 网络共享上使用 QEMU/KVM 虚拟机磁盘映像:权限被拒绝

如何在 SMB/CIFS 网络共享上使用 QEMU/KVM 虚拟机磁盘映像:权限被拒绝

环境

  • SMB网络共享temp挂载如下,登录用户dave
    sudo mount -t cifs -o username=dave,vers=3.11,uid=dave,gid=dave //nas/temp /media/nas/temp
    
  • 有效temp挂载文件夹权限:
    $ ls -al /media/nas/
    drwxr-xr-x 2 dave dave    0 Nov 30 10:14 temp/
    
  • libvirtd 以 root 身份运行:
    $ ps aux | grep libvirt 
    root         902  0.0  0.2 1559756 42420 ?       Ssl  Nov29   0:06 /usr/sbin/libvirtd
    
  • 虚拟管理器(我使用的 libvirt 前端)以用户dave权限运行:
  • 普通的、未修改的 QEMU 配置
  • 用户dave已被添加到组中libvirt并且kvm如上所述这里(操作系统是Ubuntu 20.04):
    sudo adduser `id -un` libvirt
    sudo adduser `id -un` kvm
    
  • libvirt URI 是qemu:///system

问题

dave我可以直接temp从 shell 或文件应用程序写入/读取。共享所有者设置为,这是属于和 的uid=dave,gid=dave用户。运行虚拟机kvmlibvirt当地的 .qcow2磁盘镜像路径没有问题。在 virt-manager 中,我可以定义/media/nas/temp为存储池(包含图像的目录)。

但是,一旦我想在 中放置或创建此磁盘映像文件/media/nas/temp,就会触发“权限被拒绝”错误。据我所知,虚拟机qemu:///system被实例化并作为root.这不应以任何方式影响已配置的网络共享所有者。我尝试sudo su并检查过,我可以/media/nas/temp以 root 身份写入。

另一种直接触发错误的方法(从 virt-manager 输出复制)是:

/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K

问题

我真的很想了解权限问题以及如何解决它。这里有什么问题?

详细错误信息

尝试创建新的.qcow2磁盘映像会触发:

创建卷时出错:无法创建存储卷'ubuntu20.04':'内部错误:子进程(/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas /temp/ubuntu20.04 20971520K)意外退出状态 1:qemu-img:/media/nas/temp/ubuntu20.04:无法写入 qcow2 标头:权限被拒绝'

回溯(最近一次调用最后):文件“/usr/share/virt-manager/virtinst/storage.py”,第 682 行,安装 vol = self.pool.createXML(xml, createflags) 文件“/usr/lib/ python3/dist-packages/libvirt.py",第 3535 行,在 createXML 中,如果 ret 为 None:引发 libvirtError('virStorageVolCreateXML() failed', pool=self) libvirt.libvirtError:内部错误:子进程 (/usr/bin/ qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K) 意外退出状态 1: qemu-img: /media/nas/temp/ubuntu20.04:无法写入 qcow2 标头:权限被拒绝

在处理上述异常的过程中,又出现了一个异常:

回溯(最近一次调用最后一次):文件“/usr/share/virt-manager/virtManager/asyncjob.py”,第 75 行,在 cb_wrapper 回调(asyncjob,*args,**kwargs)文件“/usr/share/virt”中-manager/virtManager/createvol.py”,第 339 行,在 _async_vol_create vol.install(meter=meter) 文件“/usr/share/virt-manager/virtinst/storage.py”,第 691 行,在安装中 raise RuntimeError("无法创建存储卷“ RuntimeError: 无法创建存储卷 'ubuntu20.04': '内部错误: 子进程 (/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1, lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K)意外退出状态 1:qemu-img:/media/nas/temp/ubuntu20.04:无法写入 qcow2 标头:权限被拒绝'

更新:我进一步尝试过的

  • 通过搜索其他错误类型journalctl -xf(除了上面的消息之外没有别的)
  • cat /var/log/syslog | grep DENIED | grep libvirt通过(无)搜索被拒绝的操作
  • 通过实验禁用 AppArmor systemctl stop apparmor- 没有效果
  • 在其他本地文件夹中成功创建了图像/var/lib/libvirt/images/

更新 2:使用nobrl挂载选项

如果我使用nobrl安装选项(谢谢 rudib),所有者仍uid=dave,gid=dave如下:

sudo mount -t cifs -o username=dave,vers=3.11,uid=dave,gid=dave,nobrl //nas/temp /media/nas/temp

,可以成功创建存储卷(virt-manager 向导中的步骤 4/5)。虽然在步骤 5/5 中,我现在收到另一个“权限被拒绝”错误:

无法完成安装:'内部错误:qemu意外关闭了监视器:2020-12-01T06:03:01.710704Z qemu-system-x86_64:-blockdev {“node-name”:“libvirt-2-format”,“read -only":false,"driver":"qcow2","file":"libvirt-2-storage","backing":null}: 无法重新打开文件: 权限被拒绝'

回溯(最近一次调用最后一次):文件“/usr/share/virt-manager/virtManager/asyncjob.py”,第 75 行,在 cb_wrapper 回调(asyncjob,*args,**kwargs)文件“/usr/share/virt”中-manager/virtManager/createvm.py”,第 2089 行,在 _do_async_install guest.installer_instance.start_install(guest,meter=meter) 文件“/usr/share/virt-manager/virtinst/install/installer.py”,第 542 行,在start_install域= self._create_guest(文件“/usr/share/virt-manager/virtinst/install/installer.py”,第491行,在_create_guest域= self.conn.createXML(install_xml或final_xml,0)文件“/ usr/lib/python3/dist-packages/libvirt.py”,第 4034 行,在 createXML 中,如果 ret 为 None:引发 libvirtError('virDomainCreateXML() failed', conn=self) libvirt.libvirtError:内部错误:qemu 意外关闭了监视器:2020-12-01T06:03:01.710704Z qemu-system-x86_64:-blockdev {“节点名称”:“libvirt-2-format”,“只读”:false,“驱动程序”:“qcow2” ,"file":"libvirt-2-storage","backing":null}: 无法重新打开文件: 权限被拒绝

不指定uidgid导致以下权限:

$ ll /media/nas/
drwxr-xr-x 2 root  root     0 Dez  1 07:01 temp/

,错误与之前相同。

答案1

笔记:远程安装的活动卷可能会导致一些问题并增加延迟

看来 qemu-img 无法处理字节范围锁,这是cifs.该标志nobrl应该解决这个问题:

mount -t cifs -o username=dave,vers=3.11,nobrl,uid=libvirt-qemu //nas/temp /media/nas/temp

在图像创建过程中,qemu:///system uid=libvirt-qemu似乎不需要以 rootvirt-manager身份运行qemu-img create。但是,由于qemu:///system计算机是在 qemu 用户(libvirt-qemu[Ubuntu、Debian] 或qemu[Fedora])下启动的,因此当共享刚刚作为 root 挂载时,您将收到另一个权限被拒绝的错误。

nobrl
Do not send byte range lock requests to the server. This is
necessary for certain applications that break with cifs style
mandatory byte range locks (and most cifs servers do not yet support
requesting advisory byte range locks).

使用时selinux,可能需要设置sebool virt_use_samba

相关内容