Übersicht
Proxmox Backup Server (PBS) kann nicht nur VMs und Container sichern. Mit dem proxmox-backup-client lassen sich auch physische Linux-Server auf Datei- und Blockebene in einen PBS-Datastore sichern. Das Beste daran: Fällt die Hardware aus, kann das Backup direkt als VM auf einem Proxmox VE Host wiederhergestellt werden.
Dieser Artikel zeigt die komplette Einrichtung: Benutzer und Berechtigungen auf dem PBS, Client-Installation auf dem Host, ein Backup-Skript mit sauberem Service-Handling und die Wiederherstellung als VM.
Beispielwerte im Artikel (an die eigene Umgebung anpassen):
| Wert | Beispiel |
|---|---|
| PBS-Server | 192.168.1.20:8007 |
| Datastore | backup01 |
| Backup-Benutzer | backup@pbs |
| Zu sichernder Host | webserver01 |
| PVE ZFS-Pool / Storage | rpool/data / local-zfs |
1. Vorbereitung auf dem PBS
1.1 Backup-Benutzer anlegen
Der Benutzer wird im PBS-eigenen Realm @pbs angelegt, nicht als Linux-Benutzer mit useradd:
proxmox-backup-manager user create backup@pbs --password 'SicheresPasswort'
1.2 Berechtigung auf den Datastore setzen
Die Rolle DatastoreBackup erlaubt das Erstellen von Backups und das Lesen der eigenen Snapshots:
proxmox-backup-manager acl update /datastore/backup01 DatastoreBackup --auth-id backup@pbs
1.3 Zertifikats-Fingerprint notieren
Den Fingerprint braucht der Client später zur Verifizierung des Servers:
proxmox-backup-manager cert info | grep Fingerprint
2. PBS-Client auf dem Host installieren
Auf Debian 12 (Bookworm):
wget -qO- https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg \
| gpg --dearmor -o /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
echo "deb http://download.proxmox.com/debian/pbs-client bookworm main" \
> /etc/apt/sources.list.d/pbs-client.list
apt update
apt install proxmox-backup-client
Für Debian 13 (Trixie) einfach bookworm durch trixie ersetzen.
3. Konfiguration auf dem Host
3.1 Passwort-Datei anlegen
Das Passwort landet in einer eigenen Datei, die nur root lesen kann. Es gehört ausdrücklich nicht nach /etc/environment, denn diese Datei ist für alle Benutzer lesbar.
mkdir -p /etc/pbs
echo 'SicheresPasswort' > /etc/pbs/pwfile
chmod 600 /etc/pbs/pwfile
3.2 Verbindungsdaten anlegen
nano /etc/pbs/backup.env
PBS_REPOSITORY='backup@pbs@192.168.1.20:backup01'
PBS_FINGERPRINT='aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99'
chmod 600 /etc/pbs/backup.env
Das Repository-Format ist benutzer@realm@server:datastore. Ein abweichender Port wird als server:port:datastore angegeben.
3.3 Backup-Skript
Das Skript sichert standardmäßig das komplette Root-Dateisystem als root.pxar-Archiv. Optional kann zusätzlich ein Roh-Image der Disk gesichert werden. Dienste wie Datenbanken werden vorher gestoppt und danach wieder gestartet. Wichtig dabei: Der Neustart der Dienste läuft über einen trap und passiert damit auch dann, wenn das Backup fehlschlägt.
nano /usr/local/sbin/pbs-backup.sh
#!/usr/bin/env bash
set -euo pipefail
ENV_FILE='/etc/pbs/backup.env'
PWFILE='/etc/pbs/pwfile'
# Roh-Image der Disk sichern?
DO_IMAGE=false
DISK_DEVICE='/dev/sda'
DISK_IMAGE_NAME='disk-sda.img'
# Datei-Level-Backup aktivieren?
DO_FOLDER=true
FOLDER_PATHS=( "/" )
# Dienste vor dem Backup stoppen und danach wieder starten?
USE_SERVICES=true
SERVICES=( "nginx" "mariadb" )
usage() {
cat <<EOF
Usage: $0 [OPTIONS]
--image Roh-Image von ${DISK_DEVICE} sichern
--no-image kein Roh-Image sichern
--folder Verzeichnis-Backup (${FOLDER_PATHS[*]})
--no-folder kein Verzeichnis-Backup
--no-services Dienste nicht stoppen/starten
-h, --help Hilfe anzeigen
EOF
exit 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
--image) DO_IMAGE=true ;;
--no-image) DO_IMAGE=false ;;
--folder) DO_FOLDER=true ;;
--no-folder) DO_FOLDER=false ;;
--no-services) USE_SERVICES=false ;;
-h|--help) usage ;;
*) echo "Unbekannte Option: $1" >&2; usage ;;
esac
shift
done
if ! $DO_IMAGE && ! $DO_FOLDER; then
echo "FEHLER: weder Image- noch Verzeichnis-Backup aktiviert" >&2
usage
fi
[[ -r $ENV_FILE ]] || { echo "FEHLER: $ENV_FILE nicht lesbar" >&2; exit 1; }
source "$ENV_FILE"
[[ -n ${PBS_REPOSITORY:-} ]] || { echo "FEHLER: PBS_REPOSITORY nicht gesetzt" >&2; exit 1; }
[[ -r $PWFILE ]] || { echo "FEHLER: $PWFILE nicht lesbar" >&2; exit 1; }
PBS_PASSWORD="$(<"$PWFILE")"
export PBS_PASSWORD PBS_REPOSITORY
if [[ -n ${PBS_FINGERPRINT:-} ]]; then
export PBS_FINGERPRINT
fi
# Gestoppte Dienste werden auch bei einem Fehler im Backup wieder gestartet
STOPPED_SERVICES=()
start_services() {
local svc
for svc in "${STOPPED_SERVICES[@]}"; do
systemctl start "$svc" || echo "WARNUNG: $svc konnte nicht gestartet werden" >&2
done
STOPPED_SERVICES=()
}
trap start_services EXIT
if $USE_SERVICES; then
for svc in "${SERVICES[@]}"; do
if systemctl is-active --quiet "$svc"; then
systemctl stop "$svc"
STOPPED_SERVICES+=("$svc")
echo "Dienst gestoppt: $svc"
fi
done
fi
specs=()
opts=()
if $DO_FOLDER; then
for path in "${FOLDER_PATHS[@]}"; do
name="$(basename "$path" | tr '/' '-')"
[[ -z $name || $name == "-" ]] && name="root"
specs+=("${name}.pxar:${path}")
done
opts+=(
--exclude /dev
--exclude /proc
--exclude /sys
--exclude /run
--exclude /tmp
--exclude /var/tmp
--exclude /var/cache
--exclude /mnt
--exclude /media
)
fi
if $DO_IMAGE; then
specs+=( "${DISK_IMAGE_NAME}:${DISK_DEVICE}" )
fi
echo "Starte Backup nach ${PBS_REPOSITORY}"
echo "Archive: ${specs[*]}"
proxmox-backup-client backup "${specs[@]}" "${opts[@]}"
echo "Backup abgeschlossen"
chmod +x /usr/local/sbin/pbs-backup.sh
Erster Testlauf:
/usr/local/sbin/pbs-backup.sh
3.4 Automatisieren per Cron
echo '0 3 * * * root /usr/local/sbin/pbs-backup.sh >>/var/log/pbs-backup.log 2>&1' > /etc/cron.d/pbs-backup
4. Ein Wort zur Konsistenz
Das Datei-Level-Backup (root.pxar) ist der Normalfall und liefert mit gestoppten Diensten konsistente Ergebnisse. Ein Roh-Image (--image) von einer gemounteten, aktiven Root-Partition ist dagegen prinzipbedingt nicht konsistent, auch wenn es in der Praxis oft funktioniert. Wer ein sauberes Image will, bootet den Host von einem Live-System und sichert die Disk im ungemounteten Zustand. Für die Wiederherstellung als VM reicht in den meisten Fällen aber das Datei-Level-Backup in Kombination mit einer frischen Partitionierung, oder eben ein Image-Backup mit dem Wissen um dessen Einschränkung.
5. Wiederherstellung als VM auf Proxmox VE
5.1 Snapshots auflisten
Auf dem PVE-Host (der proxmox-backup-client ist dort bereits installiert):
export PBS_REPOSITORY='backup@pbs@192.168.1.20:backup01'
export PBS_PASSWORD_FILE='/etc/pbs/pwfile'
proxmox-backup-client snapshot list
5.2 Zvol und VM anlegen
Die Größe muss mindestens der Original-Disk entsprechen:
zfs create -V 100G rpool/data/vm-300-disk-0
qm create 300 --name restored-webserver01 --memory 4096 --cores 2 \
--net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci --onboot 0
qm set 300 --scsi0 local-zfs:vm-300-disk-0
qm set 300 --boot order=scsi0
Hat der physische Host mit UEFI gebootet, braucht die VM zusätzlich --bios ovmf und eine EFI-Disk.
5.3 Image auf das Zvol schreiben
export PBS_REPOSITORY='backup@pbs@192.168.1.20:backup01'
export PBS_PASSWORD_FILE='/etc/pbs/pwfile'
proxmox-backup-client restore \
"host/webserver01/2026-07-20T03:00:00Z" \
disk-sda.img - \
| dd of=/dev/zvol/rpool/data/vm-300-disk-0 bs=4M status=progress oflag=direct
Der Snapshot-Pfad hat das Format host/<hostname>/<zeitstempel>, der Zeitstempel kommt aus snapshot list.
5.4 Datei-Level-Restore
Einzelne Verzeichnisse oder Dateien lassen sich aus dem pxar-Archiv wiederherstellen, ohne ein Image zu benötigen:
proxmox-backup-client restore "host/webserver01/2026-07-20T03:00:00Z" root.pxar /mnt/restore
Alternativ kann das Archiv mit proxmox-backup-client mount read-only eingehängt werden, um gezielt einzelne Dateien herauszukopieren.
Fazit
Mit einem Benutzer, zwei Konfigurationsdateien und einem Skript sichert der PBS auch physische Hosts, dedupliziert und verschlüsselbar wie bei VM-Backups. Der eigentliche Gewinn zeigt sich im Ernstfall: Statt neue Hardware zu beschaffen, läuft der Server nach wenigen Minuten als VM auf dem PVE weiter.