Skip to main content
RunBook Academy

Proxmox VEXIII · Proxmox Backup ServerPBS restore

Live restore, single-file restore and the RTO arithmetic

Advanced⏱ ~24 min🧪 Lab requiredqmrestoreproxmox-backup-client

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

Not yet marked complete on this device.

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

Read-only / Saferestore time model - fill in your own measured numbers
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

Service impact possiblelive restore - the guest starts immediately
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 1

The documented behaviour:

Enabling live-restore via either the checkbox in the GUI or the --live-restore argument of qmrestore causes 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 restoreLive restore
Time to serviceFull transfer + bootBoot, essentially immediately
Performance duringN/A, nothing is runningDegraded reads; writes largely unaffected
Total data movedSameSame
If it fails part-wayRestore failed, nothing lost, retryVM is in an undefined state and data written during the attempt likely cannot be preserved
Available forAny backup storagePBS 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:

Read-only / Safebrowse a snapshot interactively
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, restore
Read-only / Safemount a snapshot and copy out of it
set -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/restore
Destructiverestore a whole archive to a directory
proxmox-backup-client restore 'host/app01/2026-08-11T01:15:00Z' root.pxar /srv/staging/app01-restore/

Choosing, under pressure

SituationPathWhy
One file or directory deletedSingle-file restoreMinutes, no outage, no rollback of anything else
Guest corrupted, service must be back now, workload is write-heavyLive restore to a new VM IDTime-to-service in minutes, degradation is tolerable, original preserved
Guest corrupted, workload is a large read-heavy datasetFull restoreLive restore would be unusable for the duration and the transfer time is the same either way
Restore across a WAN or an unreliable linkFull restoreA failed live restore leaves an undefined guest; a failed full restore leaves nothing
Whole cluster lostFull restore, staged by priorityBandwidth is the constraint. Restore in dependency order and accept a queue
You need to compare current state against a backupLive restore or full restore to a new ID, --uniqueNever restore over the thing you are still investigating

Knowledge check

Knowledge check · 4 questions

  1. Q1. Why is live restore available only for backups stored on Proxmox Backup Server?

  2. Q2. Which are sound precautions when using live restore in production? Select all that apply.

  3. Q3. Measuring your real restore throughput once and recording it is more useful for RTO planning than calculating from the link speed.

  4. 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.