← All notes
Proxmox & Virtualization

Proxmox VE: collecting evidence before rebooting a frozen Windows VM

A production incident-response runbook for preserving host, QEMU, task and storage evidence before resetting an unresponsive Windows guest.

Status: currentPublished: 2026-09-15Updated: 2026-09-15

Tested on: Proxmox VE 9.x · Windows Server guests · systemd journal

Context

A frozen Windows VM creates pressure to restore service quickly, but an immediate reboot destroys some of the most useful evidence.

The right first question is not “how do I restart it?” but “what can I still capture before I change the state?”

This runbook focuses on the Proxmox side of the incident. It is designed for cases where a Windows guest becomes unresponsive or partially responsive while the Proxmox node itself is still reachable.

The examples use sanitized VM IDs and time ranges. Replace them with the actual incident data.

Objectives

Before rebooting or resetting the guest, try to preserve evidence for these questions:

Do not turn evidence collection into a long outage. The goal is a compact, repeatable capture before state is destroyed.

First rule: record the incident window

Write down the best known start time and the time the problem was confirmed.

Example:

incident_start=2026-08-03 21:30
incident_end=2026-08-03 23:00
vmid=522
node=pve-node09

An approximate window is still useful. It allows later comparison between user reports, Proxmox tasks, QEMU logs and host-level warnings.

Use the same time window consistently throughout the investigation.

Confirm the VM and node

From any cluster node:

pvesh get /cluster/resources --type vm | grep -E '(^|[[:space:]])522([[:space:]]|$)'

On the hosting node:

qm status 522
qm config 522

Capture the configuration before making changes. Important details include:

Do not assume the VM is on the node where it normally runs. Verify the current owner first.

Capture cluster and node health

A guest freeze can be a symptom of a host or storage problem, so capture the wider platform state before focusing only on Windows.

pvecm status
pvesm status

If Ceph is used:

ceph -s

Capture basic host pressure:

uptime
free -h
df -h

For a quick view of scheduler and I/O pressure:

vmstat 1 5

If iostat is installed:

iostat -xz 1 5

The purpose is not to prove the root cause immediately. It is to preserve whether the host looked normal or overloaded at the same time as the guest failure.

Confirm that the QEMU process still exists

A VM can appear running in Proxmox while its userspace process is unhealthy or waiting on a lower layer.

Locate the process:

pgrep -af 'kvm.*-id 522|qemu-system.*-id 522'

Or inspect the PID file:

cat /run/qemu-server/522.pid 2>/dev/null

Then inspect the process:

PID="$(cat /run/qemu-server/522.pid 2>/dev/null)"
ps -o pid,ppid,stat,etime,%cpu,%mem,wchan:32,cmd -p "$PID"

The process state and wchan can be useful when QEMU is blocked in kernel I/O rather than consuming CPU normally.

Do not attach debuggers or send signals as a first step unless the incident requires deeper live analysis. Start with read-only inspection.

Capture Proxmox task history

Look for operations involving the VM around the incident window.

A cluster task query is useful for recent activity:

pvesh get /cluster/tasks --vmid 522 --limit 50

Look for:

If a task looks relevant, record its UPID and inspect its log before rebooting the guest.

Task correlation matters because an apparent “random” freeze may line up with backup, migration or storage operations that are otherwise forgotten after service is restored.

Search the host journal for the VM and QEMU

Use a narrow incident window first.

journalctl \
  --since '2026-08-03 21:30:00' \
  --until '2026-08-03 23:00:00' \
  --no-pager | \
grep -Ei 'VM 522|:522:|qemu.?522|qm(stop|shutdown|reset|start).*522'

Then search the same window for host-level failure indicators:

journalctl \
  --since '2026-08-03 21:30:00' \
  --until '2026-08-03 23:00:00' \
  --no-pager | \
grep -Ei 'watchdog|oom|out of memory|hung task|blocked for more than|i/o error|input/output error|timeout|reset|nvme|scsi|rbd|ceph|nfs|zfs'

Avoid searching the entire journal first. A tight window reduces unrelated noise and makes later incident review reproducible.

Inspect kernel messages separately

Kernel-level symptoms are especially important for storage stalls, driver problems and OOM events.

For the current boot:

journalctl -k \
  --since '2026-08-03 21:30:00' \
  --until '2026-08-03 23:00:00' \
  --no-pager

Or filter for likely indicators:

journalctl -k \
  --since '2026-08-03 21:30:00' \
  --until '2026-08-03 23:00:00' \
  --no-pager | \
grep -Ei 'oom|hung|blocked|i/o|timeout|reset|nvme|scsi|rbd|ceph|nfs|zfs'

If the host itself was rebooted after the incident, inspect the previous boot with journalctl -b -1 as appropriate.

Check for OOM evidence

A QEMU process killed by the host OOM killer can look like a guest-side outage while the actual failure is host memory pressure.

