Aller au contenu
English
Virtualisation medium

QEMU Guest Agent : quand l'hyperviseur doit parler à l'invité

40 min de lecture

Logo KVM

Un hyperviseur ne voit pas ce qui se passe à l'intérieur de ses machines. Il connaît le disque virtuel, pas les systèmes de fichiers ; la carte réseau, pas les adresses configurées. Le QEMU Guest Agent est le petit service qui comble cet écart : installé dans la VM, il répond aux questions de l'hôte. Sans lui, virsh domfsinfo, virsh guestinfo et surtout snapshot --quiesce échouent, et vos sauvegardes ne valent pas ce que vous croyez.

  • Distinguer le canal, posé par l'hôte, de l'agent, installé dans la VM
  • Lire les deux messages d'erreur de libvirt, qui ne disent pas la même chose
  • Installer l'agent et vérifier qu'il répond vraiment
  • Obtenir les IP réelles, les systèmes de fichiers et l'identité de l'invité
  • Comprendre ce que l'agent expose, et ce que cela implique

Ce guide suppose une VM déjà démarrée et l'accès à l'hôte avec virsh. Les sorties présentées viennent d'une machine Ubuntu 24.04 créée par virt-install sur libvirt 10, mais le mécanisme est identique sur toutes les distributions : seul le nom du paquet change.

Le canal et l'agent : deux moitiés d'un même pont

Section intitulée « Le canal et l'agent : deux moitiés d'un même pont »

C'est la confusion qui fait perdre le plus de temps sur ce sujet. Il faut deux pièces pour que l'hôte parle à l'invité, et elles s'installent à deux endroits différents :

PièceOù elle vitQui la pose
Le canal org.qemu.guest_agent.0dans le XML du domaine, côté hôtelibvirt, souvent automatiquement
Le paquet qemu-guest-agentdans le système invitévous, comme n'importe quel paquet

Vérifiez d'abord la présence du canal, côté hôte :

Fenêtre de terminal
virsh dumpxml ma-vm | grep -A3 org.qemu.guest_agent

La sortie contient un attribut qui dit tout, et que l'on oublie de lire :

<target type='virtio' name='org.qemu.guest_agent.0' state='disconnected'/>

state='disconnected' signifie que le pont est construit d'un seul côté. Le canal existe, mais personne ne répond au bout. C'est l'état normal d'une VM fraîchement créée, tant que le paquet n'est pas installé dans l'invité.

Les deux erreurs de libvirt, et ce qu'elles vous disent

Section intitulée « Les deux erreurs de libvirt, et ce qu'elles vous disent »

Quand une commande qui a besoin de l'agent échoue, libvirt renvoie l'un de deux messages distincts. Les confondre envoie chercher au mauvais endroit :

MessageCe qui manqueOù corriger
QEMU guest agent is not configuredle canal, absent du XMLsur l'hôte, virsh edit puis arrêt et redémarrage
QEMU guest agent is not responding: ... is not connectedle paquet, absent de l'invitédans la VM, installer qemu-guest-agent

Le second est de loin le plus fréquent. Voici ce que donne une VM dont le canal existe mais dont l'invité n'a pas l'agent, commande par commande :

$ virsh domifaddr ma-vm --source agent
error: Guest agent is not responding: QEMU guest agent is not connected
$ virsh domfsinfo ma-vm
error: Unable to get filesystem information
error: Guest agent is not responding: QEMU guest agent is not connected
$ virsh snapshot-create-as ma-vm --name snap --disk-only --quiesce
error: Guest agent is not responding: QEMU guest agent is not connected

Ces échecs sont une bonne nouvelle. libvirt refuse plutôt que de vous rendre un résultat dégradé : un --quiesce qui échouerait en silence vous laisserait croire à une sauvegarde cohérente qui n'en est pas une.

L'installation se fait dans la machine invitée, pas sur l'hôte. Le paquet porte le même nom sur toutes les grandes familles, et le service démarre seul.

  1. Installer le paquet dans la VM

    Fenêtre de terminal
    sudo apt install -y qemu-guest-agent # Debian, Ubuntu
    sudo dnf install -y qemu-guest-agent # RHEL, Rocky, Alma, Fedora
  2. Vérifier que le service tourne

    Fenêtre de terminal
    systemctl is-active qemu-guest-agent

    La réponse attendue est active. Sur la plupart des images cloud, le service démarre immédiatement, sans action supplémentaire.

  3. Revenir sur l'hôte et constater la bascule

    Fenêtre de terminal
    virsh dumpxml ma-vm | grep -oE "state='(dis)?connected'"

    L'attribut est passé à state='connected', et cela sans redémarrer la machine : le canal était déjà là, il vient simplement de trouver son interlocuteur.

  4. Confirmer par un aller-retour

    Fenêtre de terminal
    virsh qemu-agent-command ma-vm '{"execute":"guest-ping"}'

    La réponse {"return":{}} est laconique mais sans ambiguïté : l'agent a reçu la demande et a répondu.

Les quatre commandes ci-dessous échouaient toutes une minute plus tôt. C'est le meilleur moyen de comprendre ce que l'agent apporte réellement.

