今天,我使用以下命令启动了我的 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。 这次它也确实返回了相同的错误。
所有的错误消息都明确指出 qemu
用户没有 Libvirt 存储目录的读取权限。
在这个简短的教程中,让我向您展示如何修复 KVM Libvirt 中的“错误:无法启动域…错误:无法访问存储文件….(如 uid:107,gid:107):权限被拒绝” .
内容
修复 KVM Libvirt 中的“无法访问存储文件,权限被拒绝错误”
这是常见的 KVM Libvirt 错误之一。 这个错误通常会发生在 改变 Libvirt 的默认存储目录的路径.
几天前,我将 Libvirt 存储位置移到了我的 $HOME
目录。 这就是我收到此错误的原因。
我们可以通过两种方式修复它。
方法一:
第1步: 编辑 /etc/libvirt/qemu.conf
文件:
$ sudo nano /etc/libvirt/qemu.conf
第2步: 找出 user
和 group
指令。 默认情况下,两者都设置为 "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" [...]
按 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 权限问题的方法是为 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 中以两种不同的方式修复它。
无法访问存储文件KVMKVM存储池libvirtLibvirt存储池LinuxLinux疑难解答权限错误存储池疑难解答VagrantVirshVirt-manager虚拟化