RHV - Qemu 客户代理的理解

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