外观
看懂任务日志与系统日志
备份失败了、虚拟机启动报错了,第一件事是找对日志。PVE 有好几个入口,这篇讲清楚每个入口看的是什么、什么时候该去哪儿找。
为什么需要它
Web UI 里点开一个失败的任务,能看到一段报错;但很多问题(服务崩溃、内核消息、网络异常)不会出现在任务日志里,得去系统日志或 journalctl 找。搞混这几个入口,经常是「明明出了问题却什么都查不到」的原因。
开始之前
- 任务日志和系统日志都能在 Web UI 里看,不需要 SSH。
journalctl需要宿主机 shell(Web UI 的 Shell 按钮或 SSH 均可,以 root 执行)。- 集群环境要注意:一个任务的日志记录在发起这个任务的节点上,不一定是任务实际操作的目标节点。
三个入口
| 入口 | 在哪看 | 适合查 |
|---|---|---|
| 任务日志(Task History) | 数据中心 → 任务 或 节点 → 任务 | 备份、迁移、创建/删除客户机、快照等由 PVE 发起的具体操作 |
| 系统日志(System Log) | 节点 → 系统日志 | 该节点上系统级别的事件,底层就是 journalctl 的 Web 呈现 |
journalctl | 宿主机 shell | 比系统日志页面更灵活,能按服务、按级别、按时间窗口过滤,也是唯一能看历史启动记录的方式 |
三者不是互相独立的三份数据
系统日志页面本质是 journalctl 的图形化视图,两者内容一致,命令行只是筛选更方便。任务日志则是单独的一套记录,专门对应「点了一个按钮、跑了一个任务」这类操作。
任务日志怎么用
数据中心 → 任务列出所有任务,可以按节点、按类型(如 vzdump、qmigrate)筛选。点开一条能看到完整输出,失败的任务会标红并停在报错那一行。
每个任务有一个唯一标识 UPID,形如:
text
UPID:pve1:00001486:0000055C:63BD11C8:vzdump:100:root@pam:依次是:节点名、进程号、进程启动时间、任务发起时间、任务类型(这里是 vzdump 备份)、操作对象(这里是虚拟机 100)、发起用户。只看类型和对象两段,通常就能猜到这是哪次操作。
命令行也能查任务,适合写脚本或者 Web UI 打不开的时候用:
sh
# 宿主机 shell
pvenode task list --errors # 只看失败的任务
pvenode task list --vmid 100 # 只看某台客户机相关的任务
pvenode task log <完整UPID> # 看某个任务的完整输出也可以用 pvesh 直接查 API:
sh
pvesh get /cluster/tasks --output-format=json-pretty系统日志 / journalctl 怎么用
节点 → 系统日志能直接浏览,适合大概翻一眼最近发生了什么。需要精确过滤时用命令行:
sh
# 只看某个服务
journalctl -u pveproxy -n 100 --no-pager
journalctl -u pvedaemon -n 100 --no-pager
journalctl -u pvestatd -n 100 --no-pager
# 只看错误级别以上,本次启动以来
journalctl -p err -b --no-pager
# 看某个时间段
journalctl --since "2026-09-20 08:00" --until "2026-09-20 09:00"
# 实时跟随
journalctl -fPVE 的核心服务:pve-cluster(提供 /etc/pve)、pvedaemon(处理需要 root 权限的 API 调用,只监听本机)、pveproxy(对外的 8006 端口,转发到 pvedaemon)、pvestatd(采集状态和指标)。某个功能整体不工作时,先查对应服务是不是在跑:
sh
systemctl status pve-cluster pvedaemon pveproxy pvestatd常见排查场景
备份失败了,任务日志里只有几行看不懂的报错。 先看任务日志里的最后几行,通常会指出是存储空间不足、目标存储不可达,还是客户机内部快照失败。如果任务日志信息不够,再去查对应时间段的系统日志,搜索存储或网络相关的报错。
虚拟机启动不了,任务日志显示 QEMU 报错。 这类报错通常已经比较具体(设备冲突、镜像找不到等),任务日志里的报错原文本身就是最有效的排查起点,可以直接拿去对照 虚拟机开不了机 或搜索报错关键字。
任务在别的节点上,本节点任务日志里找不到。 去发起任务的那个节点查——迁移、跨节点备份等操作的任务记录留在触发它的节点上。
想知道某次重启前后发生了什么。 journalctl --list-boots 列出历史的每一次启动,再用 journalctl -b -1(上一次启动)之类的参数看对应那次的完整日志。
检查结果
拿一次最近的失败任务练手:能在任务日志里找到它、读懂报错原文的大意,并且能用 journalctl 定位到同一时间点系统日志里的相关记录。能做到这一步,说明这两个入口已经会用了。
常见问题
任务日志列表很长,找不到想要的那条。 用节点、日期范围筛选,或者知道大概的操作类型(备份用 vzdump、迁移用 qmigrate)时直接用 pvenode task list 加过滤条件。
journalctl 输出信息太多。 优先加 -u <服务名> 限定服务、-p err 限定级别、--since/--until 限定时间段,三者组合通常能把输出缩小到可读的范围。
系统日志占用磁盘越来越大。 属于容量管理范畴而不是排查本身,参考健康检查清单里关于日志清理的部分。