Skip to main content
RunBook Academy

Proxmox VEXIX · TroubleshootingEvidence and escalation

Collecting evidence: pvereport, logs and the task model

Advanced⏱ ~28 minpvereportjournalctlpvesh

What you'll learn

  • Run pvereport at the right moment and know what it contains
  • Map a symptom to the daemon whose log will answer it
  • Find a task log on disk when the GUI cannot show it
  • Preserve volatile evidence before it is lost to a reboot or a log rotation
  • Assemble a support package that answers the first three questions before they are asked

Prerequisites

Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12

Not yet marked complete on this device.

Most Proxmox incidents are diagnosed twice. Once badly, in the moment, with whatever was to hand; and once properly, three days later, from evidence that no longer exists.

The methodology lesson gave you an order to think in. This one is about the raw material: what to capture, from where, and — the part that is nearly always skipped — when.

Evidence has a shelf life

EvidenceSurvives a reboot?Survives a week?
The task log of a failed operationyes, on diskusually
journalctl outputyes, only if persistent journald is enableddepends on retention
The current state of a hung process, its stack, its open filesnono
dmesg ring bufferno — the journal keeps a copy if persistentno
Ceph health detail at the moment of the faultnono
Which storages were active, which mounts existednono
The output of pvereportyes, if you saved ityes

The rows that say “no” are the reason for this lesson. A node that is behaving strangely right now contains information that a rebooted node does not, and the instinct under pressure is to reboot first.

pvereport

pvereport collects the state of a node into one stream: version information, storage configuration and status, network configuration, cluster state, disk and filesystem layout, and guest configuration. It is exposed on the API as /nodes/{node}/report, and in the GUI as Node → Summary → System Report.

Read-only / Safecollect a node report while the fault is present
OUT="/root/pvereport-$(hostname)-$(date +%F-%H%M).txt"

pvereport > "$OUT"

wc -l "$OUT"
grep -n '^# ' "$OUT" | head -40
Read-only / Safe
$ grep -n '^# ' /root/pvereport-pve-a2-2026-08-12-0314.txt | head -20
12:# pveversion --verbose
58:# cat /etc/hostname
61:# cat /etc/hosts
72:# cat /etc/network/interfaces
118:# ip -details -statistics address
203:# dmesg
2891:# lscpu
2934:# pvesubscription get
2947:# cat /etc/pve/storage.cfg
2999:# pvesm status
3021:# lsblk --ascii
3078:# zpool status
3115:# pvecm status
3161:# ha-manager status
3190:# qm list

Which daemon answers which question

This is the map worth memorising, because picking the wrong log costs more time than any other mistake in Proxmox troubleshooting.

SymptomAsk this unitWhy
Web interface unreachable, TLS error, 596pveproxyIt terminates the public API and web UI on 8006
API call fails, task fails to start, permission errorpvedaemonThe local API worker that actually executes
Status figures stale or missing in the GUIpvestatdIt collects node, guest and storage status
/etc/pve read-only, config write failspve-clusterThe pmxcfs daemon
Node left or rejoined the cluster, quorum changedcorosyncMembership and the totem ring
A guest migrated on its own, a node fencedpve-ha-crm, pve-ha-lrmThe cluster and local HA managers
A backup or replication job did not runpveschedulerIt triggers scheduled jobs
A VM died and PVE reactedqmeventdIt watches QEMU process events
SPICE console failsspiceproxyThe SPICE side of console access
Ceph anythingceph-mon@, ceph-osd@, ceph-mgr@Plus ceph -s and ceph health detail
Read-only / Saferead the right log, scoped to the incident window
SINCE="2026-08-12 02:50:00"
UNTIL="2026-08-12 03:30:00"

journalctl -u pveproxy --since "$SINCE" --until "$UNTIL" -o short-precise

journalctl -u pve-cluster -u corosync --since "$SINCE" --until "$UNTIL" -o short-precise

journalctl --since "$SINCE" --until "$UNTIL" -p err -o short-precise

The last of those — everything at priority err or above across all units — is the single best first command when you do not yet know which subsystem is at fault. It is short, it is rarely empty during an incident, and it usually names the unit you should have asked.

Task logs

Every operation PVE performs — a backup, a migration, a start, a snapshot — is a task with a UPID, and each task’s output is written to disk on the node that ran it, under /var/log/pve/tasks/. Part XX covers the UPID structure; what matters here is retrieval.

Read-only / Safefind a task and read its log
NODE="$(hostname)"

pvesh get "/nodes/$NODE/tasks" --limit 25 --output-format json \
| jq -r '.[] | [.starttime, .type, .id, (.status // "running"), .upid] | @tsv'

UPID="UPID:pve-a2:0000A1B2:0123CDEF:68A9B0C1:vzdump:141:root@pam:"
pvesh get "/nodes/$NODE/tasks/$UPID/log" --output-format json | jq -r '.[].t'
Read-only / Safewhen the API is down, read the task log from disk
ls -lt /var/log/pve/tasks/ | head

grep -rl 'vzdump:141' /var/log/pve/tasks/ 2>/dev/null | head

tail -50 /var/log/pve/tasks/active

Key takeaways

  • Evidence has a shelf life. Process state, mounts, ring buffers and live task output do not survive a reboot; task logs and a saved pvereport do.
  • pvereport collects versions, network, storage, cluster, disk and guest state into one readable stream, sectioned by the command that produced each part. Run it while the fault is present, and save it to /root.
  • Review a pvereport before sending it outside the organisation — it describes your infrastructure in detail.
  • Map the symptom to the daemon: pveproxy for the web interface, pvedaemon for API and task execution, pvestatd for stale GUI figures, pve-cluster for /etc/pve, corosync for membership, pve-ha-* for fencing and automatic migrations, pvescheduler for jobs that did not run.
  • journalctl --since ... --until ... -p err across all units is the best first command when the subsystem is unknown.
  • Check that journald is persistent on every node now. A volatile journal means a reboot destroys the incident.
  • Task logs live under /var/log/pve/tasks/ on the node that ran the task. A migration has two, and the destination’s usually has the real reason. Use /cluster/tasks to find which node to look at.
  • A support package is pvereport, pveversion -v from every node, the scoped journal, the task log, and a narrative that includes what changed in the preceding week.

Knowledge check

Knowledge check · 5 questions

  1. Q1. A node is up but behaving strangely, and restarting it will probably clear the symptom. What is the highest-value action first?

  2. Q2. The GUI shows question marks over every guest and storage on one node, but guests are running normally and the API responds. Which daemon should you look at?

  3. Q3. A migration fails with a generic error. Which statements about finding the real cause are correct? Select all that apply.

  4. Q4. Because systemd keeps logs, journalctl output from before an incident is always available after a reboot.

  5. Q5. You are opening a support case for an intermittent fault that has now cleared. Which single piece of evidence is most likely to be missing and most costly to lack?

Passing score: 75%. Answers are checked in this browser.