QEMU Guest Agent

允我心安 提交于 2020-08-11 02:39:31

目录

QEMU Guest Agent

QEMU Guest Agent,简称 QGA,是运行在 QEMU 虚拟机内部的一个守护程序 qemu-guest-agent.service,类似于 VMware tools,主要用于辅助 Hypervisor 实现对 Guest 的管理。

官方网站:

  • https://wiki.qemu.org/Features/GuestAgent
  • https://wiki.libvirt.org/page/Qemu_guest_agent

QEMU 通过建立 Host 和 Guest 之间的一个数据通道(channel)来实现两者之间的通讯功能,继而增强 Host 对 Guest 的控制能力。这种通讯方式是不依赖与网络的,而是依赖于 virtio-serial(默认首选方式)或者 isa-serial,在 Domain XML 文件中称为 org.qemu.guest_agent.0。QEMU 提供了串口设备的模拟及数据交换的通道,最终呈现出来的是一个串口设备(Guest)和一个 UNIX Socket 文件(Host)。

<channel type=‘unix‘>
   <source mode=‘bind‘ path=‘/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000011.sock‘/>
      <target type=‘virtio‘ name=‘org.qemu.guest_agent.0‘/>
   <address type=‘virtio-serial‘ controller=‘0‘ bus=‘0‘ port=‘1‘/>
</channel>

QGA 通过读写串口设备与 Host UNIX Socket 进行交互,在宿主机上则通过常规的方式对 UNIX Socket 文件进行读写,最终实现两者的交互,交互的协议与 qmp(QEMU Monitor Protocol)相同,简单的说就是使用 JSON 格式进行数据交换。串口设备的速率通常都较低,所以比较适合小数据量的交换。

Libvrit 也提供了专门的 virDomainQemuAgentCommand API,在终端中通过 virsh qemu-agent-command 指令暴露,与 QGA 进行通信和操作,常用于实现 QEMU Guest 的监控和后台管理,例如:修改虚拟机的密码。

virsh qemu-agent-command <domain> '{"execute":"guest-ping"}'
virsh qemu-agent-command <domain> '{"execute":"guest-info"}'
virsh qemu-agent-command <domain> '{"execute":"guest-network-get-interfaces"}'
virsh reboot --mode agent <domain>

# 修改密码
virsh qemu-agent-command <domain> '{"execute":"guest-set-user-password","arguments":{"username":"admin","password":"cGFzc3cwcmQ=","crypted":false}}'
# or
virsh set-user-password --domain <domain> --user admin --password cGFzc3cwcmQ=

安装 QGA

手动安装:

$ yum install qemu-guest-agent
$ setenforce 0
$ systemctl restart qemu-guest-agent.service

在 OpenStack 环境中,自 L 版起支持自动安装,只需要为 Image 设置 hw_qemu_guest_agent 属性即可:

nova image-meta <image-id> set hw_qemu_guest_agent=yes

# or
glance image-create --name cirros
--disk-format raw
--container-format bare
--file cirros-0.3.3-x86_64-disk.raw
--public
--property hw_qemu_guest_agent=yes
--progress

# or
openstack image set --property hw_qemu_guest_agent=yes <image-id>

然后就可以使用 novaclient 修改虚拟机密码了,详见 https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/libvirt-set-admin-password.html:

openstack server set --root-password <passwd>

QGA 接口

NOTE:不同的 GuestOS 具有不同的指令支持程度,这里需要注意,Windows OS 因为是闭源的操作系统,所以支持有限,详见:https://fedoraproject.org/wiki/Windows_Virtio_Drivers.

  • guest-sync-delimited:宿主机发送一个 Int 数字给 QGA,QGA 返回这个数字,并且在后续返回字符串响应中加入 ascii 码为 0xff 的字符,其作用是检查宿主机与 QGA 通信的同步状态,主要用在宿主机上多客户端与 QGA 通信的情况下客户端间切换过程的状态同步检查,比如:有两个客户端 A、B,QGA 发送给 A 的响应,由于 A 已经退出,目前 B 连接到 QGA,所以这个响应可能被 B 收到,如果 B 连接后,立即发送该请求给 QGA,响应中加入了这个同步码就能区分是 A 的响应还是 B 的响应。在 QGA 返回宿主机客户端发送的 Int 数字之前,QGA 返回的所有响应都要忽略。

  • guest-sync:同上,只是不在响应中加入 0xff 字符。

  • guest-ping:Ping the guest agent, a non-error return implies success。

  • guest-get-time:获取虚拟机时间(返回值为相对于 1970-01-01 in UTC,Time in nanoseconds)。

  • guest-set-time:设置虚拟机时间(输入为相对于 1970-01-01 in UTC,Time in nanoseconds)。

  • guest-info:返回 QGA 支持的所有命令。

  • guest-shutdown:关闭虚拟机,支持 halt、powerdown、reboot 方式,默认为 powerdown。

  • guest-file-open:打开虚拟机内的某个文件(返回文件句柄)。

  • guest-file-close:关闭打开的虚拟机内的文件。

  • guest-file-read:根据文件句柄读取虚拟机内的文件内容(返回 base64 格式的文件内容)。

  • guest-file-write:根据文件句柄写入文件内容到虚拟机内的文件。

  • guest-file-seek:Seek to a position in the file, as with fseek(), and return the current file position afterward. Also encapsulates ftell()'s functionality, just Set offset=0, whence=SEEK_CUR。

  • guest-file-flush:Write file changes bufferred in userspace to disk/kernel buffers。

  • guest-fsfreeze-status:Get guest fsfreeze state. error state indicates。

  • guest-fsfreeze-freeze:Sync and freeze all freezable, local guest filesystems。

  • guest-fsfreeze-thaw:Unfreeze all frozen guest filesystems。

  • guest-fstrim:Discard (or “trim”) blocks which are not in use by the filesystem。

  • guest-suspend-disk*:Suspend guest to disk。

  • guest-suspend-ram*:Suspend guest to ram。

  • guest-suspend-hybrid:Save guest state to disk and suspend to ram(This command requires the pm-utils package to be installed in the guest.)。

  • guest-network-get-interfaces:Get list of guest IP addresses, MAC addresses and netmasks。

  • guest-get-vcpus:Retrieve the list of the guest’s logical processors。

  • guest-set-vcpus:Attempt to reconfigure (currently: enable/disable) logical processors inside the guest。

利用 QGA 的 OpenStack 云主机监控方案

上述可知,OpenStack 对 QGA 的支持以及由来已久了,详见:

  • https://specs.openstack.org/openstack/nova-specs/specs/kilo/implemented/quiesced-image-snapshots-with-qemu-guest-agent.html
  • https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent

这里以 OpenStack 云主机的监控方案为例,思路:首先为每个虚拟机增加 virtio-serial 配置并启动 QGA 守护进程。然后在宿主机上运行 Monitor 服务进程,通过与 QGA 交互获取虚拟机的监控信息。

  • 云主机创建流程中的监控相关操作:
    在这里插入图片描述

  • Monitor 服务单次监控信息获取及推送流程
    在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!