我注意到一台使用 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
用户属于kvm
和libvirtd
组。
发生了什么事?为什么我无法以普通用户身份列出网络?
答案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"