30 votes

Comment puis-je répertorier les réseaux virsh sans utiliser sudo ?

J'ai remarqué un comportement étrange sur une machine utilisant Debian que je ne peux pas reproduire sur une autre machine exécutant Ubuntu. Lors de l'énumération des réseaux virsh en tant qu'utilisateur ordinaire, cela affiche une liste vide :

~$ virsh net-list --all Nom État Autostart Persistant

Lors de l'exécution de la même commande avec sudo, cela affiche la connexion par défaut :

~$ sudo virsh net-list --all Nom État Autostart Persistant

default actif non oui

Les autorisations sur les fichiers eux-mêmes semblent être correctement définies :

~$ 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

L'utilisateur appartient aux groupes kvm et libvirtd.

Que se passe-t-il ? Pourquoi ne puis-je pas énumérer les réseaux en tant qu'utilisateur ordinaire ?

32voto

kevmoo Points 428

Il apparaît que:

Si ce n'est pas explicitement spécifié, le binaire virsh utilise l'URI 'qemu:///session' (au moins sous debian).

Par conséquent, non seulement virsh net-list, mais pratiquement n'importe quelle commande, y compris virsh list, se comportait différemment lors de son exécution avec sudo. En d'autres termes, virsh net-list utilisait la portée de l'utilisateur au lieu de la portée globale.

Cela a du sens ; en essayant de créer la connexion par défaut puis de la démarrer, j'ai obtenu l'erreur "Le réseau est déjà utilisé par l'interface virbr0" - sans le savoir, je démarrage une deuxième connexion nommée "par défaut", alors qu'il y en avait déjà une en cours.

La solution est simple :

virsh --connect qemu:///system net-list

fait ce que j'attendais qu'il fasse, tandis que :

virsh net-list

ne le fait pas.

Pourquoi la machine Ubuntu n'a-t-elle pas ce problème ?

En fonction de la documentation:

Si virsh trouve la variable d'environnement VIRSH_DEFAULT_CONNECT_URI définie, il essaiera cette URI par défaut. L'utilisation de cette variable d'environnement est cependant désormais déconseillée, maintenant que libvirt supporte LIBVIRT_DEFAULT_URI elle-même.

Il semble, en effet, que sur la machine Ubuntu, la deuxième variable était définie :

ubuntu:~$ echo $VIRSH_DEFAULT_CONNECT_URI

ubuntu:~$ echo $LIBVIRT_DEFAULT_URI qemu:///system

En revanche, sur la machine Debian, aucune de ces variables n'est définie :

debian:~$ echo $VIRSH_DEFAULT_CONNECT_URI

debian:~$ echo $LIBVIRT_DEFAULT_URI

Définir l'une de ces variables sur qemu:///system fonctionnerait probablement, mais bon, il est plus facile de spécifier directement la chaîne de connexion dans la commande virsh (au moins lors de l'écriture d'un script).

17voto

Orlando Nuske Points 131

Décommentez cette ligne dans le fichier /etc/libvirt/libvirt.conf

uri_default = "qemu:///system"

était suffisant pour moi dans fedora 29.

Éditer: comme indiqué ici https://libvirt.org/uri.html pour les utilisateurs non root, ce fichier doit également être dans $XDG_CONFIG_HOME/libvirt/libvirt.conf

ce qui est mon cas:

~/.config/libvirt/libvirt.conf

donc je copie le fichier là-bas (sur mon installation fraîche) et maintenant virsh net-list fonctionne en tant qu'utilisateur non root et pas besoin de spécifier --connect

1voto

bk1e Points 13737

Il est possible de configurer virsh pour fonctionner avec un utilisateur local. Plus d'informations sont disponibles ici :

https://major.io/2015/04/11/run-virsh-and-access-libvirt-as-a-regular-user/

Essentiellement, vous devez configurer une règle polkit et vous connecter au démon libvirtd

0voto

thrig Points 1524

À partir de la documentation, root est (surtout) requis, et virsh discute avec un démon (et ne fouine pas manuellement dans les fichiers du répertoire /etc/libvirt, ce qu'un strace ou sysdig confirmera) :

   La plupart des opérations virsh reposent sur la capacité de la librairie libvirt à se connecter à un service libvirtd déjà en cours d'exécution.  Cela peut généralement être fait en utilisant la commande service libvirtd start.

   La plupart des commandes virsh nécessitent des privilèges de root pour s'exécuter en raison des canaux de communication utilisés pour parler à l'hyperviseur.  Lancer en tant que non-root renverra une erreur.

Alors pourquoi virsh list ne renvoie pas d'erreur peut être soit un bug, soit nécessiter une clarification dans la page de manuel de virsh(1)...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X