Proxmox VEXIII · Proxmox Backup ServerPBS restore
Live restore, single-file restore and the RTO arithmetic
What you'll learn
- Compute the recovery time of a full restore from datastore throughput and guest size
- Explain what live restore does, what it degrades, and what happens when it fails part-way
- Choose between full restore, live restore and single-file restore from the incident, not from habit
- Rehearse each path so the choice is made before the outage rather than during it
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
An RTO is a promise about how long a service can be gone. It is usually written by someone who has never watched a 2 TiB restore run over a 1 GbE link, and it is usually a number with no arithmetic behind it.
This lesson supplies the arithmetic, and then supplies the two mechanisms that change the answer: live restore, which cuts time-to-service to minutes at a cost while it runs, and single-file restore, which avoids restoring the machine at all.
The baseline: what a full restore actually costs
set -euo pipefail
GUEST_GIB=512 # the size of the data to be written back
THROUGHPUT_MIBPS=110 # MEASURED restore throughput, not link speed
DECISION_MIN=15 # time to notice, decide and authorise
BOOT_MIN=4 # guest boot and service start
VERIFY_MIN=10 # someone confirms the service actually works
TRANSFER_MIN=$(( GUEST_GIB * 1024 / THROUGHPUT_MIBPS / 60 ))
TOTAL_MIN=$(( DECISION_MIN + TRANSFER_MIN + BOOT_MIN + VERIFY_MIN ))
printf 'transfer %d min\n' "$TRANSFER_MIN"
printf 'total RTO %d min (%d h %d m)\n' "$TOTAL_MIN" "$((TOTAL_MIN/60))" "$((TOTAL_MIN%60))"At those numbers a 512 GiB guest is roughly 79 minutes of transfer and about 108 minutes of total outage. Three observations that change how people write RTOs:
Throughput is not link speed. A 1 GbE link tops out around 118 MiB/s in theory; a restore also has to read chunks off the datastore, decompress and decrypt them, and write them to the destination storage. Measure the number by restoring something, once, and record it. A restore plan built on the theoretical link speed is out by a factor you will discover during the incident.
The non-transfer terms are not small. Fifteen minutes of decision and ten of verification is 23% of the total here, and on a small guest they dominate completely. Restoring faster does not help an organisation whose bottleneck is finding someone authorised to say yes.
Parallel restores do not scale linearly. Restoring ten guests at once shares the same datastore read path and the same link. If your DR plan assumes ten simultaneous restores each at full speed, it assumes ten times the bandwidth you have.
Live restore
set -euo pipefail
# From a PBS-backed storage. The archive name is the snapshot path.
qmrestore 'pbs-main:backup/vm/214/2026-08-11T01:00:03Z' 214 \
--live-restore 1 \
--storage ceph-vm
# Restore alongside the original instead of over it, for a comparison or a
# partial recovery. --unique rerolls the MAC addresses so the clone does not
# collide with the original on the network.
qmrestore 'pbs-main:backup/vm/214/2026-08-11T01:00:03Z' 9214 \
--live-restore 1 \
--storage ceph-vm \
--unique 1The documented behaviour:
Enabling live-restore via either the checkbox in the GUI or the
--live-restoreargument ofqmrestorecauses the VM to start as soon as the restore begins. Data is copied in the background, prioritizing chunks that the VM is actively accessing.
That last clause is the mechanism. It is not a naive background copy that happens to run while the guest is up — the restore follows the guest. When the guest reads a block that has not arrived yet, that chunk is fetched with priority. So the boot path, the service binaries and the working set arrive first, in the order the guest asks for them, and the cold remainder of the disk trickles in behind.
| Full restore | Live restore | |
|---|---|---|
| Time to service | Full transfer + boot | Boot, essentially immediately |
| Performance during | N/A, nothing is running | Degraded reads; writes largely unaffected |
| Total data moved | Same | Same |
| If it fails part-way | Restore failed, nothing lost, retry | VM is in an undefined state and data written during the attempt likely cannot be preserved |
| Available for | Any backup storage | PBS only, VMs only |
Single-file restore: the case that is not a restore
The most common recovery request is not “the VM is gone”. It is “someone deleted a directory” or “we need the config file as it was on Tuesday”. A full restore for that is absurd, and a live restore only slightly less so.
The PVE web interface exposes a File Restore button on a PBS-backed backup, which lets you browse the snapshot and download individual files or directories. That is the right tool for a service-desk request and it needs no CLI.
From the command line, proxmox-backup-client gives two paths into a
snapshot without materialising a whole guest:
set -euo pipefail
export PBS_REPOSITORY='restore@pbs@pbs1.example.com:store1'
proxmox-backup-client snapshot list
proxmox-backup-client catalog shell 'host/app01/2026-08-11T01:15:00Z' root.pxar
# Inside the shell: ls, cd, pwd, find, list-selected, restore-selected, restoreset -euo pipefail
export PBS_REPOSITORY='restore@pbs@pbs1.example.com:store1'
mkdir -p /mnt/restore
proxmox-backup-client mount 'host/app01/2026-08-11T01:15:00Z' root.pxar /mnt/restore
cp -a /mnt/restore/etc/nginx/nginx.conf /root/nginx.conf.tuesday
umount /mnt/restoreproxmox-backup-client restore 'host/app01/2026-08-11T01:15:00Z' root.pxar /srv/staging/app01-restore/Choosing, under pressure
| Situation | Path | Why |
|---|---|---|
| One file or directory deleted | Single-file restore | Minutes, no outage, no rollback of anything else |
| Guest corrupted, service must be back now, workload is write-heavy | Live restore to a new VM ID | Time-to-service in minutes, degradation is tolerable, original preserved |
| Guest corrupted, workload is a large read-heavy dataset | Full restore | Live restore would be unusable for the duration and the transfer time is the same either way |
| Restore across a WAN or an unreliable link | Full restore | A failed live restore leaves an undefined guest; a failed full restore leaves nothing |
| Whole cluster lost | Full restore, staged by priority | Bandwidth is the constraint. Restore in dependency order and accept a queue |
| You need to compare current state against a backup | Live restore or full restore to a new ID, --unique | Never restore over the thing you are still investigating |
Knowledge check
Knowledge check · 4 questions
Q1. Why is live restore available only for backups stored on Proxmox Backup Server?
Q2. Which are sound precautions when using live restore in production? Select all that apply.
Q3. Measuring your real restore throughput once and recording it is more useful for RTO planning than calculating from the link speed.
Q4. A user reports that a configuration directory was deleted from a running application server this morning. What is the right first move?
Passing score: 75%. Answers are checked in this browser.