如何在没有 sudo 的情况下列出 virsh 网络?

Ars*_*nko 16 permissions sudo virsh

我注意到在一台使用 Debian 的机器上出现了一个奇怪的行为,我无法在另一台运行 Ubuntu 的机器上重现。当virsh以普通用户列出网络时,它显示一个空列表:

~$ virsh 网络列表 --all
 名称 状态 自动启动 持久
-------------------------------------------------- --------

使用 运行相同的命令时sudo,它会显示默认连接:

~$ sudo virsh 网络列表 --all
 名称 状态 自动启动 持久
-------------------------------------------------- --------
 默认活动 否 是

文件本身的权限似乎设置正确:

~$ ls -l /etc/libvirt/qemu/networks
共 8 个
drwxr-xr-x 2 根 4096 7 月 1 日 18:19 自动启动
-rw-r--r-- 1 根根 228 Jul 1 18:19 default.xml

用户属于kvmlibvirtd组。

怎么了?为什么我不能以普通用户的身份列出网络?

Ars*_*nko 14

看来

如果没有明确说明,virsh 二进制文件使用 'qemu:///session' URI(至少在 debian 下)。

因此,不仅virsh net-list,但几乎任何命令,其中包括virsh list,与运行时表现不同sudo。换句话说,virsh net-list正在使用用户的范围而不是全局范围。

这是有道理的;尝试创建默认连接然后启动它会导致“网络已被接口 virbr0 使用”错误——在不知情的情况下,我正在启动第二个名为“default”的连接,而一个已经在运行。

解决方案很简单:

virsh --connect qemu:///system net-list
Run Code Online (Sandbox Code Playgroud)

做我期望它做的事情,同时:

virsh net-list
Run Code Online (Sandbox Code Playgroud)

没有。

为什么 Ubuntu 机器没有问题?

根据文档

如果 virsh 找到环境变量VIRSH_DEFAULT_CONNECT_URI集,它会默认尝试这个 URI。但是,由于 libvirt 支持LIBVIRT_DEFAULT_URI自身,因此不推荐使用此环境变量。

看来,确实,在 Ubuntu 机器上,定义了第二个变量:

ubuntu:~$ echo $VIRSH_DEFAULT_CONNECT_URI

ubuntu:~$ echo $LIBVIRT_DEFAULT_URI
qemu:///系统

另一方面,在 Debian 机器上,没有设置这些变量:

debian:~$ echo $VIRSH_DEFAULT_CONNECT_URI

debian:~$ echo $LIBVIRT_DEFAULT_URI

将这些变量之一设置为qemu:///system可能会起作用,但是,直接在virsh命令中指定连接字符串更容易(至少在编写脚本时)。


Orl*_*ske 12

在文件 /etc/libvirt/libvirt.conf 中取消注释这一行

uri_default = "qemu:///system"
Run Code Online (Sandbox Code Playgroud)

在 Fedora 29 中对我来说已经足够了。

编辑:正如这里所说的https://libvirt.org/uri.html对于非 root 用户,该文件也需要在 $XDG_CONFIG_HOME/libvirt/libvirt.conf 中

在我的情况下是:

 ~/.config/libvirt/libvirt.conf
Run Code Online (Sandbox Code Playgroud)

所以我将文件复制到那里(在我的全新安装中),现在 virsh net-list 作为非 root 用户工作,不需要 espicify --connect