Я заметил странное поведение на одной машине с Debian, которую я не могу воспроизвести на другой машине с Ubuntu. При перечислении сетей virsh
в качестве обычного пользователя отображается пустой список:
~$ virsh net-list --all Name State Autostart Persistent ----------------------------------------------------------
При выполнении той же команды с sudo
отображается соединение по умолчанию:
~$ sudo virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active no yes
Разрешения на сами файлы кажутся настроенными правильно:
~$ 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
Пользователь принадлежит к группам 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
(по крайней мере, при написании скрипта).
Из документации (в основном) требуется 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
не возвращает ошибка может быть ошибкой или нуждается в разъяснении на странице руководства virsh (1)
...
можно настроить virsh для работы с локальным пользователем. Дополнительная информация здесь:
https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/
в основном вам нужно настроить правило polkit и подключитесь к демону libvirtd
раскомментируйте эту строку в файле /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 и не нужно указывать --connect