Qemu Guest Agent¶
- 为了更好地管理虚拟机,需要有某种机制与虚拟机内部进行通信,这样既能获取虚拟机的状态信息、性能数据等,同时也可以向虚拟机发出指令,如挂起、恢复、迁移等。
- VMware通过在虚拟机中安装VMware Tools实现,Hyper-V通过在虚拟机中安装Hyper-V Integration Services,KVM则需要安装Qemu Guest Agent并正确运行,除此之外还需要为kvm虚拟机配置virtio串行控制器。
- 虚拟机上存在一个名为channel qemu-ga的设备是Qemu Guest Agent这个程序正确运行的必要前提。因为virsh 和virt-manager等基于libvirt的程序与虚拟机通信是通过virtio串行控制器设备进行的。
- qemu-ga通道设备的名字,
org.qemu.guest_agent.0,虚拟机内部的设备文件/dev/virtio-ports/org.qemu.guest_agent.0。
Linux虚拟机安装qemu-guest-agent
# 安装
yum install qemu-guest-agent 或者 apt install qemu-guest-agent
# 修改配置,注释BLACKLIST_RPC
# vi /etc/sysconfig/qemu-ga
...
# BLACKLIST_RPC=guest-file-open,guest-file-close,guest-file-read,guest-file-write,guest-file-seek,guest-file-flush,guest-exec,guest-exec-status
# 设置开机启动即可
systemctl enable qemu-guest-agent
注:在做镜像时不需要启动qemu-guest-agent,因为可能没有添加qemu-ga通道设备,如果是创建的kvm虚拟机,需要手工添加qemu-ga通道设备,可参考下图
Windows虚拟机安装qemu-guest-agent
在制作windows7镜像时,不能使用太高版本的virtio-win来安装驱动,如virtio-win-0.1.190.iso,不然libvirt无法与qemu-guest-agent通信, 原因是高版本的VirtIO串口控制器驱动不适用于win7,目前验证过的可以使用virtio-win-0.1.135.iso,在初始化系统时, 确保在"计算机管理"-->"系统设备"中,有"PCI简易通讯控制器"未安装好驱动,可以点击"更新驱驱动程序",选择浏览方式,指定到virtio-win-0.1.135.iso的虚拟光驱中进行安装。 最终,VirtIO Serial Driver、VirtIO Balloon Driver的驱动状态都是正常的,如若不正常,或者在"其他设备"中仍然有未知设备,则需要安装好驱动才行。
在kubevirt中检查vm的QGA是否正常,可通过命令 kubectl describe vm vm-xx,能找到Type: AgentConnected,则正常运行。
或者查看vm对应的pod日志,有"Guest agent is not responding: QEMU guest agent is not connected",则表示QGA未正常运行。
# kubectl describe vm-test001
...
Status:
Conditions:
Last Probe Time: <nil>
Last Transition Time: 2023-06-05T08:14:16Z
Status: True
Type: Ready
Last Probe Time: <nil>
Last Transition Time: <nil>
Status: True
Type: LiveMigratable
Last Probe Time: <nil>
Last Transition Time: 2023-06-05T08:14:47Z
Status: True
Type: AccessCredentialsSynchronized
Last Probe Time: 2023-06-05T08:15:08Z
Last Transition Time: <nil>
Status: True
Type: AgentConnected
Created: true
Desired Generation: 1
Observed Generation: 1
Printable Status: Running
Ready: true
有了VirtIO串口控制器(在windows的设备管理器显示为 PCI简单通信控制器) 和 qemu-ga通道设备 后还需要,在虚拟机内部安装 qemu-guest-agent 和 qemu-ga软件并常驻运行
下载qemu-guest-agent for windows程序(virt-win.iso中包含了一个virtio-win-guest-tool.exe,这个程序除了包含多种virtio驱动外还包括 qemu guest agent、qemu guest agent vss provider 和spice agent 共3个代理程序,点击后默认安装即可)
若是windows server 2003 可以下载 virtio-win-0.1.100.iso或者 virtio-win-0.1.118.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/
下载qemu-ga for windows程序 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-qemu-ga/
各种花式操作 正确运行qemu-guest-agent的虚拟机
virsh shutdown vm101 --mode=agent #在内部关闭虚拟机,比--mode=acpi 更可靠(acpi高级电源管理,这也是从内部关闭虚拟机)
virsh reboot vm101 --mode agent #重启虚拟机(相当于在虚拟机内部进行重启),比 virsh reboot kvm7022 --mode acpi 更可靠
virsh domifaddr vm101 --source agent #获取虚拟机各个网卡的ip
#注意,宿主机通过qemu guest agent与虚拟机交互的范围大小和功能多少还取决于虚拟机os的版本,比如windows2003仅支持很少的命令
virsh qemu-agent-command vm101 '{"execute":"guest-info"}' #查询宿主机能通过qemu guest anget 向虚拟机发送哪些指令
virsh set-user-password vm101 --user root --password 1235678 #将vm101的root密码修改成1235678
virsh qemu-agent-command vm101 '{"execute":"guest-exec", "arguments": {"path":"systemctl", "arg":["stop", "httpd"]}}' # 停止httpd服务
https://boke.wsfnk.com/archives/986.html
注意:不管是virt-install 还是 virt-manager 还是Cockpit在创建windows虚拟机时,仅会默认配置VirtIO串口控制器设备,而没有qemu-ga通道设备,所以需要我们手动添加
命令行方式
1、普通虚拟机:在客户机的 XML 文件中添加以下内容并保存更改
2、运行中的虚拟机:
cat agent.xml¶
virsh attach-device kvm_windows2008 agent.xml #将 QEMU 客户机代理附加到正在运行的虚拟机