journalctl \
  --since '2026-08-03 21:30:00' \
  --until '2026-08-03 23:00:00' \
  --no-pager | \
grep -Ei 'oom-killer|out of memory|killed process.*qemu|killed process.*kvm'

Also compare the VM memory configuration with current host pressure.

If ballooning is enabled, record that fact. Do not interpret the configured maximum memory as the only memory value relevant to the incident.

Check for blocked I/O and hung tasks

Windows guests can appear frozen when QEMU is waiting on storage rather than when Windows itself has crashed.

Host evidence may include messages such as:

Search for these indicators in the incident window before resetting the VM.

If multiple VMs on the same datastore show similar symptoms, shift the investigation toward the storage path rather than treating each guest as an independent Windows problem.

Check storage and backup overlap

If the VM disks reside on shared storage, record the storage backend state while the failure is still present.

For Proxmox storage:

pvesm status

For Ceph:

ceph -s

For a mounted NFS datastore:

findmnt -t nfs,nfs4

Check whether a backup or migration task overlapped the incident. High I/O activity is not proof of causation, but losing the timing correlation makes later analysis much weaker.

Check the QEMU Guest Agent without depending on it

If the guest agent is configured, its responsiveness is useful evidence:

qm guest cmd 522 ping

Interpret the result carefully:

Guest-agent failure alone is not proof that the whole VM is frozen.

Distinguish console, network and OS failure

Before rebooting, determine what exactly is unavailable.

Useful checks include:

This classification helps separate:

Do not collapse all of these into the single label “VM freeze”.

Optional: capture current QEMU status

For deeper incidents, the QEMU monitor can provide additional state, but use it carefully on production systems.

qm monitor 522

Read-only monitor commands can help confirm whether QEMU itself remains responsive. Avoid issuing state-changing monitor commands unless they are part of the recovery decision.

For routine incidents, host journal, task history, process state and storage health usually provide higher-value evidence with less operational risk.

Save evidence before recovery

A small evidence directory is enough.

Example:

mkdir -p /root/incidents/vm-522-20260803

Save relevant command outputs there or copy them to the incident record before rebooting.

Useful artifacts are:

Avoid collecting secrets, guest memory dumps or unrelated configuration unless the incident specifically requires them.

Decide between shutdown, stop and reset

Use the least destructive recovery action that still restores service.

If the guest agent and Windows are responsive enough, attempt a normal shutdown first:

qm shutdown 522 --timeout 60

If that fails and service impact requires recovery, the next action depends on the state and operational risk.

A hard stop or reset destroys guest-side runtime evidence and can create filesystem/application recovery work. That may still be necessary, but it should be a deliberate incident decision rather than the first diagnostic step.

Record exactly which command was used.

After recovery: preserve the timeline

Once the VM is running again, do not stop at “service restored”.

Record:

The timeline is often more valuable than any single log line.

Windows-side follow-up

After the guest is reachable, collect Windows evidence before normal event retention overwrites it.

Useful sources include:

Correlate Windows timestamps with the Proxmox host timeline. Time synchronization matters; a few minutes of clock drift can create false sequencing.

Compare with other affected VMs

If more than one VM froze during the same period, build a comparison table rather than analyzing each one in isolation.

Useful columns are:

Field Example
VM ID 522
node pve-node09
storage shared-rbd
freeze time 21:42
QEMU alive yes
guest agent no response
host OOM no
I/O warnings yes/no
overlapping backup yes/no
recovery action reset

Patterns become visible quickly when incidents are compared this way.

Three frozen Windows VMs on different nodes but the same storage path point in a different direction from three unrelated guest OS failures.

Avoid weak conclusions

Do not conclude “Windows froze” solely because RDP stopped responding.

Do not conclude “Proxmox issue” solely because the VM recovered after qm reset.

Do not conclude “storage problem” solely because a backup was running.

Each of those is a hypothesis. Preserve evidence first, then correlate timing and scope.

Minimal fast-response checklist

When outage pressure is high, capture at least this before rebooting:

qm status 522
qm config 522
pvecm status
pvesm status
pgrep -af 'kvm.*-id 522|qemu-system.*-id 522'
pvesh get /cluster/tasks --vmid 522 --limit 30
journalctl --since '-30 min' --no-pager | grep -Ei '522|qemu|oom|hung|blocked|i/o|timeout'

Then record the recovery action and exact timestamp.

This takes minutes and preserves substantially more diagnostic value than an immediate reset.

Stop conditions

Do not continue guest-level troubleshooting if evidence shows a wider infrastructure failure, for example:

At that point, protect the broader platform and treat the VM freeze as a symptom.

Operational notes

The best incident script is not the one that collects the most data. It is the one operators can run safely under pressure without changing system state.

Keep command blocks short, capture a narrow time range and separate evidence collection from recovery actions.

A reboot can restore availability while simultaneously removing the only evidence that explains why the failure happened. Preserving a few minutes of host-side state before recovery is usually worth the effort.