Backups & PBS
vzdump decides how to read a consistent image of a guest without stopping it for long. Proxmox Backup Server decides how to store it: split into chunks, named by their SHA-256, stored once no matter how many backups refer to them. Together they turn nightly full backups into “read what changed, send what's new”. vzdump modes: what the guest feels
Clean shutdown gives a fully consistent image. The backup starts while the VM is off, then the VM boots again and runs while the job keeps reading.
Kept for compatibility: suspends the VM, then does a snapshot-mode backup. Longer pause than snapshot mode, no real consistency gain. Use snapshot.
Live backup. With the guest agent (agent: 1), filesystems are frozen for a moment (guest-fsfreeze-freeze/thaw) so the image is file-system consistent.
How snapshot mode works with no storage snapshot
Snapshot mode without a snapshot: copy-before-write
Press ▶ to start a snapshot-mode backup, then click blocks to make the guest write.
Chunks: the unit of everything in PBS
PBS: fixed chunks, dirty bitmap, dedup, GC
The VM has never been backed up. Press “backup” for the first, full run.
Fixed chunks for disks, dynamic chunks for files
Why file archives use dynamic chunks
Insert one line at the top. Fixed boundaries all shift, so every later chunk looks new and gets uploaded again. With content-defined boundaries, cut points depend on the bytes around them, not on their offset, so after the edit the boundaries fall back into the same places and the rest of the stream deduplicates. A block device doesn't shift its data around, so VM images use fixed 4 MiB chunks; a file archive does, so .pxar uses dynamic ones.
Retention: which backups survive
Prune simulator
Trusting the backups
.bad and the snapshot is flagged, so the next backup re-uploads the data. Schedule it: bit rot is silent until restore day.pvesr sends incremental ZFS snapshots of local disks to another node every few minutes so HA or migration can start there with little data loss. It mirrors mistakes too: a deleted file or ransomware arrives on the replica at the next sync. Use it next to backups, not instead.| vzdump → local / NFS | vzdump → PBS | pvesr replication | |
|---|---|---|---|
| unit | .vma.zst / .tar.zst file per run | chunks + index per snapshot | ZFS snapshot on another node |
| incremental | no, full every time | yes (dirty bitmap + dedup) | yes (zfs send -i) |
| history | per retention | per retention, cheap | only latest (+ few snaps) |
| survives a bad delete | yes | yes | no, replicated next sync |
| restore speed | full read | full read, or live-restore / single file | instant: start from replica |
Commands and files
# attach a PBS datastore as storage (client-side encryption key generated on the PVE side)
pvesm add pbs pbs1 --server 10.0.0.5 --datastore store1 \
--username backup@pbs --password '...' \
--fingerprint 'ab:cd:...:ef' --encryption-key autogen
# one-off backup, live, with fleecing on fast local storage
vzdump 100 --mode snapshot --storage pbs1 \
--fleecing enabled=1,storage=local-lvm --notes-template '{{guestname}}'
# local file backup instead (one .vma.zst / .tar.zst per run, no dedup)
vzdump 200 --mode snapshot --storage local --compress zstd
pvesm list pbs1 --vmid 100 # what's there
qmrestore pbs1:backup/vm/100/2026-10-03T21:00:02Z 100 --storage ceph-vm# /etc/pve/jobs.cfg (Datacenter → Backup)
vzdump: backup-nightly
schedule 21:00
all 1
mode snapshot
storage pbs1
fleecing enabled=1,storage=local-lvm
notes-template {{guestname}}
prune-backups keep-last=3,keep-daily=7,keep-weekly=4,keep-monthly=6
enabled 1/mnt/datastore/store1/
├── .chunks/ # 65536 prefix dirs: 0000 … ffff
│ ├── 3fa1/3fa1c9…e2 # one file per unique chunk, named by SHA-256
│ └── …
├── vm/100/2026-10-03T21:00:02Z/
│ ├── index.json.blob # manifest (signed if encrypted)
│ ├── qemu-server.conf.blob
│ └── drive-scsi0.img.fidx # fixed index: list of chunk digests
└── ct/200/2026-10-03T21:05:40Z/
└── root.pxar.didx # dynamic index: digests + offsets# file-level backup of any Linux host (dynamic chunks, .pxar)
export PBS_REPOSITORY='backup@pbs@10.0.0.5:store1'
proxmox-backup-client backup root.pxar:/ etc.pxar:/etc --keyfile ~/.pbs.key
proxmox-backup-client snapshot list
proxmox-backup-client prune host/web01 --keep-daily 7 --keep-weekly 4 --dry-run
# on the PBS server
proxmox-backup-manager garbage-collection start store1
proxmox-backup-manager verify store1
proxmox-backup-manager remote create offsite --host pbs2.example.com \
--auth-id sync@pbs --password '...' --fingerprint '...'
proxmox-backup-manager sync-job create offsite-pull --store store1 \
--remote offsite --remote-store store1 --schedule 'daily'- why it mattersUse snapshot mode for VMs: QEMU's copy-before-write gives a point-in-time image with no downtime. Add the guest agent for filesystem consistency and fleecing when the backup target is slow.
- why it mattersPBS stores chunks, not files. Every backup is logically full but physically incremental, so you can keep long histories cheaply and restore any point without a chain.
- why it mattersPrune deletes indexes; GC frees space later. Verify and sync jobs are what make a backup trustworthy: an unverified, single-copy backup is a hope, not a plan.