Fenêtre de terminal
virsh domifaddr ma-vm --source agent
Name MAC address Protocol Address
-------------------------------------------------------------------------------
lo 00:00:00:00:00:00 ipv4 127.0.0.1/8
enp1s0 52:54:00:79:88:c6 ipv4 192.168.122.39/24
- - ipv6 fe80::5054:ff:fe79:88c6/64

Comparez avec la source par défaut, qui lit les baux DHCP de libvirt : elle ne connaît que vnet33, le nom de l'interface côté hôte, une seule adresse IPv4, et rien du tout si la VM utilise une adresse statique ou un réseau en bridge. L'agent, lui, donne le nom réel de l'interface dans le système, enp1s0, et les adresses IPv6.

Fenêtre de terminal
virsh domfsinfo ma-vm
Mountpoint Name Type Target
-------------------------------------
/ vda1 ext4 vda
/boot vda16 ext4 vda
/boot/efi vda15 vfat vda

L'hôte voit un disque virtuel ; l'agent lui apprend son découpage et le type de chaque système de fichiers. C'est ce qui permet de savoir quoi geler au moment d'une sauvegarde, et de repérer un /boot saturé sans ouvrir de session.

Fenêtre de terminal
virsh guestinfo ma-vm
os.pretty-name : Ubuntu 24.04.5 LTS
os.kernel-release : 6.8.0-139-generic
timezone.name : UTC
hostname : kvmdoc-agent

Sur un parc de machines, c'est un inventaire obtenu sans se connecter nulle part : version exacte du système, noyau en cours, nom d'hôte réel, fuseau horaire. La commande virsh domtime complète le tableau en donnant l'horloge de l'invité, utile pour repérer une dérive après une suspension.

C'est la fonction la plus importante, et celle dont dépend toute sauvegarde sérieuse. L'agent sait demander au noyau invité de suspendre les écritures le temps de prendre une image :

Fenêtre de terminal
virsh domfsfreeze ma-vm # Froze 2 filesystem(s)
virsh domfsthaw ma-vm # Thawed 2 filesystem(s)

Vous n'aurez presque jamais à les taper : c'est exactement ce que fait --quiesce en interne, en encadrant la prise du snapshot.

Fenêtre de terminal
virsh snapshot-create-as ma-vm --name avant-maj --disk-only --quiesce

virsh shutdown demande par défaut un arrêt par ACPI, l'équivalent d'un appui sur le bouton d'alimentation : le système invité est libre de l'ignorer. Avec l'agent, l'ordre passe par un canal que l'invité traite comme une demande d'arrêt véritable :

Fenêtre de terminal
virsh shutdown ma-vm --mode agent

Sur un serveur sans interface graphique, où aucun gestionnaire de session n'écoute les événements ACPI, c'est souvent la différence entre une machine qui s'arrête et une machine qui reste allumée jusqu'au destroy.

Installer l'agent donne à l'hôte des moyens d'action à l'intérieur de l'invité : lire des informations, geler des systèmes de fichiers, et selon la configuration, exécuter des commandes ou lire des fichiers. Ce n'est pas un problème dans le cas normal, où l'administrateur de l'hyperviseur est déjà celui des machines : qui contrôle l'hôte peut de toute façon lire les disques.

Cela le devient dans un contexte d'hébergement multi-locataire, où le propriétaire de la VM n'est pas celui de l'hôte. libvirt permet alors de désactiver les commandes sensibles de l'agent, par la ligne BLACKLIST_RPC du fichier /etc/sysconfig/qemu-ga sur les distributions RHEL, ou son équivalent /etc/default/qemu-guest-agent, en passant l'option --block-rpcs au service. Les fonctions d'inventaire et de gel restent disponibles, celles qui exécutent du code ne le sont plus.

SymptômeCause probableVérification
is not configuredcanal absent du XMLvirsh dumpxml ma-vm | grep guest_agent
is not connectedpaquet absent dans l'invitésystemctl is-active qemu-guest-agent dans la VM
state='disconnected' persistantservice arrêté ou VM jamais redémarrée après ajout du canalsystemctl status qemu-guest-agent
domifaddr vide sans --source agentIP statique ou réseau bridgerelancer avec --source agent
L'agent répond, --quiesce échouesystème de fichiers non gelablevirsh domfsinfo pour voir les types montés

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • Il faut deux pièces : le canal dans le XML côté hôte, le paquet dans l'invité. L'une sans l'autre ne sert à rien.
  • L'attribut state='connected' du canal est la preuve que les deux moitiés se sont trouvées, et il bascule sans redémarrer la machine.
  • Les deux messages d'erreur ne désignent pas le même manque : not configured vise l'hôte, not connected vise l'invité.
  • L'agent donne les adresses réelles, y compris IPv6 et sur réseau bridge, là où la source DHCP ne voit que ses propres baux.
  • Sans agent, --quiesce échoue au lieu de produire une sauvegarde qui semblerait bonne. C'est le comportement souhaitable.
  • virsh shutdown --mode agent arrête une machine que l'ACPI seul laisserait allumée.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn