跳转至

QEMU Guest Agent 配置

QEMU Guest Agent 是一个运行在虚拟机(Guest)上的守护进程,它允许主机(Host)通过 QEMU 的虚拟通道(virtio channels)获取关于虚拟机状态和执行某些操作的命令。这使得主机能够执行诸如获取虚拟机磁盘使用情况、获取网络信息、挂载/卸载ISO映像等操作,而无需在虚拟机内部执行。这对于自动化管理和监控任务非常有用

安装 QEMU Guest Agent

首先,需要在虚拟机上安装 QEMU Guest Agent。安装步骤取决于操作系统。

对于 Linux 虚拟机

  1. Ubuntu/Debian 系统‌:

    Bash
    sudo apt-get update
    sudo apt-get install qemu-guest-agent
    
  2. CentOS/RHEL 系统‌:

    Bash
    sudo yum install qemu-guest-agent
    
  3. 运行服务

    Bash
    1
    2
    3
    4
    5
    6
    # 检查服务状态
    systemctl status qemu-guest-agent
    
    # 如果未运行,启动服务
    systemctl start qemu-guest-agent
    systemctl enable qemu-guest-agent
    

在宿主机

Bash
# 查看虚拟机配置是否包含guest agent通道,(Rocky-template 是虚拟机名字)
virsh dumpxml Rocky-template | grep -A 5 -B 5 guest_agent

# 或者查看整个devices部分
virsh dumpxml Rocky-template | grep -A 100 "<devices>"

# 正确的配置应该包含:
<channel type='unix'>
  <source mode='bind'/>
  <target type='virtio' name='org.qemu.guest_agent.0'/>
  <address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>

如果没有配置,添加Guest Agent支持

Bash
1
2
3
4
5
6
7
8
9
# 编辑虚拟机配置
virsh edit Rocky-1

# 在 <devices> 部分添加:
    <channel type='unix'>
      <source mode='bind'/>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>

重启虚拟机以使配置生效

Bash
virsh destroy Rocky-template
virsh start Rocky-template

# 在宿主机测试agent
virsh qemu-agent-command Rocky-template '{"execute":"guest-ping"}'

# 尝试获取网络信息
virsh qemu-agent-command Rocky-template '{"execute":"guest-network-get-interfaces"}'

# 默认网络,使用domifaddr也可以查看IP地址
virsh domifaddr Rocky-template

查看qemu-guest-agent工具信息

Bash
# 列出版本与支持的命令
virsh qemu-agent-command ubuntu-1 '{"execute":"guest-info"}' | jq -r '.return.supported_commands[]'
virsh qemu-agent-command ubuntu-1  '{"execute":"guest-info"}'|jq
{
  "return": {
    "version": "8.2.2",
    "supported_commands": [
      {
        "enabled": true,
        "name": "guest-get-cpustats",
        "success-response": true
      },
      {
        "enabled": true,
        "name": "guest-get-diskstats",
        "success-response": true
      },
      {
        "enabled": true,
        "name": "guest-ssh-remove-authorized-keys",
        "success-response": true
      },
....

常用命令

Bash
# 系统信息类
# 获取主机名 - 基本都支持
virsh qemu-agent-command Rocky-1 '{"execute":"guest-get-host-name"}'

# 获取用户列表 - 基本都支持
virsh qemu-agent-command Rocky-1 '{"execute":"guest-get-users"}'

# 获取时区信息
virsh qemu-agent-command Rocky-1 '{"execute":"guest-get-timezone"}'

# 获取操作系统信息
virsh qemu-agent-command Rocky-1 '{"execute":"guest-get-osinfo"}'

# 网络类
# 获取网络接口信息 - 基本都支持
virsh qemu-agent-command Rocky-1 '{"execute":"guest-network-get-interfaces"}'

# 文件系统类
# 文件系统冻结/解冻 - 用于创建一致性快照
virsh qemu-agent-command Rocky-1 '{"execute":"guest-fsfreeze-freeze"}'
virsh qemu-agent-command Rocky-1 '{"execute":"guest-fsfreeze-thaw"}'

# 获取文件系统信息
virsh qemu-agent-command Rocky-1 '{"execute":"guest-get-fsinfo"}'

# 系统控制类
# 安全关机/重启
virsh qemu-agent-command Rocky-1 '{"execute":"guest-shutdown", "arguments":{"mode":"powerdown"}}'
virsh qemu-agent-command Rocky-1 '{"execute":"guest-shutdown", "arguments":{"mode":"reboot"}}'