跳转至

Qemu Guest Agent

  1. 为了更好地管理虚拟机,需要有某种机制与虚拟机内部进行通信,这样既能获取虚拟机的状态信息、性能数据等,同时也可以向虚拟机发出指令,如挂起、恢复、迁移等。
  2. VMware通过在虚拟机中安装VMware Tools实现,Hyper-V通过在虚拟机中安装Hyper-V Integration Services,KVM则需要安装Qemu Guest Agent并正确运行,除此之外还需要为kvm虚拟机配置virtio串行控制器
  3. 虚拟机上存在一个名为channel qemu-ga的设备是Qemu Guest Agent这个程序正确运行的必要前提。因为virsh 和virt-manager等基于libvirt的程序与虚拟机通信是通过virtio串行控制器设备进行的。
  4. qemu-ga通道设备的名字,org.qemu.guest_agent.0 ,虚拟机内部的设备文件 /dev/virtio-ports/org.qemu.guest_agent.0
    ls -l /dev/virtio-ports/org.qemu.guest_agent.0 
    lrwxrwxrwx 1 root root 11 Jun  5  2023 /dev/virtio-ports/org.qemu.guest_agent.0 -> ../vport2p1
    

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通道设备,可参考下图
add_qemu_channel.png

Windows虚拟机安装qemu-guest-agent

安装 qemu-ga-x86_64.msi,这个包可以在 virtio-win-xx.iso中找到,高版本的也可以正常运行,如直接用`virtio-win-0.1.190.iso`中的。
在制作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 DriverVirtIO Balloon Driver的驱动状态都是正常的,如若不正常,或者在"其他设备"中仍然有未知设备,则需要安装好驱动才行。

qemu_driver.png

在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 客户机代理附加到正在运行的虚拟机