Libvirt utilise l'agent invité Qemu exécuté à l'intérieur d'une machine virtuelle. Cet article expliquera comment l'agent Qemu agit comme un canal de communication entre l'hôte KVM et l'invité.
Protocole de communication
Le protocole de communication utilisé pour récupérer les informations du système d'exploitation VM ou émettre des commandes vers le système d'exploitation invité est Qemu Machine Protocol (QMP). QMP est un protocole basé sur JSON.
Par exemple, libvirt utilise l'agent invité pour récupérer les détails du système de fichiers de l'invité. Pour vérifier si l'agent invité fonctionne :
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
Par exemple :
# virsh qemu-agent-command TestVM '{"execute": "guest-get-host-name"}' --pretty Please enter your authentication name: vdsm@ovirt Please enter your password: { "return": { "host-name": "<VM FQDN>" }
# virsh qemu-agent-command TestVM '{"execute": "guest-get-osinfo"}' --pretty Please enter your authentication name: vdsm@ovirt Please enter your password: { "return": { "name": "Oracle Linux Server", "kernel-release": "4.14.35-1902.300.11.el7uek.x86_64", "version": "7.8", "variant": "Server", "pretty-name": "Oracle Linux Server 7.8", "version-id": "7.8", "variant-id": "server", "kernel-version": "#2 SMP Tue Mar 17 17:11:47 PDT 2020", "machine": "x86_64", "id": "ol" } }
Méthode de communication
La communication entre l'agent invité et l'hôte se fait via le canal virtio-serial et isa-serial org.qemu.guest_agen.0.
– Depuis l'invité VM, voici le processus qemu.guest_agent :
# ps auxwww |grep guest root 811 0.0 0.0 44232 4572 ? Ss Feb22 0:51 /usr/bin/qemu-ga --method=virtio-serial --path=/dev/virtio -ports/org.qemu.guest_agent.0 --blacklist=guest-file-open,guest-file-close,guest-file-read,guest-file-write,guest-file-seek ,guest-file-flush,guest-exec,guest-exec-status -F/etc/qemu-ga/fsfreeze-hook
– Depuis l'hôte, un fichier de socket correspondant sera également créé dans /var/lib/libvirt/qemu/channels/
# file /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.ovirt.hosted-engine-setup.0 /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.ovirt.hosted-engine-setup.0: socket
# virsh -r dumpxml TestVM |grep guest_agent <source mode='bind' path='/var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.qemu.guest_agent.0'/> <target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
Si la communication est correcte, le socket UNIX a une connexion "ESTAB" :
# ss |grep guest_agent u_str ESTAB 0 0 /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.qemu.guest_agent.0 82797274 * 82971852 u_str ESTAB 0 0 /var/lib/libvirt/qemu/channels/9c798303-1c30-4965-b447-e1c12588db14.org.qemu.guest_agent.0 82944156 * 82971680
Intervalle de communication
Par défaut, VDSM interroge l'agent invité QEMU (qemu-ga) toutes les 5 minutes pour récupérer des informations. Si l'agent invité QEMU ne s'exécute pas et répond dans les 5 minutes, libvirtd signalera l'erreur du type "L'agent invité ne répond pas :l'agent invité QEMU n'est pas connecté"
Autres
Le sous-réseau de QMP appelé hmp est également disponible. "qemu-monitor-command" a la capacité d'échanger des informations au format "hmp" par les options -hmp. Pour vérifier l'état du port virtio-série connecté à l'ovirt-guest-agent :
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
Par exemple :
# virsh qemu-monitor-command --hmp TestVM 'info qtree' Please enter your authentication name: vdsm@ovirt Please enter your password: dev: virtserialport, id "channel1" chardev = "charchannel1" nr = 2 (0x2) name = "org.qemu.guest_agent.0" port 2, guest on, host on, throttle off