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

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

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

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

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

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

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

〜$ ls -l / etc / libvirt / qemu /网络
共 8
drwxr-xr-x 2 root root 4096 7月 1 18:19 自动启动
-rw-r--r-- 1 root root 228 7 月 1 日 18:19 default.xml

用户属于kvmlibvirtd组。

发生了什么事?为什么我无法以普通用户身份列出网络?

答案1

看起来

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

因此,不仅virsh net-list,实际上任何命令(包括virsh list)在使用 运行时都会表现不同sudo。换句话说,virsh net-list使用的是用户范围而不是全局范围。

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

解决方案很简单:

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

按照我的预期去做了,同时:

virsh net-list

没有。

为什么 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(至少在编写脚本时)。

答案2

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

uri_default = "qemu:///system"

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

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

就我的情况来说:

 ~/.config/libvirt/libvirt.conf

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

答案3

可以设置 virsh 与本地用户一起工作。更多信息请参见此处:

https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/

基本上你需要设置 polkit 规则并连接到 libvirtd 守护进程

答案4

将您的用户添加到 libvirt 组:

sudo usermod -aG libvirt yourUsername

并在 /home/yourUsername/.conf/libvirt.conf 中设置默认 URI:

uri_default = "qemu:///system"

相关内容