I noticed a strange behavior on one machine using Debian that I can't reproduce on another machine running Ubuntu. When listing virsh
networks as an ordinary user, it shows an empty list:
~$ virsh net-list --all Name State Autostart Persistent ----------------------------------------------------------
When running the same command with sudo
, it shows the default connection:
~$ sudo virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active no yes
The permissions on the files themselves seem to be set correctly:
~$ ls -l /etc/libvirt/qemu/networks total 8 drwxr-xr-x 2 root root 4096 Jul 1 18:19 autostart -rw-r--r-- 1 root root 228 Jul 1 18:19 default.xml
The user belongs to kvm
and libvirtd
groups.
What is happening? Why can't I list the networks as an ordinary user?
It appears that:
Therefore, not only
virsh net-list
, but practically any command, includingvirsh list
, behaved differently when running withsudo
. In other words,virsh net-list
was using user's scope instead of global ones.This makes sense; trying to create the default connection and then starting it led to “Network is already in use by interface virbr0” error—without knowing it, I was starting a second connection named “default”, while one was already running.
The solution is straightforward:
does what I was expecting it to do, while:
doesn't.
Why is Ubuntu machine not having the issue?
According to the documentation:
It appears, indeed, that on Ubuntu machine, the second variable was defined:
On Debian machine, on the other hand, none of those variables are set:
Setting one of those variables to
qemu:///system
would probably work, but, well, it's easier to specify the connection string directly invirsh
command (at least when writing a script).uncomment this line in file /etc/libvirt/libvirt.conf
was enough for me in fedora 29 .
Edit: as it says here https://libvirt.org/uri.html for non root users that file also needs to be in $XDG_CONFIG_HOME/libvirt/libvirt.conf
which in my case is:
so i copy the file there (on my fresh install) and now virsh net-list works as a non-root user and no need to espicify --connect
it is possible to setup virsh to work with local user. More information is here:
https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/
basically you need to setup polkit rule and connect to libvirtd daemon
From the docs,
root
is (mostly) required, andvirsh
is chatting up a daemon (and not poking around manually at files in the/etc/libvirt
directory, which astrace
orsysdig
will confirm):So why
virsh list
does not return an error might either be a bug or in need of clarification in thevirsh(1)
man page...