[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 提供程序创建的 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 中的“错误:无法启动域 … 错误:无法访问存储文件 …. (as uid:107, gid:107): Permission denied” .

修复 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

第4步: 请确保用户是 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 中以两种不同的方式修复它。