qidao123.com技术社区-IT企服评测·应用市场

标题: 在 debian/ubuntu 下使用 libvirt 启动虚拟机报文件没有权限的问题 [打印本页]

作者: 大连全瓷种植牙齿制作中心    时间: 2025-4-3 16:20
标题: 在 debian/ubuntu 下使用 libvirt 启动虚拟机报文件没有权限的问题
问题描述:

环境信息:

虚拟机描述文件中的 disk 相关信息类似如许:
  1.     <disk type='volume' device='disk'>
  2.       <driver name='qemu' type='qcow2' discard='unmap'/>
  3.       <source pool='kvm' volume='win7.qcow2'/>
  4.       <target dev='vda' bus='virtio'/>
  5.       <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
  6.     </disk>
复制代码
错误信息:

虚拟机启动时,报如下错误:
  1. error: Failed to start domain Win7
  2. error: internal error: process exited while connecting to monitor: 2025-04-03T16:23:52.876344Z qemu-system-x86_64: -blockdev {"driver":"file","filename":"/data/kvm/win7.qcow2","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}: Could not open '/data/kvm/win7.qcow2': Permission denied
复制代码
dmesg 中可以看到如下错误:
  1. [1042732.266614] audit: type=1400 audit(1743668632.876:344): apparmor="DENIED" operation="open" profile="libvirt-99c17aad-cb2e-4bb3-b4d8-eec394cb189e" name="/data/kvm/win7.qcow2" pid=1749356 comm="qemu-system-x86" requested_mask="r" denied_mask="r" fsuid=64055 ouid=64055
复制代码
原因

Libvirt 在 Debian/Ubuntu 中默认使用了 Apparmor 来控制权限,防止对非授权目次和文件的访问。
按照预期,Libvirt 会使用 virt-aa-helper 主动将虚拟机所使用到的磁盘镜像的路径添加到允许访问的白名单中。File 模式的磁盘文件之所以没这个问题,就是因为 virt-aa-helper 会主动将文件参加到白名单中。
如果检察 /etc/apparmor.d/libvirt/libvirt-${vm-uuid}.files,可以看到类似下面的内容:
  1. DO NOT EDIT THIS FILE DIRECTLY. IT IS MANAGED BY LIBVIRT.
  2.   "/var/log/libvirt/**/Win7.log" w,
  3.   "/var/lib/libvirt/qemu/domain-Win7/monitor.sock" rw,
  4.   "/var/lib/libvirt/qemu/domain-21-Win7/*" rw,
  5.   "/run/libvirt/**/Win7.pid" rwk,
  6.   "/run/libvirt/**/*.tunnelmigrate.dest.Win7" rw,
  7.   "/data/kvm/win7.qcow2" rwk,
  8.   "/dev/vhost-net" rw,
  9.   "/var/lib/libvirt/qemu/domain-21-Win7/{,**}" rwk,
  10.   "/var/lib/libvirt/qemu/channel/target/domain-21-Win7/{,**}" rwk,
  11.   "/var/lib/libvirt/qemu/domain-21-Win7/master-key.aes" rwk,
  12.   "/dev/net/tun" rwk,
复制代码
可以看到 /data/kvm/win7.qcow2 rkw 就是磁盘镜像的路径,此中 rkw 表现 read lock write 权限。
然而,针对 Volume 类型的磁盘镜像,相关实现存在 bug,导致不会将路径添加到允许访问的白名单中。这就是为什么,使用 Volume 类型的磁盘镜像会报没有权限的原因。
解决方案

方案1:关闭 Apparmor(不推荐)

如许,libvirtd 将不会使用 apparmor 来做权限限制。
方案2:修改 Apparmor 策略,添加指定的 Storage Pool 目次

参考


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4