目录
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 服务单次监控信息获取及推送流程
来源:oschina
链接:https://my.oschina.net/u/4290288/blog/4313872