Я заметил странное поведение на одной машине с Debian, которую я не могу воспроизвести на другой машине с Ubuntu. При перечислении virsh
сетей как обычный пользователь, он показывает пустой список:
~ $ virsh net-list - все Name State Autostart Persistent ----------------------------------------------------------
При выполнении той же команды с sudo
, он показывает соединение по умолчанию:
~ $ sudo virsh net-list - все Name State Autostart Persistent ---------------------------------------------------------- default active no yes
Разрешения на сами файлы вроде бы выставлены правильно:
~ $ ls -l / etc / libvirt / qemu / сети 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
Пользователь принадлежит kvm
и libvirtd
группы.
Что происходит? Почему я не могу указать сети как обычный пользователь?
Если это не указано явно, двоичный файл virsh использует URI 'qemu: /// session' (по крайней мере, в 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:///system
На машине Debian, с другой стороны, ни одна из этих переменных не установлена:
debian: ~ $ echo $ VIRSH_DEFAULT_CONNECT_URI debian: ~ $ echo $ LIBVIRT_DEFAULT_URI
Установка одной из этих переменных в qemu:///system
вероятно, сработает, но, ну, проще указать строку подключения непосредственно в virsh
команда (по крайней мере, при написании скрипта).
раскомментируйте эту строку в файле /etc/libvirt/libvirt.conf
uri_default = "qemu:///system"
мне хватило в шляпе 29.
Редактировать: как здесь сказано https://libvirt.org/uri.html для пользователей без полномочий root этот файл также должен находиться в $ XDG_CONFIG_HOME / libvirt / libvirt.conf
что в моем случае:
~/.config/libvirt/libvirt.conf
поэтому я копирую файл туда (при моей новой установке), и теперь virsh net-list работает как пользователь без полномочий root, и нет необходимости указывать --connect
Из документов, root
(в основном) требуется, и virsh
болтает с демоном (и не копается вручную в файлах в /etc/libvirt
каталог, который strace
или sysdig
подтвердит):
Most virsh operations rely upon the libvirt library being able to
connect to an already running libvirtd service. This can usually be
done using the command service libvirtd start.
Most virsh commands require root privileges to run due to the
communications channels used to talk to the hypervisor. Running as non
root will return an error.
Так почему virsh list
не возвращает ошибку может быть ошибкой или нуждается в разъяснении в virsh(1)
страница руководства ...
можно настроить virsh для работы с локальным пользователем. Более подробная информация здесь:
https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/
в основном вам нужно настроить правило polkit и подключиться к демону libvirtd