Proxmox VEIX · Virtual MachinesVM lifecycle
VM snapshots: mechanics, cost and limits
What you'll learn
- Name the snapshot mechanism used by each PVE storage backend and its cost profile
- Decide when a snapshot needs vmstate and what that costs in time and space
- Explain why a long-lived snapshot is a growing liability rather than a fixed one
- State the four specific failures a snapshot cannot protect against
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
Snapshots are the most-used and least-understood VM feature in Proxmox. They take one click, they are instant, and the consequences of keeping one arrive weeks later as a storage incident that nobody connects to the click.
Two things make this lesson necessary rather than obvious. First, the cost of a snapshot is entirely a property of the storage backend underneath it, and those costs differ by more than an order of magnitude. Second, Proxmox VE 9 changed the capability matrix substantially, so advice written for PVE 8 is now wrong in a way that matters.
Which backends support snapshots, in PVE 9
| Storage | Plugin | Level | Shared | Snapshots |
|---|---|---|---|---|
| ZFS (local) | zfspool | both | no | yes |
| Directory | dir | file | no | yes, qcow2 only |
| BTRFS | btrfs | file | no | yes (technology preview) |
| NFS | nfs | file | yes | yes, qcow2 only |
| CIFS | cifs | file | yes | yes, qcow2 only |
| CephFS | cephfs | file | yes | yes |
| Ceph/RBD | rbd | block | yes | yes |
| LVM | lvm | block | no | yes, as volume chains since PVE 9 |
| LVM-thin | lvmthin | block | no | yes |
| iSCSI/kernel | iscsi | block | yes | yes, as volume chains since PVE 9 |
| iSCSI/libiscsi | iscsidirect | block | yes | yes, as volume chains since PVE 9 |
| FC/SAS | native | block | yes | yes, as volume chains since PVE 9 |
| ZFS over iSCSI | zfs | block | yes | yes |
| Proxmox Backup | pbs | both | yes | n/a |
Two footnotes from that table carry real operational weight.
On file-based storages, snapshots require the qcow2 format — using
either the internal snapshot function or snapshots as volume chains. A VM disk
stored as raw on a directory or NFS storage cannot be snapshotted at all.
That is a decision made when the disk was created, and it is the single most
common reason the snapshot button is greyed out.
Since Proxmox VE 9, snapshots as volume chains are available for VMs on LVM, iSCSI and FC/SAS. This is new. The mechanism uses separate volumes for the snapshot data and layers them, which is a different thing from traditional LVM snapshots — those caused significant I/O degradation and are the reason a generation of operators learned “never snapshot on shared SAN”.
Two kinds of snapshot: with and without vmstate
set -euo pipefail
VMID=118
# Disk-only. Instant on ZFS or RBD; the guest keeps running.
qm snapshot "$VMID" pre-upgrade \
--description 'before app 4.2 upgrade, CHG-20260812-004'
# Disk plus live memory state. The guest is paused while RAM is written out.
qm snapshot "$VMID" pre-upgrade-live \
--vmstate 1 \
--description 'includes RAM, rollback resumes mid-run'
qm listsnapshot "$VMID"# qm listsnapshot 118`-> pre-upgrade 2026-08-12 09:14:07 before app 4.2 upgrade, CHG-20260812-004
`-> pre-upgrade-live 2026-08-12 09:21:55 includes RAM, rollback resumes mid-run
`-> current now You are here!Illustrative output
| Disk-only | With --vmstate | |
|---|---|---|
| Guest impact when taken | None on ZFS/RBD; a pause on qcow2 file storage | Paused while RAM is serialised |
| Time to take | Milliseconds to seconds | Proportional to allocated RAM |
| Extra space | Divergence only | Divergence plus a full copy of RAM |
| State after rollback | Guest boots as if it had crashed at that instant | Guest resumes exactly where it was |
| Consistency | Crash consistent | The running state, including in-memory data |
--vmstate is the right choice for “I am about to try something and I want to
be exactly here again if it goes wrong” — an upgrade rehearsal, a
configuration experiment, a support-directed change. It is the wrong choice for
a routine safety net, because a 64 GiB guest writes 64 GiB every time.
Rollback, and what it destroys
set -euo pipefail
VMID=118
# Look before you leap: which snapshot, taken when, and what is under it.
qm listsnapshot "$VMID"
# The guest must be stopped unless the snapshot carries vmstate.
qm shutdown "$VMID" --timeout 300
# --start brings the VM up immediately after the rollback.
qm rollback "$VMID" pre-upgrade --start 1Snapshot is not backup: the four failures
This slogan gets repeated without its content. Here is the content — the specific failures a snapshot does not survive.
| Failure | Backup survives it | Snapshot survives it |
|---|---|---|
| Storage pool or datastore is lost | Yes, the copy is elsewhere | No — the snapshot is on the pool that just died |
| The VM is deleted | Yes | No — snapshots are deleted with the VM |
| Ransomware with hypervisor access | Yes, if the credential cannot prune | No — snapshots are deletable by anyone who can manage the VM |
| Corruption discovered after retention | Yes, if retention is long enough | No — snapshot retention is whatever you remembered to keep |
| Guest-level mistake found within minutes | Yes, slowly | Yes, in seconds |
The last row is the honest case for snapshots, and it is a good one. A snapshot taken two minutes before a risky change and rolled back three minutes later is the fastest recovery mechanism you have. That is what it is for.
What it is not is a copy. It shares fate with the storage, the VM and the cluster. Every reason a backup exists is a reason a snapshot is not one.
set -euo pipefail
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
qm listsnapshot "$vmid" 2>/dev/null \
| grep -v 'You are here' \
| sed -n 's/^[[:space:]`|>-]*\([^[:space:]]*\)[[:space:]]*\([0-9-]* [0-9:]*\).*/\1 \2/p' \
| while read -r name when; do
[ -n "$when" ] || continue
age=$(( ( $(date +%s) - $(date -d "$when" +%s) ) / 86400 ))
if [ "$age" -gt 7 ]; then
printf 'VM %-6s snapshot %-24s %3d days old\n' "$vmid" "$name" "$age"
fi
done
doneKnowledge check
Knowledge check · 4 questions
Q1. The snapshot button is greyed out for a VM whose disk lives on an NFS storage. What is the most likely cause?
Q2. On a chain-based snapshot backend, the risk grows mainly with how old the snapshot is rather than with how many snapshots are stacked.
Q3. Which failures does a VM snapshot fail to protect against? Select all that apply.
Q4. When is --vmstate the right choice for a snapshot?
Passing score: 75%. Answers are checked in this browser.