Proxmox 启用 QEMU Guest Agent 实战指南

一、为什么要启用 QEMU Guest Agent?

在 Proxmox 中,如果你想要:

  • 母机上直接执行 VM 内命令

  • 获取 VM 内真实内存 / 磁盘 / IP

  • 支持 安全关机 / 快照一致性

  • 给监控系统(Prometheus / 自定义脚本)提供可靠数据

那么 QEMU Guest Agent(QGA)是必不可少的

❗ 只在 VM 里安装 agent 是不够的
❗ 只在母机 enable agent 也是没用的
👉 两边必须同时配置


二、整体原理(先理解 30 秒)

 
Proxmox 母机 └─ QEMU 虚拟硬件 └─ virtio-serial 通道 └─ VM 内 qemu-guest-agent 服务
  • 母机:提供通信设备(virtio-serial)

  • VM:运行 qemu-guest-agent 进程

  • 缺一不可


三、母机(Proxmox)需要做什么

1️⃣ 给 VM 启用 Guest Agent(最关键)

Proxmox 母机上执行:

 
qm set <VMID> --agent enabled=1

例如:

 
qm set 102 --agent enabled=1

2️⃣(强烈推荐)启用 serial0 socket

这是很多人卡住的关键点:

 
qm set <VMID> --serial0 socket

3️⃣ 重启 VM(必须)

 
qm stop <VMID> qm start <VMID>

⚠️ virtio-serial 设备需要在 VM 启动时注入
不重启,VM 内永远收不到 /dev/virtio-ports/org.qemu.guest_agent.0


4️⃣ 验证母机侧是否真的注入成功

 
qm showcmd <VMID> | grep -E "guest_agent|virtio-serial"

看到类似下面内容,说明 母机侧已 OK

 
-device virtio-serial -device virtserialport,name=org.qemu.guest_agent.0
 
完整脚本

#!/bin/bash

echo "==== Proxmox QEMU Guest Agent 批量配置 ===="
echo

for VMID in $(qm list | awk 'NR>1 {print $1}'); do
    echo ">>> VMID $VMID"

    CONF=$(qm config $VMID)

    NEED_RESTART=0

    # ---------- 检查并开启 agent ----------
    if ! echo "$CONF" | grep -q "^agent: enabled=1"; then
        echo "  - 启用 QEMU Guest Agent"
        qm set $VMID --agent enabled=1
        NEED_RESTART=1
    else
        echo "  - agent 已启用"
    fi

    # ---------- 检查 serial0 ----------
    if ! echo "$CONF" | grep -q "^serial0:"; then
        echo "  - 添加 serial0 socket"
        qm set $VMID --serial0 socket
        NEED_RESTART=1
    else
        echo "  - serial0 已存在"
    fi

    # ---------- 是否需要重启 ----------
    STATUS=$(qm status $VMID | awk '{print $2}')

    if [ "$NEED_RESTART" -eq 1 ]; then
        if [ "$STATUS" = "running" ]; then
            echo "  ⚠️ VM 正在运行,需要重启才能生效"
            read -p "  是否现在重启 VM $VMID ? (y/N): " ANS
            if [[ "$ANS" =~ ^[Yy]$ ]]; then
                qm stop $VMID
                qm start $VMID
                echo "  ✔ 已重启"
            else
                echo "  ⏭ 跳过重启(稍后手动重启即可)"
            fi
        else
            echo "  - VM 未运行,下次启动自动生效"
        fi
    else
        echo "  ✔ 已是正确配置"
    fi

    echo
done

echo "==== 完成 ===="
 

四、VM 内需要做什么(非常简单)

你总结得完全对 ✅
VM 内只需要做这两步即可

1️⃣ 安装 qemu-guest-agent

(Ubuntu / Debian)

 
sudo apt update sudo apt install -y qemu-guest-agent

2️⃣ 启动服务

 
sudo systemctl start qemu-guest-agent

可选但推荐:

 
sudo systemctl enable qemu-guest-agent

这样 VM 重启后 agent 会自动启动。


五、最容易踩的坑(你刚刚已经踩过)

❌ systemctl enable 报错是正常的

 
The unit files have no installation config

原因
qemu-guest-agent 是 device 依赖型服务
只要设备出现,它就会被 systemd 自动拉起

👉 不影响使用,start 成功即可


❌ VM 里 agent 已装,但母机还报:

 
No QEMU guest agent configured

原因一定是:

  • 母机没启用 --agent enabled=1

  • 或 VM 没重启

  • 或没加 serial0 socket


六、最终验证(母机上一条命令)

当一切配置正确后:

 
qm guest exec <VMID> -- free -mh

返回类似:

 
{ "exitcode": 0, "out-data": "Mem: 5.8Gi ..." }

说明:

✅ 母机 ↔ VM 通信成功
✅ Guest Agent 正在运行
✅ 可以放心写监控、脚本、自动化


七、推荐的「最小配置总结」

母机(Proxmox)

 
qm set <VMID> --agent enabled=1 qm set <VMID> --serial0 socket qm restart <VMID>

VM 内(Ubuntu / Debian)

 
sudo apt install -y qemu-guest-agent sudo systemctl start qemu-guest-agent

八、你现在可以做的事情(进阶)

启用 QGA 后,你可以在母机上直接:

 
qm guest exec 102 -- ip a qm guest exec 102 -- df -h qm guest exec 102 -- systemctl is-system-running
posted @ 2026-01-06 14:40  若-飞  阅读(90)  评论(0)    收藏  举报