Proxmox-Backup mit ZFS und Restic
Wer virtuelle Maschinen und LXC-Container unter Proxmox betreibt, steht früher oder später vor der Frage nach einem verlässlichen, platzsparenden Backup. Genau dafür ist dieses Skript gedacht: Es sichert VMs, Container und ausgewählte Verzeichnisse automatisiert auf eine externe Festplatte – und kombiniert dabei die Stärken zweier bewährter Werkzeuge.
Die Idee dahinter
Das Programm nutzt zfs send, um konsistente Snapshots der ZFS-Datasets zu erzeugen, und übergibt diese Streams an Restic, das die Daten dedupliziert, verschlüsselt und versioniert im Backup-Repository ablegt. Restic-Repository und Passwortdatei werden beim ersten Lauf automatisch erzeugt – eine manuelle Einrichtung ist nicht nötig.
Gesichert wird alles, was zu einer Maschine gehört: die Laufwerke der VMs, die Dateisysteme der LXC-Container sowie deren Proxmox-Konfiguration. Optional lassen sich zusätzliche lokale Verzeichnisse einbeziehen. Über eine schlanke Konfigurationsdatei bestimmt man, welche Maschinen ausgeschlossen werden, ob Templates übersprungen werden und welche Ordner unberücksichtigt bleiben sollen.
Full- und Differential-Backups
Statt jedes Mal alles komplett zu sichern, arbeitet das Skript mit einem Full/Differential-Konzept. Jedes Differential ist ein Delta gegen das letzte Voll-Backup – das spart erheblich Speicherplatz und Zeit. Ein neues Voll-Backup wird nur geschrieben, wenn es wirklich nötig ist: an einem optional festgelegten Wochentag, wenn das letzte Full älter als eine einstellbare Anzahl Tage ist, oder wenn die Grundlage für ein Differential fehlt.
Snapshots
Die vom Programm gesicherten Snapshots erstellt das Programm NICHT selbst, diese müssen mit externen Mitteln erstellt werden. Ich behelfe mir hier seit jeher mit cv4pve-autosnap , welches ich täglich abends VOR DEM BACKUP aufrufe. Die hier konfigurierte Retention muss größer sein als das Intervall von Full-Snapshots. Sollte der letzte vorgefundene Snapshot älter als 86400 Sekunden (1 Tag) sein, gibt es eine Warnung, auf die mit einem E-Mail Programm gefiltert werden kann.
Automatische Aufräum-Logik
Alte Sicherungen werden nach einer konfigurierbaren Aufbewahrungsregel (täglich, wöchentlich, monatlich) automatisch entfernt. Dabei achtet das Programm darauf, keine Voll-Backups zu löschen, von denen noch benötigte Differentials abhängen.
Wird ein neues Voll-Backup fällig und der Platz auf dem Datenträger reicht nicht aus, baut das Skript die Historie selbstständig ab – vom ältesten Backup an, notfalls bis das Medium leer ist – und warnt deutlich, falls ein größerer Datenträger nötig wird.
Sicherheit und Betrieb
Vor jedem Lauf prüft das Programm Systemzustand, Pool-Status und Speicherbelegung. Ein Lock verhindert parallele Läufe, nach dem Backup folgt eine Integritätsprüfung der neu geschriebenen Daten. Auf Wunsch verschickt das Skript eine E-Mail mit dem Ergebnis und versetzt die Backup-Platte anschließend in den Standby.
So entsteht ein Backup, das ohne tägliches Zutun läuft, sparsam mit Speicher umgeht und sich im Ernstfall zuverlässig zurückspielen lässt.
Speicherverbrauch und Deduplizierung von zfs_send
Sofern der Basis-Snapshot einer Full-Sicherung verschieden ist, ist die Deduplizierung durch restic nahezu 0 %.
Zwei verschiedene full Backups überschneiden sich gar nicht – anders als etwa ein RAW Image des Datenträgers (vgl. Proxmox Backup).
Dazu kommt, dass ein komprimierter zfs_send Stream (zstd9) in etwa 20 - 25% größer ist als ein zstd-VMA Abbild durch vzdump.
Auf der Haben-Seite stehen die differentiellen Tages-Images, die meist nur ein Bruchteil (1 - 5%) eines Voll-Backups benötigen.
Wer nur alle 2 Tage ein Voll-Backup durchführt, hat die Speicherplatzersparnis (und damit auch die I/O) bereits wieder eingespart.
Installation und Konfiguration
Abhängigkeiten:
apt install restic jq pv
Alle drei Dateien nach /usr/local/bin/ kopieren und .txt Endung entfernen.
chmod +x ResticBackup.sh
chmod +x ResticRestore.sh
UUID der ext. Festplatte herausfinden und in die /usr/local/bin/config.cfg eintragen.
blkid
Alle auskommentierten Parameter in der Restic Restore entsprechen dem optionalen Default.
Sicherung aller VMs, LXC Container und den optionalen zu sichernden LOCAL_DIRS durchführen:
./ResticBackup.shSicherung von Maschine 115 durchführen:
./ResticBackup.sh 115
Restore
./ResticRestore.sh --help
# z.B.
./ResticRestore.sh --machine 115 --target 9115
Lizenz
Gemeinfrei nach CC-0
