外观
VirtIO 驱动与 QEMU Guest Agent
这是两个不同的东西,但都属于「装完系统必做」,而且都容易被跳过。跳过的代价是:磁盘和网络性能打折,以及 PVE 看不到客户机的状态。
VirtIO 是什么
虚拟机的硬件有两种实现方式:
模拟真实硬件(如 E1000 网卡、IDE 磁盘):客户机以为自己在和一块真的 Intel 网卡说话,QEMU 在背后逐条翻译。兼容性最好,性能开销大——每一次 IO 都要经过完整的模拟层。
半虚拟化(VirtIO):客户机知道自己是虚拟机,直接用为虚拟化设计的接口和宿主机通信。少了一整层模拟,性能高得多。代价是客户机需要有 VirtIO 驱动。
| 设备 | 模拟方案 | VirtIO 方案 |
|---|---|---|
| 磁盘 | IDE / SATA | VirtIO SCSI(推荐)或 VirtIO Block |
| 网卡 | E1000 / Realtek | VirtIO (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 页):
- 一个 CD/DVD 驱动器挂 Windows 安装 ISO。
- 再加一个 CD/DVD 驱动器挂 virtio-win.iso。
安装过程中加载驱动
Windows 安装到「你想将 Windows 安装在哪里」这一步时,列表是空的:
- 点 加载驱动程序。
- 浏览到 virtio-win 光驱。
- 进入
vioscsi\<你的Windows版本>\amd64\目录(例如vioscsi\2k22\amd64\)。 - 选中并安装。磁盘就出现了。
网卡驱动同理,在 NetKVM\<版本>\amd64\ 下。
装完系统之后
进入 Windows,打开 virtio-win 光驱,运行里面的 virtio-win-guest-tools.exe。它会一次性装好:
- 所有 VirtIO 驱动(网卡、气球、串口等)
- QEMU Guest Agent
装完重启,Windows 这边就齐了。
忘了装驱动、系统已经装好了怎么办
如果当初用 SATA + E1000 把 Windows 装好了,想切到 VirtIO,不能直接改总线(改完会蓝屏,因为系统盘的驱动没加载)。
稳妥做法:
- 先给虚拟机临时加一块小的 VirtIO SCSI 磁盘。
- 开机,让 Windows 认到这块盘并装上驱动。
- 关机,删掉临时磁盘,把系统盘的总线改成 SCSI。
- 开机,应该能正常启动。
这个操作前先打快照。
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,说明一切正常。
检查结果
对每台虚拟机确认:
虚拟机 → Summary页面能看到 IP 地址。虚拟机 → Hardware,磁盘总线是 SCSI、网卡 Model 是 VirtIO。qm agent <vmid> ping无报错。- 点 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 是否正在运行,以及防火墙有没有拦。