Libvirt používá hostujícího agenta Qemu běžícího uvnitř virtuálního počítače. Tento příspěvek vysvětlí, jak agent Qemu funguje jako komunikační kanál mezi hostitelem KVM a hostem.
Komunikační protokol
Komunikační protokol používaný k načítání informací o VM OS nebo vydávání příkazů hostujícímu OS je Qemu Machine Protocol (QMP). QMP je protokol založený na JSON.
Například libvirt používá agenta hosta k načtení podrobností o souborovém systému od hosta. Chcete-li zkontrolovat, zda hostující agent funguje:
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
Například:
# 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" } }
Způsob komunikace
Komunikace mezi hostujícím agentem a hostitelem probíhá prostřednictvím virtio-serial a isa-serial kanálu org.qemu.guest_agen.0.
– Z VM guest je zde proces 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
– Z hostitele bude také vytvořen odpovídající soketový soubor v /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'/>
Pokud je komunikace v pořádku, soket UNIX má připojení „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
Interval komunikace
Ve výchozím nastavení VDSM dotazuje hostujícího agenta QEMU (qemu-ga) každých 5 minut, aby získal informace. Pokud hostující agent QEMU neběží a odpoví do 5 minut, libvirtd ohlásí chybu jako „Hostující agent neodpovídá:Hostující agent QEMU není připojen“
Ostatní
K dispozici je také podsíť QMP s názvem 'hmp. „qemu-monitor-command“ má schopnost vyměňovat informace ve formátu „hmp“ pomocí voleb -hmp. Chcete-li zkontrolovat stav virtio-sériového portu připojeného k ovirt-guest-agent:
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
Například:
# 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