[Solved] 无法访问存储文件,KVM Libvirt 中的权限被拒绝错误

今天,我使用以下命令启动了我的 Arch Linux 虚拟机 virsh start 命令并最终出现此错误 – Failed to start domain 'Archlinux_default' error: Cannot access storage file '/home/sk/.local/share/libvirt/images/Archlinux_default.img' (as uid:107, gid:107): Permission denied. 它实际上是一台使用 KVM Libvirt provider 创建的 Vagrant 机器。

然后,我再次尝试使用 vagrant up 命令。 它也显示了同样的错误。

 Bringing machine 'default' up with 'libvirt' provider…
 ==> default: Checking if box 'archlinux/archlinux' version '20210601.24453' is up to date…
 ==> default: Starting domain.
 There was an error talking to Libvirt. The error message is shown
 below:
 Call to virDomainCreateWithFlags failed: Cannot access storage file '/home/sk/.local/share/libvirt/images/Archlinux_default.img' (as uid:107, gid:107): Permission denied
启动域失败,无法访问存储文件,权限被拒绝错误

可以肯定的是,我再次尝试从 Virt-manager GUI 应用程序启动 VM。 这次它也确实返回了相同的错误。

启动域失败,无法访问存储文件,virt-manager 中的权限被拒绝错误

所有的错误消息都明确指出 qemu 用户没有 Libvirt 存储目录的读取权限。

在这个简短的教程中,让我向您展示怎样修复 KVM Libvirt 中的“错误:无法启动域…错误:无法访问存储文件….(如 uid:107,gid:107):权限被拒绝” .

内容

  1. 修复 KVM Libvirt 中的“无法访问存储文件,权限被拒绝错误”
    1. 方法一:
    2. 方法二:
      1. 结论

修复 KVM Libvirt 中的“无法访问存储文件,权限被拒绝错误”

这是常见的 KVM Libvirt 错误之一。 这个错误通常会发生在 改变 Libvirt 的默认存储目录的路径.

几天前,我将 Libvirt 存储位置移到了我的 $HOME 目录。 这就是我收到此错误的原因。

我们可以通过两种方式修复它。

方法一:

第1步: 编辑 /etc/libvirt/qemu.conf 文件:

$ sudo nano /etc/libvirt/qemu.conf

第2步: 找出 usergroup 指令。 默认情况下,两者都设置为 "root".

 [...] 
 Some examples of valid values are:
 #
 user = "qemu"   # A user named "qemu"
 user = "+0"     # Super user (uid=0)
 user = "100"    # A user named "100" or a user with uid=100
 #
 #user = "root"
 The group for QEMU processes run by the system instance. It can be
 specified in a similar way to user.
 #group = "root"
 [...]

取消注释两行并替换 root 与您的用户名和组 libvirt 如下所示:

 [...] 
 Some examples of valid values are:
 #
 user = "qemu"   # A user named "qemu"
 user = "+0"     # Super user (uid=0)
 user = "100"    # A user named "100" or a user with uid=100
 #
 user = "sk"
 The group for QEMU processes run by the system instance. It can be
 specified in a similar way to user.
 group = "libvirt"
 [...]
为 kvm libvirt 配置用户和组为 kvm libvirt 配置用户和组

CTRL+O 并按下 ENTER 保存更改并按 CTRL+X 退出文件。

第 3 步: 重新开始 libvirtd 服务:

$ sudo systemctl restart libvirtd

第四步: 请确保用户是 libvirt 团体。 如果没有,将用户添加到 libvirt 使用命令分组:

$ sudo usermod -a -G libvirt $(whoami)

第 5 步: 最后启动虚拟机:

$ virsh start

如果您更喜欢使用 vagrant,请运行以下命令:

$ vagrant up

这次应该启动虚拟机。

第 6 步: 检查虚拟机状态:

$ virsh list

或者,

$ vagrant status
检查 kvm libvirt 虚拟机状态检查 kvm libvirt 虚拟机状态

方法二:

另一种修复 KVM Libvirt 权限问题的方法是为 Libvirt 存储池目录设置适当的 ACL 权限。 就我而言,我的存储池目录位于 $HOME 目录。

第1步: 让我们获取当前的 ACL 权限 $HOME 目录。

$ sudo getfacl -e /home/sk/

示例输出:

 getfacl: Removing leading '/' from absolute path names
 file: home/sk/
 owner: sk
 group: sk
 user::rwx
 user:qemu:--x            #effective:--x
 group::---            #effective:---
 mask::--x
 other::---

正如你在上面的输出中看到的, qemu 用户没有 存储池位置的权限。 在某些发行版中,用户名可能是 libvirt-qemu.

第2步: 设置用户的读取和可执行权限 qemu 使用命令:

$ sudo setfacl -m u:qemu:rx /home/sk/

代替 qemu/home/sk/ 用你自己的。

现在,qemu 用户对存储池目录具有读取和可执行权限。 您可以使用以下命令验证它:

$ sudo getfacl -e /home/sk/

示例输出:

 getfacl: Removing leading '/' from absolute path names
 file: home/sk/
 owner: sk
 group: sk
 user::rwx
 user:qemu:r-x            #effective:--x
 group::---            #effective:---
 mask::--x
 other::---

第 3 步: 重启 libvirtd 服务:

$ sudo systemctl restart libvirtd

现在 Libvirt 来宾机器将毫无问题地启动。

结论

在本指南中,我们讨论了为什么在 KVM libvirt 中出现“无法访问存储文件权限被拒绝”错误以及怎样在 Linux 中以两种不同的方式修复它。