跳转到内容

VirtIO 驱动与 QEMU Guest Agent ​

这是两个不同的东西,但都属于「装完系统必做」,而且都容易被跳过。跳过的代价是:磁盘和网络性能打折,以及 PVE 看不到客户机的状态。

VirtIO 是什么 ​

虚拟机的硬件有两种实现方式:

模拟真实硬件(如 E1000 网卡、IDE 磁盘):客户机以为自己在和一块真的 Intel 网卡说话,QEMU 在背后逐条翻译。兼容性最好,性能开销大——每一次 IO 都要经过完整的模拟层。

半虚拟化(VirtIO):客户机知道自己是虚拟机,直接用为虚拟化设计的接口和宿主机通信。少了一整层模拟,性能高得多。代价是客户机需要有 VirtIO 驱动。

设备模拟方案VirtIO 方案
磁盘IDE / SATAVirtIO SCSI(推荐)或 VirtIO Block
网卡E1000 / RealtekVirtIO (paravirtualized)
内存气球无VirtIO Balloon
随机数无VirtIO RNG

Linux 客户机:驱动已经内置 ​

好消息:主流 Linux 发行版的内核里已经包含 VirtIO 驱动,什么都不用装。装系统时就能认到 VirtIO 磁盘和网卡。

Linux 客户机只需要装 guest agent:

sh
# 在虚拟机内部执行

# Debian / Ubuntu
apt update && apt install -y qemu-guest-agent

# RHEL / Rocky / AlmaLinux
dnf install -y qemu-guest-agent

# Alpine
apk add qemu-guest-agent

启用并启动:

sh
# 在虚拟机内部执行
systemctl enable --now qemu-guest-agent
systemctl status qemu-guest-agent

极少数老系统认不到 VirtIO

十年前的发行版、或者某些精简内核,可能确实没有 VirtIO 驱动。症状是装系统时看不到硬盘。解决办法:临时把磁盘总线改成 SATA、网卡改成 E1000 装好系统,之后再考虑要不要切回 VirtIO(切回需要客户机内部有驱动)。

Windows 客户机:需要手动提供驱动 ​

Windows 安装程序不认识 VirtIO 磁盘,装的时候会告诉你找不到任何驱动器。

准备 virtio-win ISO ​

从 Fedora 项目的官方渠道下载 virtio-win.iso(这是 Red Hat 维护的官方 Windows VirtIO 驱动包)。搜索 "virtio-win iso download fedorapeople" 能找到官方发布页。

只从官方渠道下载驱动

驱动运行在内核态。从来路不明的网站下载 Windows 驱动,风险等级和下载来路不明的系统镜像一样。

上传到 local 的 ISO 目录。

给虚拟机挂两个光驱 ​

创建 Windows 虚拟机时(或创建后在 Hardware 页):

  1. 一个 CD/DVD 驱动器挂 Windows 安装 ISO。
  2. 再加一个 CD/DVD 驱动器挂 virtio-win.iso。

安装过程中加载驱动 ​

Windows 安装到「你想将 Windows 安装在哪里」这一步时,列表是空的:

  1. 点 加载驱动程序。
  2. 浏览到 virtio-win 光驱。
  3. 进入 vioscsi\<你的Windows版本>\amd64\ 目录(例如 vioscsi\2k22\amd64\)。
  4. 选中并安装。磁盘就出现了。

网卡驱动同理,在 NetKVM\<版本>\amd64\ 下。

装完系统之后 ​

进入 Windows,打开 virtio-win 光驱,运行里面的 virtio-win-guest-tools.exe。它会一次性装好:

  • 所有 VirtIO 驱动(网卡、气球、串口等)
  • QEMU Guest Agent

装完重启,Windows 这边就齐了。

忘了装驱动、系统已经装好了怎么办

如果当初用 SATA + E1000 把 Windows 装好了,想切到 VirtIO,不能直接改总线(改完会蓝屏,因为系统盘的驱动没加载)。

