Everyone has backups until they need to restore. Then they discover: the backup never completed, the retention deleted what they needed, or worse — they’ve never actually tested a restore.
Proxmox Backup Server (PBS) is excellent backup software. Deduplication, incremental forever, encryption, verification. But software doesn’t matter if your process is broken.
A backup exists only after a successful restore test. Everything else is hope.
Why Proxmox Backup Server
PBS is purpose-built for Proxmox VE:
- Incremental forever: Only changed blocks transfer after first backup
- Deduplication: Identical data stored once, even across VMs
- Encryption: Client-side encryption, PBS never sees plaintext
- Verification: Built-in integrity checking
- Pruning: Automatic retention policies
Compared to vzdump-to-NFS:
- 10x less storage for typical workloads (dedup)
- 5x faster backups (incremental)
- Actual verification (not just “file exists”)
Installing PBS
Dedicated Machine (Recommended)
PBS should run on separate hardware. If your Proxmox host dies, your backups shouldn’t die with it.
# Download PBS ISO from proxmox.com# Install on dedicated hardware or VM (on different host)
# After install, configure networknano /etc/network/interfaces
# Update repositories (same as PVE)mv /etc/apt/sources.list.d/pbs-enterprise.list /etc/apt/sources.list.d/pbs-enterprise.list.disabledecho "deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription" > /etc/apt/sources.list.d/pbs-no-subscription.listapt update && apt full-upgrade -yAccess web UI at https://<pbs-ip>:8007
PBS as VM on Proxmox
Acceptable for homelab, not ideal:
# Create VM for PBSqm create 999 --name pbs --memory 4096 --cores 2 \ --net0 virtio,bridge=vmbr0 \ --scsi0 local-zfs:32 \ --cdrom local:iso/proxmox-backup-server.isoCritical: Store PBS VM on different storage than what you’re backing up. If your main storage fails, PBS VM should survive.
Storage Configuration
Datastore Setup
PBS organizes backups into datastores:
# Create datastore directorymkdir -p /backup/datastore1
# Via web UI: Administration → Storage/Disks → Directory → Create: Datastore
# Or via CLIproxmox-backup-manager datastore create store1 /backup/datastore1Storage Sizing
Deduplication means storage math is different:
Without dedup: 10 VMs × 100GB × 30 backups = 30TBWith dedup: 10 VMs × 100GB × 30 backups ≈ 500GB - 2TBActual ratio depends on:
- How similar VMs are (templates = high dedup)
- How much data changes between backups
- How many retention points
Start with 2x your VM total size, monitor, adjust.
Connecting Proxmox VE to PBS
Add PBS to Proxmox
On Proxmox VE:
# Add PBS storagepvesm add pbs pbs-store \ --server 10.0.0.50 \ --datastore store1 \ --username backup@pbs \ --password \ --fingerprint <fingerprint>Get fingerprint from PBS:
# On PBSproxmox-backup-manager cert info | grep FingerprintOr via Web UI: Datacenter → Storage → Add → Proxmox Backup Server
Create Backup User
On PBS, create dedicated backup user:
# Create userproxmox-backup-manager user create backup@pbs
# Create API token (more secure than password)proxmox-backup-manager user generate-token backup@pbs automation
# Grant permissionsproxmox-backup-manager acl update / Datastore.Backup --auth-id backup@pbsUse API token in Proxmox connection.
Backup Jobs
Manual Backup
# Backup single VMvzdump 100 --storage pbs-store --mode snapshot
# Backup multiple VMsvzdump 100 101 102 --storage pbs-store --mode snapshotScheduled Backups
Via Web UI: Datacenter → Backup → Add
Storage: pbs-storeSchedule: 01:00 (daily at 1 AM)Selection mode: Include all (or specific VMs)Mode: SnapshotCompression: ZSTDOr via CLI:
# Create backup jobpvesh create /cluster/backup --storage pbs-store --schedule "0 1 * * *" --all 1 --mode snapshot --compress zstdBackup Modes
| Mode | Description | Downtime | Consistency |
|---|---|---|---|
| Snapshot | Atomic snapshot, VM keeps running | None | Good |
| Suspend | Pause VM, backup, resume | Seconds | Better |
| Stop | Shutdown, backup, start | Minutes | Best |
Recommendation: Use snapshot mode. If you need perfect consistency, use application-level tools (database dumps, etc.) before backup.
Retention Policies
Retention determines how many backups to keep. PBS supports GFS (Grandfather-Father-Son):
Keep last: 3 # Always keep last 3 backupsKeep hourly: 24 # Keep 24 hourly backupsKeep daily: 7 # Keep 7 daily backupsKeep weekly: 4 # Keep 4 weekly backupsKeep monthly: 6 # Keep 6 monthly backupsKeep yearly: 2 # Keep 2 yearly backupsThis gives you:
- Recent: Multiple restore points
- Medium-term: Daily granularity
- Long-term: Monthly/yearly for compliance
Configure Retention on Proxmox
In backup job configuration:
# Edit backup jobpvesh set /cluster/backup/<jobid> --prune-backups keep-last=3,keep-daily=7,keep-weekly=4,keep-monthly=6Prune Schedule on PBS
PBS runs pruning automatically. Check/configure:
# On PBSproxmox-backup-manager prune-job listproxmox-backup-manager prune-job create store1 --schedule "daily"Verification
Backups without verification are hopes, not backups.
Automatic Verification
PBS can verify backups automatically:
# On PBS - create verification jobproxmox-backup-manager verify-job create store1 \ --schedule "weekly" \ --outdated-after 7This reads all backup chunks and verifies checksums. Catches:
- Bit rot
- Storage corruption
- Incomplete backups
Manual Verification
# Verify specific backupproxmox-backup-client verify <backup-id>
# Verify all backups in datastoreproxmox-backup-manager verify store1Restore Testing
Verification proves data integrity. Restore testing proves you can actually recover.
Schedule Regular Restore Tests
Monthly restore drill:
- Pick a random VM backup
- Restore to temporary VM
- Boot it, verify it works
- Delete temporary VM
- Document the test
# Restore to new VMqmrestore pbs-store:backup/vm/100/2025-01-08T01:00:00Z 900 --storage local-zfs
# Boot and verifyqm start 900
# After verificationqm stop 900qm destroy 900Restore Test Checklist
Date: 2025-01-08Backup tested: vm/100/2025-01-08T01:00:00ZOriginal VM: web-server (100)Restored as: test-restore (900)
[ ] Restore completed without errors[ ] VM boots successfully[ ] Services start (nginx, database, etc.)[ ] Application responds (curl localhost)[ ] Data integrity (sample data check)[ ] Time to restore: 5 minutes
Tested by: AdminResult: PASSEncryption
For off-site backups, enable encryption:
Generate Key
# On Proxmoxproxmox-backup-client key create /etc/pve/priv/backup-key.enc
# Protect the key!cp /etc/pve/priv/backup-key.enc /secure/location/Configure Encrypted Backups
# Add PBS storage with encryptionpvesm add pbs pbs-encrypted \ --server 10.0.0.50 \ --datastore store1 \ --username backup@pbs \ --encryption-key /etc/pve/priv/backup-key.enc \ --fingerprint <fingerprint>Critical: If you lose the encryption key, backups are unrecoverable. Store key securely, separately from backups.
Monitoring Backups
Check Backup Status
On Proxmox:
# List recent backupspvesh get /nodes/pve1/storage/pbs-store/content
# Check backup job statuspvesh get /cluster/backupOn PBS:
# Datastore statusproxmox-backup-manager datastore list
# Recent backup tasksproxmox-backup-manager task listAlerting
Configure email alerts on PBS:
# Set notification emailproxmox-backup-manager acl update / --notify admin@example.comKey alerts:
- Backup job failures
- Verification failures
- Datastore space warnings
- Pruning issues
Disaster Scenarios
Scenario: VM Accidentally Deleted
# List available backupspvesh get /nodes/pve1/storage/pbs-store/content --vmid 100
# Restoreqmrestore pbs-store:backup/vm/100/2025-01-08T01:00:00Z 100Recovery time: Minutes.
Scenario: Proxmox Host Failed
# On new/rebuilt host, add PBS storagepvesm add pbs pbs-store ...
# List available backupspvesh get /nodes/pve2/storage/pbs-store/content
# Restore all VMspvesh get /nodes/pve2/storage/pbs-store/content --output-format json | \ jq -r '.[] | "\(.volid) \(.vmid)"' | \ while read volid vmid; do qmrestore "$volid" "$vmid" doneRecovery time: Hours (depends on VM count and size).
Scenario: PBS Server Lost
This is why you need off-site copies:
# If you have replication to second PBS# Use backup PBS as primary
# If no replication... restore from:# - Off-site tape/cloud# - Secondary backup system# - Old-school vzdump filesOff-Site Backups
PBS-to-PBS replication:
# On source PBS, create sync jobproxmox-backup-manager sync-job create remote-sync \ --store store1 \ --remote pbs-remote \ --remote-store offsite \ --schedule "daily"This syncs deduplicated data to remote PBS. Only changed chunks transfer.
The Lesson
A backup exists only after a successful restore test.
Having backup software running is step one. Having backups completing is step two. But the backup doesn’t exist until you’ve proven you can restore from it.
The process:
- Configure: PBS, jobs, retention
- Automate: Scheduled backups, verification
- Test: Monthly restore drills
- Document: What was tested, what was the result
- Improve: Fix issues found during tests
The companies that recover from disasters aren’t the ones with the best backup software. They’re the ones who practiced recovery before they needed it.