Libvirt 使用在 VM 内运行的 Qemu 来宾代理。
这篇文章将详细说明 Qemu 代理如何充当 KVM 主机和来宾之间的通信通道。
https://onitroad.com 更多教程
通讯间隔
默认情况下,VDSM 每 5 分钟轮询 QEMU 客户代理 (qemu-ga) 以获取信息。
如果 QEMU 客户代理没有运行并在 5 分钟内响应,libvirtd 将报告类似“客户代理没有响应:QEMU 客户代理未连接”的错误
其他
QMP 的名为“hmp”的子网也可用。
“qemu-monitor-command”具有通过 -hmp 选项以“hmp”格式交换信息的能力。
要检查连接到 ovirt-guest-agent 的 virtio-serial 端口的状态:
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
例如:
# 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
通讯方式
来宾代理和主机之间的通信通过 virtio-serial 和 isa-serial 通道 org.qemu.guest_agen.0 进行。
从 VM 来宾,这里是 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
从主机上,也会在 /var/lib/libvirt/qemu/channels/.org.ovirt.hosted-engine-setup.0 中创建相应的套接字文件:
# 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'/>
如果通信正常,则 UNIX 套接字具有 '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
通讯协议
用于获取 VM OS 信息或者向 Guest OS 执行命令的通信协议是 Qemu 机器协议(QMP)。
QMP 是一种基于 JSON 的协议。
例如,libvirt 使用来宾代理从来宾中获取文件系统详细信息。
要检查访客代理是否正常工作:
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
例如:
# 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" } }
日期:2020-09-17 00:12:54 来源:oir作者:oir