稳妥做法:

  1. 先给虚拟机临时加一块小的 VirtIO SCSI 磁盘。
  2. 开机,让 Windows 认到这块盘并装上驱动。
  3. 关机,删掉临时磁盘,把系统盘的总线改成 SCSI。
  4. 开机,应该能正常启动。

这个操作前先打快照。

QEMU Guest Agent 能做什么 ​

Agent 是跑在客户机里的一个小服务,通过虚拟串口和宿主机通信。装了它,PVE 才能:

能力没有 agent 时
在 Summary 里显示客户机 IP显示不出来
正常关机(Shutdown)只能发 ACPI 信号,客户机可能不理会
备份前冻结文件系统备份的是「崩溃一致」状态,恢复后可能要修文件系统
执行客户机内命令(qm guest exec)不可用

备份一致性是最重要的那一条

没有 agent 时,快照模式的备份相当于「在运行中直接拍一张磁盘照片」——等同于客户机突然断电。数据库和正在写入的文件可能处于不一致状态。

有 agent 时,PVE 会先让客户机把缓存刷盘并冻结文件系统,拍完再解冻。这是 agent 最值得装的理由。详见备份与恢复。

PVE 9.2 新增:控制文件系统冻结(freeze-fs) ​

agent 选项在 9.2 里新增了一个子选项 freeze-fs(默认开启),专门控制备份(快照模式)、克隆、不带内存的快照、复制这几类操作要不要向客户机发送 guest-fsfreeze-freeze / guest-fsfreeze-thaw 命令——也就是前面表格里说的"备份前冻结文件系统"这件事。旧的 freeze-fs-on-backup 和 guest-fsfreeze 名字被保留为别名,继续可用。

什么时候需要关掉它

个别客户机的 fsfreeze 支持不稳定(比如某些 FreeBSD 系客户机),会导致备份任务日志里反复出现 fsfreeze 相关的警告,甚至拖慢备份。这种情况下可以针对这台客户机单独关闭:

sh
# 在宿主机 shell 执行
qm set <vmid> --agent enabled=1,freeze-fs=0

关掉的代价:这台客户机的备份、克隆、快照会退回到本文前面表格里"没有 agent"时的水平——"崩溃一致"而不是"应用一致",恢复后可能需要文件系统自检或者数据库自我修复。只在确认这台客户机的 fsfreeze 确实有问题、且能接受这个代价时才关,不要为了让日志清净就全局关闭。

任务日志现在也会明确写出"发起了冻结/解冻命令"这一步,方便确认某次备份到底有没有拿到一致性保证。

验证 agent 工作正常 ​

在宿主机执行:

sh
qm agent <vmid> ping

没有输出(正常返回)说明通了。报 QEMU guest agent is not running 说明客户机里的服务没跑起来,或者 PVE 侧没开启 agent 选项。

看客户机的网络信息:

sh
qm agent <vmid> network-get-interfaces

能列出客户机的网卡和 IP,说明一切正常。

检查结果 ​

对每台虚拟机确认:

  1. 虚拟机 → Summary 页面能看到 IP 地址。
  2. 虚拟机 → Hardware,磁盘总线是 SCSI、网卡 Model 是 VirtIO。
  3. qm agent <vmid> ping 无报错。
  4. 点 Shutdown 能在合理时间内正常关机(不需要 Stop)。

四项都过,这台虚拟机就配置到位了。

常见问题 ​

勾了 Qemu Agent 但客户机里没装,有什么后果? 关机会卡到超时才强制执行,备份也拿不到一致性冻结。装上就好,或者在 Options 里把 agent 关掉。

Summary 里 IP 一直显示 -。 按顺序查:客户机里 systemctl status qemu-guest-agent 是否 active → PVE 侧 Options 里 QEMU Guest Agent 是否 Enabled → 虚拟机是否需要完整重启一次(不是重启客户机系统,是 Stop 再 Start,因为要重新挂载虚拟串口设备)。

Windows 装完 guest-tools 还是没 IP。 检查 Windows 服务里的 QEMU Guest Agent 是否正在运行,以及防火墙有没有拦。

延伸阅读 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。