CentOS7:KVM:错误:无法创建用户运行时目录‘/run/user/0/libvirt’:权限被拒绝

CentOS7:KVM:错误:无法创建用户运行时目录‘/run/user/0/libvirt’:权限被拒绝

我一直在尝试解决我发现的一个问题,即通过让我们的 Nagios 安装使用 KVM 插件 check_kvm。我认为我的问题归结为 nagios/nrpe 用户的权限问题。安装 nrpe 和插件后,我没有遇到其他标准插件(如 check_disk 或 check_load 等)的任何问题。基本上,kvm 插件使用 virsh 来检查状态,因此我启用了 nrpe 的登录(也尝试了 nagios 用户,但似乎服务是在 nrpe 用户下运行的)并尝试了以下操作:

[root@vhost3 ~]# su nrpe
sh-4.2$ virsh list --all
error: failed to connect to the hypervisor
error: no valid connection
error: Cannot create user runtime directory '/run/user/0/libvirt': Permission denied

但是以 root 身份执行这个命令当然没有问题,并且在本地尝试时插件执行良好:

[root@vhost3 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     www                            running
[root@vhost3 ~]# /usr/lib64/nagios/plugins/check_kvm
hosts:1 OK:1 WARN:0 CRIT:0 - www:running

我尝试将 nrpe 用户(以及 nagios)添加到 kvm 和 qemu 组,但我找不到 libvirtd 组。奇怪的是,我在另一台机器上遇到了不同的错误,也许我在那台服务器上做了不同的事情,但我得到的却是这个:

[root@vhost1 ~]# su nrpe
sh-4.2$ virsh list --all
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/run/user/0/libvirt/libvirt-sock': Permission denied

上述错误的另一个奇怪之处是 /run/user/0/libvirt 目录不存在。在此 CentOS7 主机上,正确的目录是 /var/run/libvirt,其中存在 libvirt-sock。有人能指出我的问题是什么吗?

答案1

默认情况下,非root用户不能直接访问libvirtd,除非明确获得授权。

我已经这样做了使用 PolicyKit

# cat /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules
polkit.addRule(function(action, subject) {
        if (action.id == "org.libvirt.unix.manage" &&
            subject.user == "nrpe") {
                return polkit.Result.YES;
                polkit.log("action=" + action);
                polkit.log("subject=" + subject);
        }
});

这将允许用户nrpe使用 libvirtd 做任何他们想做的事情而不需要密码。

其次,非root用户需要明确指定连接URL才能访问系统libvirtd。

virsh --connect qemu:///system list --all

答案2

老话题了,但是我今天遇到了同样的问题,我认为上述答案不是最简单的解决方案:

ssh root@node
[root@node ~]# su kevin
[kevin@node root]$ echo $XDG_RUNTIME_DIR
/run/user/0
[kevin@node root]$ virsh capabilities
error: failed to connect to the hypervisor
error: Cannot create user runtime directory '/run/user/0/libvirt': Permission denied

--> 不起作用

ssh kevin@node
[kevin@perf28 ~]$ echo $XDG_RUNTIME_DIR
/run/user/1001
[kevin@perf28 ~]$ virsh capabilities
<capabilities>
...
</capabilities>

--> 有效!

所以问题是su(从root帐户)没有设置XDG_RUNTIME_DIR,因此要么重新使用用户登录,要么手动设置XDG_RUNTIME_DIR

相关内容