Libvirt usa el agente invitado de Qemu que se ejecuta dentro de una máquina virtual. Esta publicación explicará cómo el agente Qemu actúa como un canal de comunicación entre el host KVM y el invitado.
Protocolo de comunicación
El protocolo de comunicación utilizado para obtener información del sistema operativo de la máquina virtual o emitir comandos al sistema operativo invitado es el protocolo de máquina Qemu (QMP). QMP es un protocolo basado en JSON.
Por ejemplo, libvirt usa el agente invitado para obtener detalles del sistema de archivos del invitado. Para verificar si el agente invitado está trabajando:
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
Por ejemplo:
# 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étodo de comunicación
La comunicación entre el agente invitado y el host se realiza a través de los canales virtio-serial e isa-serial org.qemu.guest_agen.0.
– Desde el invitado de VM, aquí está el proceso 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
– Desde el host, también se creará un archivo de socket correspondiente en /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 comunicación es correcta, el socket UNIX tiene una conexión '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
Intervalo de comunicación
De forma predeterminada, VDSM sondea al agente invitado de QEMU (qemu-ga) cada 5 minutos para obtener información. Si el agente invitado de QEMU no se está ejecutando y responde en 5 minutos, libvirtd informará un error como "El agente invitado no responde:el agente invitado de QEMU no está conectado"
Otros
La subred de QMP llamada 'hmp' también está disponible. "qemu-monitor-command" tiene la capacidad de intercambiar información en formato 'hmp' mediante las opciones -hmp. Para verificar el estado del puerto virtio-serial conectado al ovirt-guest-agent:
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
Por ejemplo:
# 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