我注意到一台使用 Debian 的机器上的一个奇怪行为,我无法在另一台运行 Ubuntu 的机器上重现。virsh
当以普通用户的身份列出网络时,它会显示一个空列表:
~$ virsh net-list --all 名称 状态 Autostart Persistent -------------------------------------------------- --------
使用 运行相同的命令时sudo
,它会显示默认连接:
~$ sudo virsh net-list --all 名称 状态 Autostart Persistent -------------------------------------------------- -------- 默认激活 否 是
文件本身的权限似乎设置正确:
~$ ls -l /etc/libvirt/qemu/networks 共 8 个 drwxr-xr-x 2 root root 4096 Jul 1 18:19 自动启动 -rw-r--r-- 1 root root 228 Jul 1 18:19 default.xml
用户属于kvm
和libvirtd
组。
怎么了?为什么我不能以普通用户的身份列出网络?
看来:
因此,不仅
virsh net-list
,而且实际上任何命令,包括virsh list
,在使用sudo
. 换句话说,virsh net-list
使用的是用户范围而不是全局范围。这是有道理的;尝试创建默认连接然后启动它导致“网络已被接口 virbr0 使用”错误 - 在不知情的情况下,我正在启动第二个名为“默认”的连接,而一个已经在运行。
解决方案很简单:
做我期望它做的事情,同时:
没有。
为什么Ubuntu机器没有问题?
根据文档:
确实,在 Ubuntu 机器上,似乎定义了第二个变量:
另一方面,在 Debian 机器上,没有设置这些变量:
将这些变量之一设置为
qemu:///system
可能会起作用,但是,直接在virsh
命令中指定连接字符串更容易(至少在编写脚本时)。在文件 /etc/libvirt/libvirt.conf 中取消注释此行
在 fedora 29 中对我来说已经足够了。
编辑:正如这里所说的https://libvirt.org/uri.html对于非 root 用户,该文件也需要在 $XDG_CONFIG_HOME/libvirt/libvirt.conf
在我的情况下是:
所以我将文件复制到那里(在我的全新安装中),现在 virsh net-list 以非 root 用户身份工作,无需 espicify --connect
可以设置 virsh 与本地用户一起工作。更多信息在这里:
https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/
基本上你需要设置 polkit 规则并连接到 libvirtd 守护进程
从文档中,
root
(大部分)是必需的,并且正在与virsh
一个守护进程聊天(而不是手动在目录中的文件中寻找/etc/libvirt
,strace
或者sysdig
将确认):那么为什么
virsh list
不返回错误可能是一个错误或需要在virsh(1)
手册页中澄清......