Libvirt verwendet den Qemu-Gast-Agent, der in einer VM ausgeführt wird. In diesem Beitrag wird erläutert, wie der Qemu-Agent als Kommunikationskanal zwischen dem KVM-Host und dem Gast fungiert.
Kommunikationsprotokoll
Das zum Abrufen von Informationen des VM-Betriebssystems oder zum Ausgeben von Befehlen an das Gast-Betriebssystem verwendete Kommunikationsprotokoll ist Qemu Machine Protocol (QMP). QMP ist ein JSON-basiertes Protokoll.
Beispielsweise verwendet libvirt den Gast-Agenten, um Dateisystemdetails vom Gast abzurufen. So überprüfen Sie, ob der Gast-Agent funktioniert:
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
Zum Beispiel:
# 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" } }
Kommunikationsmethode
Die Kommunikation zwischen Gastagent und Host erfolgt über den virtio-serial und den isa-serial Kanal org.qemu.guest_agen.0.
– Vom VM-Gast, hier ist der Prozess 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
– Vom Host wird auch eine entsprechende Socket-Datei in /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'/>
Wenn die Kommunikation in Ordnung ist, hat der UNIX-Socket eine ‘ESTAB’-Verbindung:
# 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
Kommunikationsintervall
Standardmäßig fragt VDSM den QEMU-Gast-Agent (qemu-ga) alle 5 Minuten ab, um Informationen abzurufen. Wenn der QEMU-Gast-Agent nicht läuft und innerhalb von 5 Minuten antwortet, meldet libvirtd einen Fehler wie „Gast-Agent antwortet nicht:QEMU-Gast-Agent ist nicht verbunden“
Andere
Das Subnetz von QMP mit dem Namen „hmp“ ist ebenfalls verfügbar. „qemu-monitor-command“ hat die Fähigkeit, Informationen im „hmp“-Format durch -hmp-Optionen auszutauschen. So überprüfen Sie den Status des virtio-serial-Ports, der mit dem ovirt-guest-agent verbunden ist:
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
Zum Beispiel:
# 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