Willkommen zurück bei den Best Practices für euren Proxmox Server oder euer Proxmox Cluster, heute schauen wir uns das Thema Backup im Detail an. Dazu brauchen wir – Ihr ahnt es bereits – richtig… den Kollegen hier:
Proxmox Backup Server (PBS)
PBS ist die professionelle Backup-Lösung von Proxmox und sollte definitiv auf eurem Radar stehen. Die wichtigsten Vorteile sind nicht nur Marketing-Gerede, sondern machen in der Praxis wirklich einen Unterschied:
- Deduplication: Identische Datenblöcke werden nur einmal gespeichert – ihr spart damit oft bis zu 90% Speicherplatz
- Incremental Backups: Nur Änderungen werden gesichert, was eure Backup-Zeiten dramatisch reduziert
- Verschlüsselung: Client-seitige AES-256-GCM Verschlüsselung – selbst wenn jemand euren Backup-Server kompromittiert
- Bandbreiten-Begrenzung: Eure Backups laufen im Hintergrund, ohne dass die Produktivsysteme leiden
- Verify-Jobs: Automatische Integritätsprüfung – ihr wisst immer, ob eure Backups wirklich brauchbar sind
- Retention Policies: Intelligente Löschregeln sorgen dafür, dass ihr nicht im Backup-Chaos versinkt
- Web-GUI: Eine moderne Benutzeroberfläche, die tatsächlich Spaß macht zu bedienen
PBS Setup (Grundkonfiguration)
Hardware-Anforderungen und Planung
Bevor ihr loslegt, solltet ihr euch Gedanken über die Hardware machen. Ein PBS-Server ist nur so gut wie die Hardware, auf der er läuft. Hier sind realistische Mindestanforderungen, die sich in der Praxis bewährt haben:
Minimale Hardware-Empfehlungen für PBS:
- CPU: 4 Kerne (mehr wenn ihr viele VMs parallel sichern wollt)
- RAM: 8GB absolutes Minimum, 16GB+ wenn ihr „Ernst“ machen wollt
- Storage: Eine schnelle SSD für Metadaten, große HDDs für die eigentlichen Backup-Daten
- Netzwerk: Gigabit Ethernet als unterstes Minimum, besser 2,5 oder 5 GBE und 10GbE wenn ihr ständig große Datenmengen bewegt
Die Installation selbst ist erfreulich unkompliziert. Ihr solltet PBS definitiv auf einem separaten physischen Server installieren – ein virtualisierter PBS auf demselben Proxmox-Cluster, den er sichern soll, ist wie einen leeren Feuerlöscher im brennenden Haus zu haben. 😉
# Proxmox Backup Server Repository hinzufügen
echo "deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription" > /etc/apt/sources.list.d/pbs.list
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
apt update && apt install proxmox-backup-server
# Erste Konfiguration - einen Admin-User anlegen
proxmox-backup-manager user create backup@pbs --email admin@example.com
proxmox-backup-manager acl update / Backup@pbs --role Admin
Storage-Konfiguration optimieren
Die Storage-Konfiguration ist das Herzstück eures Backup-Systems. Hier lohnt es sich, etwas Zeit zu investieren. ZFS ist hier oft die beste Wahl, weil ihr damit Snapshots, Kompression und Checksumming out-of-the-box bekommt. Darüber hatten wir im zweiten Teil (Storage) ja auch bereits ausführlich gesprochen.
# ZFS Pool für optimale Performance erstellen
# Spiegelt zwei Disks und nutzt NVMe für Cache und Log
zpool create backup-pool \
mirror /dev/sdb /dev/sdc \
cache /dev/nvme0n1p1 \
log /dev/nvme0n1p2
# Datastore mit durchdachten Retention-Einstellungen
proxmox-backup-manager datastore create backup-storage /backup-pool/data \
--gc-schedule 'daily' \
--prune-schedule 'daily' \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--keep-yearly 2 \
--notify-user backup@pbs
Backup-Jobs konfigurieren
Grundkonfiguration
Jetzt wird’s interessant – die eigentlichen Backup-Jobs. Hier entscheidet sich, ob euer Backup-System ein zuverlässiger Begleiter oder eine Quelle ständiger Frustration wird!
Die CLI-Variante gibt euch deutlich mehr Kontrolle über die Parameter. Besonders wichtig ist die Bandbreitenbegrenzung! Denn niemand will, dass Backups das restliche Netzwerk lahmlegen.
# Backup Job mit allen wichtigen Parametern
pvesh create /cluster/backup \
--schedule "02:00" \
--storage backup-pbs \
--mode snapshot \
--all 1 \
--compress zstd \
--protected 1 \
--notes-template "{{cluster}}: {{guestname}} - {{job-id}}" \
--mailnotification always \
--mailto admin@example.com \
--bwlimit 50000 # 50MB/s Bandbreitenbegrenzung
Alternativ könnt ihr das Ganze auch bequem über das Web-Interface machen: Datacenter → Backup → Add. Das ist besonders für Einsteiger oft übersichtlicher.
Wichtige Parameter erklärt
Diese Parameter sind entscheidend für ein funktionierendes Backup-System, deshalb hier die wichtigsten im Detail:
Schedule: Hier verwendet ihr das Standard-Cron-Format. 0 2 * * *
bedeutet täglich um 2:00 Uhr. Plant eure Backup-Zeiten so, dass sie nicht mit anderen wartungsintensiven Tasks kollidieren.
Mode: Hier habt ihr drei Optionen, die alle ihre Vor- und Nachteile haben:
snapshot
: Die VM läuft weiter, ihr bekommt einen konsistenten Snapshot. Ideal für Produktivsysteme.suspend
: Die VM wird kurz pausiert. Maximale Konsistenz, aber kurze Unterbrechung.stop
: VM wird heruntergefahren. Nur für unkritische Systeme empfehlenswert.
Compress: Hier müsst ihr zwischen Geschwindigkeit und Effizienz abwägen:
lz4
ist schnell und braucht wenig CPU, komprimiert aber wenigerzstd
komprimiert deutlich besser, braucht aber mehr Rechenleistung
Protected: Schützt das Backup vor versehentlichem Löschen. Solltet ihr bei wichtigen Backups immer aktivieren.
BWLimit: Bandbreitenbegrenzung in KB/s. 50000 entspricht etwa 50MB/s – passt das an eure Netzwerkinfrastruktur an.
Backup-Verifikation aktivieren
Ein Backup ohne Verifikation ist wie ein Fallschirm ohne Test-Zertifikat – ihr merkt erst, dass es nicht funktioniert, wenn ihr es wirklich braucht, was dann im schlimmsten Fall zu spät sein kann. PBS hilft euch, denn es kann automatisch die Integrität eurer Backups prüfen.
# Verify-Job für automatische Backup-Integrität
pvesh create /admin/verify \
--store backup-storage \
--schedule 'weekly' \
--outdated-after 7 \
--ignore-verified
Der Verify-Job läuft einmal wöchentlich und prüft alle Backups, die älter als 7 Tage sind. Bereits verifizierte Backups werden übersprungen, um Zeit zu sparen.
3-2-1 Backup-Regel implementieren
Die 3-2-1 Regel verstehen
Die 3-2-1 Regel ist nicht nur ein Marketing-Gag, sondern bewährte Praxis aus Jahrzehnten der Erfahrung mit Datenverlust. Sie besagt:
- 3 Kopien eurer Daten (1 Original + 2 Backups)
- 2 verschiedene Medien/Speichertypen (nicht alles auf derselben Technologie)
- 1 Offsite-Backup (geografisch getrennt – Brand, Überschwemmung, Diebstahl)
Praktische Umsetzung
In einer typischen Proxmox-Umgebung könnte das so aussehen:
- Primärdaten: Auf eurem Proxmox-Server mit ZFS und Redundanz
- Lokales Backup: Auf dem PBS-Server im selben Rechenzentrum/Büro
- Offsite-Backup: PBS-Sync zu einem externen Standort oder Cloud-Provider
Die Remote-Konfiguration ist dabei relativ straightforward, aber ihr müsst auf die Netzwerkverbindung achten. Eine instabile Verbindung kann eure Sync-Jobs zum Albtraum machen.
# Remote-Backup konfigurieren - Fingerprint bekommt ihr vom Ziel-Server
pvesh create /admin/remote \
--name offsite-backup \
--host backup.external.com \
--userid backup@pbs \
--password "secure_password" \
--fingerprint AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD
# Sync-Job mit Bandbreitenbegrenzung - läuft nachts wenn wenig los ist
pvesh create /admin/sync \
--remote offsite-backup \
--remote-store production \
--store local-backup \
--schedule "04:00" \
--rate-in 10000 \
--burst-in 15000 \
--comment "Nächtlicher Offsite-Sync"
Erweiterte Backup-Strategien
Backup-Retention konfigurieren
Retention-Policies sind oft unterschätzt, aber extrem wichtig. Ohne sinnvolle Regeln sammelt ihr über die Jahre gigabyteweise alte Backups an, die niemand mehr braucht. Gleichzeitig wollt ihr aber auch nicht versehentlich das einzige brauchbare Backup von letztem Monat löschen.
Eine bewährte Strategie ist die „Großvater-Vater-Sohn“ Methode: viele neue Backups, weniger ältere, sehr wenige uralte. PBS macht das automatisch für euch.
# Durchdachte Retention-Policy konfigurieren
proxmox-backup-manager datastore update backup-storage \
--keep-last 3 \ # Letzten 3 Backups immer behalten (Notfälle)
--keep-hourly 24 \ # 24 stündliche Backups (letzter Tag)
--keep-daily 7 \ # 7 tägliche Backups (letzte Woche)
--keep-weekly 4 \ # 4 wöchentliche Backups (letzter Monat)
--keep-monthly 12 \ # 12 monatliche Backups (letztes Jahr)
--keep-yearly 5 # 5 jährliche Backups (Langzeitarchivierung)
Bandbreiten-Management
In Produktionsumgebungen müsst ihr oft mit begrenzter Bandbreite haushalten. Backups sollen nicht die Produktivsysteme ausbremsen, aber auch nicht ewig dauern. Traffic Shaping hilft euch dabei, das richtige Gleichgewicht zu finden.
# Traffic Shaping auf dem PBS-Server einrichten
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 800mbit ceil 1000mbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 200mbit ceil 400mbit
# Backup-Traffic in die langsamere Klasse einordnen
iptables -A OUTPUT -p tcp --dport 8007 -j CLASSIFY --set-class 1:20
Diese Konfiguration reserviert 80% der Bandbreite für normalen Traffic und begrenzt Backups auf maximal 40% – mit der Möglichkeit, ungenutzten Traffic zu nutzen.
Backup-Integration mit Storage
Storage-spezifische Optimierungen
Verschiedene Storage-Typen haben verschiedene Stärken. Nutzt das zu eurem Vorteil, indem ihr Metadaten und große Datenblöcke auf unterschiedlichen Medien speichert.
# Separate Datastores für verschiedene Anforderungen
# Schneller NVMe für Metadaten und kleine Dateien
proxmox-backup-manager datastore create vm-backups-meta \
/nvme/backup-meta \
--gc-schedule 'daily' \
--prune-schedule 'daily'
# Großer RAID für die eigentlichen Backup-Daten
proxmox-backup-manager datastore create vm-backups-data \
/raid/backup-data \
--gc-schedule 'weekly' \
--keep-daily 14 \
--keep-weekly 8 \
--keep-monthly 24
# Backup-Job der unnötige Dateien ausschließt
pvesh create /cluster/backup \
--schedule "02:00" \
--storage backup-pbs \
--mode snapshot \
--compress zstd \
--notes-template "{{cluster}}: {{guestname}} ({{mode}})" \
--protected 1 \
--exclude-path "/tmp/*,/var/log/*,/var/cache/*" # Spart Platz und Zeit
Backup-Strategien nach Storage-Typ
LVM-Thin Snapshots
LVM-Thin Volumes sind weit verbreitet und bieten eine einfache Snapshot-Funktionalität. Der Trick ist, die Snapshots nur so lange zu behalten, wie ihr sie wirklich braucht – sie können die Performance beeinträchtigen.
# Automatisiertes LVM-Snapshot-Backup mit Fehlerbehandlung
create_lvm_backup() {
local vmid=$1
local disk_path="/dev/pve/vm-${vmid}-disk-0"
local snap_name="vm-${vmid}-snap-$(date +%Y%m%d-%H%M%S)"
echo "Erstelle Backup für VM $vmid..."
# Prüfen ob genug Platz für Snapshot vorhanden ist
if ! lvcreate --test --snapshot --name $snap_name --size 10G $disk_path; then
echo "Fehler: Nicht genug Platz für Snapshot!"
return 1
fi
# Snapshot erstellen - ist quasi instantan
lvcreate --snapshot --name $snap_name --size 10G $disk_path
# Backup vom Snapshot mit Fortschrittsanzeige
dd if=/dev/pve/$snap_name bs=64k status=progress | \
gzip -c > /backup/vm-${vmid}-$(date +%Y%m%d).img.gz
# Snapshot sofort wieder löschen um Performance zu erhalten
lvremove -f /dev/pve/$snap_name
echo "Backup für VM $vmid abgeschlossen."
}
# Verwendung für VM 100:
# create_lvm_backup 100
ZFS Snapshots
ZFS ist hier deutlich eleganter – Snapshots kosten praktisch nichts und ihr könnt incremental backups machen. Das spart enorm viel Zeit und Bandbreite, besonders bei großen VMs.
# Intelligente ZFS Incremental-Backup-Strategie
zfs_incremental_backup() {
local dataset=$1
local remote_host=$2
local current_snap="${dataset}@backup-$(date +%Y%m%d-%H%M%S)"
local last_snap=$(zfs list -t snapshot -o name -s creation | grep ${dataset}@ | tail -1)
echo "Erstelle ZFS Backup für $dataset..."
# Neuen Snapshot erstellen - dauert Millisekunden
zfs snapshot $current_snap
if [ -n "$last_snap" ]; then
echo "Sende incremental backup seit $last_snap"
# Nur die Änderungen übertragen - viel schneller
zfs send -i $last_snap $current_snap | \
ssh $remote_host "zfs receive -F backup/${dataset##*/}"
else
echo "Sende initial full backup"
# Erstes Backup ist immer vollständig
zfs send $current_snap | \
ssh $remote_host "zfs receive backup/${dataset##*/}"
fi
# Snapshots aufräumen - behalte nur die letzten 7
local old_snaps=$(zfs list -t snapshot -o name -s creation | grep ${dataset}@ | head -n -7)
if [ -n "$old_snaps" ]; then
echo "Lösche alte Snapshots..."
echo "$old_snaps" | while read snap; do
zfs destroy $snap
done
fi
echo "ZFS Backup für $dataset abgeschlossen."
}
# Automatisierung für alle VM-Datasets
zfs_replicate_all() {
echo "Starte ZFS-Replikation für alle VMs..."
for dataset in $(zfs list -H -o name | grep "tank/vm-"); do
zfs_incremental_backup $dataset backup-server.local
done
echo "ZFS-Replikation abgeschlossen."
}
Monitoring und Alerting
Backup-Status überwachen
Ein Backup-System ohne Monitoring ist wie ein Rauchmelder ohne Batterien – ihr merkt erst, dass es nicht funktioniert, wenn’s zu spät ist. Deshalb solltet ihr unbedingt automatische Checks einrichten.
# Script für Backup-Status-Überwachung
#!/bin/bash
check_backup_status() {
echo "Überprüfe Backup-Status..."
# Suche nach fehlgeschlagenen Jobs in den letzten 24h
local failed_jobs=$(pvesh get /cluster/backup --output-format json | \
jq -r '.[] | select(.state == "error") | .id')
if [ -n "$failed_jobs" ]; then
echo "ALARM: Backup-Jobs fehlgeschlagen: $failed_jobs"
# E-Mail senden
echo "Backup-Jobs $failed_jobs sind fehlgeschlagen. Bitte prüfen!" | \
mail -s "BACKUP FAILURE ALERT" admin@example.com
# Optional: Alert an Monitoring-System
curl -X POST "https://monitoring.example.com/alert" \
-H "Content-Type: application/json" \
-d "{\"message\":\"Backup failures: $failed_jobs\", \"severity\":\"critical\"}"
return 1
else
echo "Alle Backup-Jobs laufen normal."
return 0
fi
}
# Als Cron-Job alle 2 Stunden ausführen
# 0 */2 * * * /usr/local/bin/check_backup_status.sh
Proxmox Backup Server Health Check
Regelmäßige Gesundheitschecks helfen euch dabei, Probleme zu erkennen, bevor sie kritisch werden. Speicherplatz, Performance und Service-Status solltet ihr im Auge behalten. Das könnte zB. so aussehen:
# Umfassende PBS Gesundheitsprüfung
pbs_health_check() {
echo "=== PBS Health Check $(date) ==="
# Datastore Status und Speicherplatz
echo "--- Datastore Status ---"
proxmox-backup-manager datastore list
echo "--- Speicherplatz ---"
df -h | grep -E "(backup|pbs)" | while read line; do
usage=$(echo $line | awk '{print $5}' | tr -d '%')
if [ $usage -gt 85 ]; then
echo "WARNUNG: $line - Speicher fast voll!"
else
echo "OK: $line"
fi
done
# Laufende Prozesse
echo "--- Aktive Backup-Prozesse ---"
local active_jobs=$(ps aux | grep -E "(proxmox-backup|pbs)" | grep -v grep | wc -l)
echo "Aktive Jobs: $active_jobs"
# Verify Jobs Status
echo "--- Verify Jobs Status ---"
pvesh get /admin/verify --output-format json | \
jq -r '.[] | "Job \(.id): \(.state) (letzte Ausführung: \(.last_run_endtime // "nie"))"'
# Netzwerk-Performance zu Remote-Zielen testen
echo "--- Netzwerk-Tests ---"
if command -v iperf3 > /dev/null; then
echo "Teste Bandbreite zu Backup-Zielen..."
# iperf3 -c backup-remote.com -t 10 -f M
fi
echo "=== Health Check Ende ==="
}
Disaster Recovery Planning
Vollständige System-Wiederherstellung
Der Tag wird kommen, an dem ihr euer komplettes System wiederherstellen müsst. Ja, schon klar, das passiert nie – Tja, irgendwann ist immer das erste Mal. Vorbereitung ist hier alles – testet eure Disaster Recovery Pläne regelmäßig in einer isolierten Umgebung.
# Vollständige Cluster-Wiederherstellung nach Totalausfall
restore_cluster() {
local backup_location=$1
echo "Starte Cluster-Wiederherstellung von $backup_location"
# 1. Neue Proxmox-Installation vorbereiten
echo "Schritt 1: Basis-System installiert (manueller Schritt)"
# 2. Cluster-Konfiguration wiederherstellen
echo "Schritt 2: Wiederherstellen der Cluster-Konfiguration..."
if [ -f "$backup_location/cluster-config.tar.gz" ]; then
tar -xzf "$backup_location/cluster-config.tar.gz" -C /etc/pve/
systemctl reload pve-cluster
fi
# 3. Storage-Konfiguration wiederherstellen
echo "Schritt 3: Storage-Pools wiederherstellen..."
# Hier müsst ihr eure spezifische Storage-Konfiguration anpassen
# 4. VMs einzeln wiederherstellen
echo "Schritt 4: VM-Wiederherstellung..."
if [ -f "$backup_location/vm-list.txt" ]; then
while read vmid; do
echo "Wiederherstellen VM $vmid..."
local backup_file="$backup_location/vm-${vmid}-latest.vma.gz"
if [ -f "$backup_file" ]; then
qmrestore "$backup_file" $vmid --storage local-lvm
echo "VM $vmid wiederhergestellt"
else
echo "WARNUNG: Backup für VM $vmid nicht gefunden!"
fi
done < "$backup_location/vm-list.txt"
fi
echo "Cluster-Wiederherstellung abgeschlossen. Bitte Services prüfen!"
}
Backup-Validierung automatisieren
Hatte ich das heute schon erwähnt? Egal, kann man nicht oft genug sagen: Regelmäßige Tests eurer Backups sind unverzichtbar. Nichts ist frustrierender als ein korruptes Backup erst bei eingetretenem Notfall zu entdecken.
Der PBS validiert zwar für euch auch automatisch, aber sich darauf zu 100% zu verlassen halte ich auch für schwierig. Zumindest solltet Ihr in Erwägung ziehen von Zeit zu Zeit tatsächliche Wiederherstellungen durchzuführen, zB. über eure Test/Staging Umgebung, erst dann lässt sich wirklich ruhig schlafen.
# Automatisierte Backup-Tests mit Test-VM
backup_validation() {
local test_vmid=9999 # VM-ID für Tests reservieren
local datastore="backup-storage"
echo "Starte Backup-Validierung..."
# Neuestes Backup finden
local latest_backup=$(proxmox-backup-client list --repository $datastore | \
grep "vm/$test_vmid" | sort -r | head -1 | awk '{print $1}')
if [ -z "$latest_backup" ]; then
echo "Kein Backup für Test-VM gefunden, verwende beliebiges VM-Backup"
latest_backup=$(proxmox-backup-client list --repository $datastore | \
grep "vm/" | head -1 | awk '{print $1}')
fi
if [ -z "$latest_backup" ]; then
echo "FEHLER: Keine Backups gefunden!"
return 1
fi
echo "Teste Backup: $latest_backup"
# Test-Wiederherstellung (ohne Start)
if qmrestore --archive "$datastore:backup/$latest_backup" $test_vmid --storage local-lvm; then
echo "Wiederherstellung erfolgreich, teste VM-Start..."
# VM testweise starten
qm start $test_vmid
sleep 30
if qm status $test_vmid | grep -q "running"; then
echo "SUCCESS: Backup-Validierung erfolgreich - VM startet korrekt"
qm stop $test_vmid
qm destroy $test_vmid --purge
return 0
else
echo "FEHLER: VM startet nicht nach Wiederherstellung"
qm destroy $test_vmid --purge
return 1
fi
else
echo "FEHLER: Wiederherstellung fehlgeschlagen"
return 1
fi
}
Performance-Optimierung
Backup-Performance Tuning
Performance-Tuning bei Backups ist oft ein Balanceakt zwischen Geschwindigkeit, System-Load und Netzwerk-Impact. Hier sind bewährte Einstellungen für verschiedene Szenarien.
# Datacenter-weite Backup-Einstellungen optimieren (Homelab)
# /etc/pve/datacenter.cfg
max_workers: 3 # Nicht mehr als 3 parallele Backup-Jobs
bandwidth_limit: 200 # 200MB/s Gesamtbandbreite für alle Jobs
ionice: 7 # Niedrigste I/O-Priorität (0-7)
lockwait: 180 # 3 Minuten auf Locks warten
Diese Einstellungen verhindern, dass eure Backups die Produktivsysteme überlasten. Bei leistungsfähigerer Hardware könnt ihr die Werte entsprechend anpassen, die Daten aus dem Beispiel oben sind ein eher einfaches Homelab-Setup ohne performante Server Hardware. Auf einem relativ aktuellen Server könnte das beispielsweise auch so aussehen:
# Datacenter-weite Backup-Einstellungen optimieren (Server)
# /etc/pve/datacenter.cfg
max_workers: 6 # Nicht mehr als 6 parallele Backup-Jobs
bandwidth_limit: 1500 # 1500MB/s Gesamtbandbreite für alle Jobs (NvME Storage)
ionice: 4 # Mittlere I/O-Priorität (0-7)
lockwait: 60 # 1 Minute auf Locks warten
Storage-spezifische Optimierungen
Verschiedene Storage-Technologien brauchen verschiedene Optimierungen. Was für NVMe-SSDs gut ist, kann bei rotierenden Festplatten kontraproduktiv sein. Auch hier ein paar Beispiele:
# I/O-Scheduler für verschiedene Storage-Typen optimieren
# Für NVMe-SSDs: mq-deadline ist meist optimal
echo mq-deadline > /sys/block/nvme0n1/queue/scheduler
# Für SATA-SSDs: none oder mq-deadline
echo none > /sys/block/sda/queue/scheduler
# Für rotierende Festplatten: bfq oder cfq
echo bfq > /sys/block/sdb/queue/scheduler
# Readahead für große sequentielle Zugriffe optimieren
blockdev --setra 4096 /dev/sda # 2MB readahead
# Für Backup-Workloads oft hilfreich
echo 32 > /sys/block/sda/queue/nr_requests
Troubleshooting häufiger Probleme
Backup-Jobs hängen
Hängende Backup-Jobs sind ein klassisches Problem. Meist liegt’s an Locks, Netzwerkproblemen oder überlasteten Storage-Systemen.
# Hängende Jobs identifizieren und behandeln
find_hanging_jobs() {
echo "Suche nach hängenden Backup-Jobs..."
# Lange laufende vzdump-Prozesse finden
ps aux | grep vzdump | grep -v grep | while read line; do
pid=$(echo $line | awk '{print $2}')
runtime=$(ps -o etime= -p $pid | tr -d ' ')
echo "Job PID $pid läuft seit: $runtime"
# Jobs die länger als 6 Stunden laufen sind verdächtig
if [[ $runtime =~ ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$ ]]; then
echo "WARNUNG: Job $pid läuft sehr lange!"
fi
done
# Lock-Files prüfen
if [ -f /var/lock/vzdump.lock ]; then
echo "Vzdump-Lock gefunden, prüfe Prozess..."
local lock_pid=$(cat /var/lock/vzdump.lock)
if ! kill -0 $lock_pid 2>/dev/null; then
echo "Lock-File ist verwaist, lösche es..."
rm /var/lock/vzdump.lock
fi
fi
}
# Notfall-Cleanup für völlig hängende Systeme
emergency_backup_cleanup() {
echo "NOTFALL: Beende alle Backup-Prozesse!"
killall -9 vzdump
killall -9 proxmox-backup-client
rm -f /var/lock/vzdump.lock
rm -f /tmp/vzdumptmp*
echo "Cleanup abgeschlossen - prüft die Logs!"
}
Speicherplatz-Management
Volle Backup-Datastores sind ebenfalls ein häufiges Problem. Garbage Collection und Pruning sollten automatisch laufen, aber manchmal müsst ihr trotzdem noch manuell eingreifen.
# Speicherplatz-Probleme diagnostizieren und beheben
storage_cleanup() {
local datastore=$1
echo "Speicherplatz-Analyse für $datastore..."
# Aktueller Speicherverbrauch
df -h $(proxmox-backup-manager datastore list | grep $datastore | awk '{print $3}')
# Größte Backup-Gruppen finden
echo "Größte Backup-Gruppen:"
du -sh /backup/$datastore/* | sort -hr | head -10
# Garbage Collection manuell ausführen
echo "Starte Garbage Collection..."
proxmox-backup-manager garbage-collect $datastore
# Verwaiste Chunks finden
echo "Suche verwaiste Chunks..."
proxmox-backup-manager datastore verify $datastore
# Speicherplatz nach Cleanup
echo "Speicherplatz nach Cleanup:"
df -h $(proxmox-backup-manager datastore list | grep $datastore | awk '{print $3}')
# Prune-Jobs manuell ausführen wenn automatisch nicht läuft
echo "Führe Prune-Jobs aus..."
proxmox-backup-client prune --repository $datastore \
--keep-daily 7 --keep-weekly 4 --keep-monthly 12
}
# Speicher-Monitoring mit Alerts
monitor_storage_space() {
for datastore in $(proxmox-backup-manager datastore list | awk 'NR>1 {print $1}'); do
local path=$(proxmox-backup-manager datastore list | grep $datastore | awk '{print $3}')
local usage=$(df "$path" | awk 'NR==2 {print $5}' | tr -d '%')
echo "Datastore $datastore: ${usage}% belegt"
if [ $usage -gt 90 ]; then
echo "KRITISCH: $datastore über 90% voll!"
# Hier könntet ihr automatisch alte Backups löschen
elif [ $usage -gt 80 ]; then
echo "WARNUNG: $datastore über 80% voll"
fi
done
}
Netzwerk-Probleme diagnostizieren
Netzwerkprobleme könnten auch der Grund für langsame oder fehlschlagende Backups sein. Hier sind Tools und Techniken, die euch bei der Diagnose helfen.
# Umfassende Netzwerk-Diagnose für Backup-Verbindungen
network_backup_diagnosis() {
local target_host=$1
echo "=== Netzwerk-Diagnose für $target_host ==="
# Grundlegende Erreichbarkeit
echo "--- Ping-Test ---"
if ping -c 5 $target_host > /dev/null; then
echo "Host $target_host ist erreichbar"
ping -c 5 $target_host | tail -1
else
echo "FEHLER: Host $target_host nicht erreichbar!"
return 1
fi
# Bandbreiten-Test mit iperf3
echo "--- Bandbreiten-Test ---"
if command -v iperf3 > /dev/null; then
echo "Teste Bandbreite zu $target_host..."
timeout 30s iperf3 -c $target_host -t 20 -f M 2>/dev/null | \
grep "sender" | awk '{print "Upload: " $7 " " $8}'
timeout 30s iperf3 -c $target_host -t 20 -f M -R 2>/dev/null | \
grep "receiver" | awk '{print "Download: " $7 " " $8}'
else
echo "iperf3 nicht installiert - installiere mit: apt install iperf3"
fi
# Latenz-Test
echo "--- Latenz-Analyse ---"
local avg_latency=$(ping -c 100 $target_host | tail -1 | awk -F'/' '{print $5}')
echo "Durchschnittliche Latenz: ${avg_latency}ms"
if (( $(echo "$avg_latency > 100" | bc -l) )); then
echo "WARNUNG: Hohe Latenz könnte Backup-Performance beeinträchtigen"
fi
# Port-Verfügbarkeit für PBS
echo "--- Port-Tests ---"
for port in 8007 8008; do
if timeout 5s bash -c "</dev/tcp/$target_host/$port"; then
echo "Port $port: OFFEN"
else
echo "Port $port: GESCHLOSSEN oder gefiltert"
fi
done
# MTU-Discovery
echo "--- MTU-Test ---"
for size in 1472 1500 9000; do
if ping -c 1 -M do -s $size $target_host > /dev/null 2>&1; then
echo "MTU $size: OK"
else
echo "MTU $size: Fragmentierung erforderlich"
fi
done
}
SSL/TLS Zertifikats-Probleme
PBS nutzt HTTPS für alle Verbindungen. Zertifikats-Probleme sind ein häufiger Stolperstein, besonders bei Self-Signed Certificates.
# SSL-Zertifikat-Diagnose und -Reparatur
check_pbs_certificates() {
local pbs_host=$1
echo "=== SSL-Zertifikat-Check für $pbs_host ==="
# Zertifikat-Details abrufen
echo "--- Zertifikat-Informationen ---"
local cert_info=$(echo | openssl s_client -servername $pbs_host -connect $pbs_host:8007 2>/dev/null | \
openssl x509 -noout -dates -subject -issuer)
echo "$cert_info"
# Zertifikat-Gültigkeit prüfen
local expiry_date=$(echo "$cert_info" | grep "notAfter" | cut -d'=' -f2)
local expiry_seconds=$(date -d "$expiry_date" +%s)
local now_seconds=$(date +%s)
local days_until_expiry=$(( (expiry_seconds - now_seconds) / 86400 ))
echo "Zertifikat läuft ab in: $days_until_expiry Tagen"
if [ $days_until_expiry -lt 30 ]; then
echo "WARNUNG: Zertifikat läuft bald ab!"
fi
# Fingerprint für Remote-Konfiguration
echo "--- Fingerprint für Remote-Config ---"
local fingerprint=$(echo | openssl s_client -servername $pbs_host -connect $pbs_host:8007 2>/dev/null | \
openssl x509 -noout -fingerprint -sha256 | cut -d'=' -f2)
echo "Fingerprint: $fingerprint"
}
# Neues Self-Signed Zertifikat generieren
regenerate_pbs_certificate() {
local pbs_host=$1
echo "Generiere neues Self-Signed Zertifikat für $pbs_host..."
# Backup des alten Zertifikats
cp /etc/proxmox-backup/proxy.pem /etc/proxmox-backup/proxy.pem.backup.$(date +%Y%m%d)
# Neues Zertifikat erstellen
openssl req -x509 -newkey rsa:4096 -keyout /tmp/proxy.key -out /tmp/proxy.crt \
-days 3650 -nodes -subj "/CN=$pbs_host"
# Zertifikat und Key kombinieren
cat /tmp/proxy.crt /tmp/proxy.key > /etc/proxmox-backup/proxy.pem
# Temporäre Dateien löschen
rm /tmp/proxy.key /tmp/proxy.crt
# Service neustarten
systemctl restart proxmox-backup-proxy
echo "Neues Zertifikat installiert. Neuer Fingerprint:"
check_pbs_certificates $pbs_host | grep "Fingerprint:"
}
Best Practices TL:DR
Das solltet ihr unbedingt beachten
Hier sind die wichtigsten Punkte, die über Erfolg oder Misserfolg eures Backup-Systems entscheiden:
Hardware & Infrastruktur:
- PBS immer auf separater Hardware – nie auf dem System, das ihr sichert
- Ausreichend RAM für Deduplication (mindestens 16GB für Produktionsumgebungen)
- Schnelle SSDs für Metadaten, große HDDs für die Backup-Daten
- Redundante Netzwerkverbindungen wenn möglich
Konfiguration:
- Retention Policies von Anfang an richtig konfigurieren – nachträglich ist’s mühsam
- Bandbreitenbegrenzung aktivieren um Produktivsysteme nicht zu beeinträchtigen
- Verify-Jobs einrichten – ein ungetestetes Backup ist kein Backup
- E-Mail-Benachrichtigungen für alle kritischen Events aktivieren
Monitoring:
- Automatische Health-Checks mindestens täglich
- Storage-Monitoring mit Alerts bei >80% Belegung
- Regelmäßige Test-Wiederherstellungen in isolierter Umgebung
- Log-Files regelmäßig überprüfen – Warnungen ernst nehmen
Sicherheit:
- Client-seitige Verschlüsselung für sensitive Daten aktivieren
- Separate Credentials für Backup-User – keine Admin-Rechte
- Firewall-Regeln nur für notwendige Ports (8007, 8008)
- Offsite-Backups mit sicherer Übertragung (SSH-Keys statt Passwörter)
Häufige Anfängerfehler vermeiden
Der „Virtualisierte PBS“ Fehler: Nie PBS auf demselben Proxmox-Cluster laufen lassen, den er sichern soll. Das ist wie ein Sicherheitsgurt aus Kaugummi.
Die „Set and Forget“ Mentalität: Backups brauchen regelmäßige Pflege. Prüft mindestens monatlich, ob alles läuft.
Fehlende Bandbreitenbegrenzung: Backup-Jobs ohne Limits können euer Produktionsnetzwerk lahmlegen.
Keine Test-Wiederherstellungen: Ihr wisst erst, ob eure Backups funktionieren, wenn ihr sie testet. Murphy’s Law gilt besonders für Backups. 😉
Unklare Retention-Policies: Definiert von Anfang an, wie lange ihr was behalten wollt. Unendlich wachsende Backup-Archive sind ein Alptraum.
Mit diesen Grundlagen habt ihr ein solides Fundament für euer Proxmox-Backup-System. Investiert die Zeit in eine ordentliche Konfiguration – ich sag mal so, dein Zukunfts-Ich wird es dir danken, entweder durch ruhigen, entspannten Schlaf, oder spätestens wenn der erste Notfall eintritt.
Abschluss und weiterführende Ressourcen
Proxmox ist ein mächtiges Werkzeug, aber mit großer Macht kommt auch große Verantwortung. (zwinker) Die hier gezeigten Best Practices sind das Ergebnis aus Erfahrung in der Praxis. Beginnt mit den Grundlagen und arbeitet euch nach und nach zu den erweiterten Features vor.
Eure nächsten Schritte:
- Testing/Staging Umgebung aufbauen: Testet alle Konfigurationen erst in einer separaten Umgebung
- Monitoring implementieren: Überwacht euer System von Anfang an
- Backup-Strategie testen: Macht regelmäßige Restore-Tests
- Community beitreten: Das Proxmox-Forum ist sehr hilfsreich
Denkt also daran: Nehmt euch die Zeit, die Grundlagen zu verstehen, bevor ihr zu komplexeren Setups übergeht. Der Proxmox-Admin-Guide als Webseite den ich im Artikel mehrfach als Referenz verlinkt habe ist auch Gold wert. Schaut euch ruhig im Forum um, wenn Ihr Frage habt. Ansonsten gibt es auch für den Einstieg noch einen Youtube-Channel.
Die restlichen Teile dieser Artikelserie habe ich hier auch noch einmal für euch verlinkt: Teil 1: Netzwerk | Teil 2: Storage | Teil 3: Backup | Teil 4: Sicherheit | Teil 5: Performance