System-Rollback auf ext4 mit rsync und Hardlinks: Eine praktische Implementierung
Standard-Linux-Installationen auf ext4 verfügen nicht über integrierte Snapshot-Funktionen, was schnelle Rollbacks auf vorherige Zustände erschwert. Backup-Tools wie borg oder restic konzentrieren sich auf langfristige Datenspeicherung statt auf lokale Rollbacks. Die Wiederherstellung aus einem vollständigen Backup dauert Stunden und verarbeitet große Datenmengen, was ineffizient ist, um lokale Konfigurationsfehler oder Probleme nach Updates zu beheben.
Die Lösung minimiert Abhängigkeiten: Es ist nicht nötig, das Dateisystem zu ändern, LVM zu verwenden oder spezielle Dateisysteme wie Btrfs/ZFS einzusetzen. Der Ansatz basiert auf rsync mit Hardlink-Unterstützung für Deduplizierung.
Funktionsweise: rsync + Hardlinks
rsync synchronisiert Verzeichnisse, indem nur Änderungen kopiert werden. Die Option --link-dest ermöglicht den Verweis auf einen vorherigen Snapshot: Unveränderte Dateien werden über Hardlinks wiederverwendet, was den Speicherverbrauch minimiert. Ein Hardlink ist ein zusätzlicher Name für denselben Inode und gewährleistet keinen Mehraufwand für unveränderte Daten.
Grundbefehl zur Erstellung eines Snapshots:
rsync -aHAX --numeric-ids --delete --link-dest="$PREV" "$SRC" "$DEST_TMP/"
-a: Archivmodus (rekursiv, bewahrt Berechtigungen, Zeitstempel).-H: Bewahrt Hardlinks.-A: Bewahrt ACLs.-X: Bewahrt erweiterte Attribute.--numeric-ids: Verwendet numerische UID/GID.--delete: Entfernt zusätzliche Dateien im Zielverzeichnis.
Dies bringt den aktuellen Zustand in einen Snapshot, wobei nur das Delta kopiert wird.
Snapshot-Speicherstruktur
Snapshots werden in .infra_snapshots/ als reguläre Verzeichnisse mit Zeitstempeln gespeichert:
.infra_snapshots/
├── system/
│ ├── 2026-03-01_00-30-00/
│ ├── 2026-03-02_00-30-00/
│ └── LATEST -> 2026-03-02_00-30-00/
├── docker/
│ ├── 2026-03-01_23-30-00/
│ └── LATEST -> 2026-03-01_23-30-00/
Der LATEST-Symlink zeigt auf den neuesten Snapshot für die Automatisierung. Die Trennung von system und docker isoliert Systemdateien von Container-Daten: Docker-Volumes werden ausgeschlossen, um Probleme mit veränderlichen Daten zu vermeiden.
Erstellungsprozess:
- Erstelle ein temporäres Verzeichnis
.tmp-YYYY-MM-DD_HH-MM-SS. - Führe rsync darin aus.
- Benenne atomar um:
mv -T "$TMP_DEST" "$FINAL_DEST". - Aktualisiere
LATEST:ln -sfn "$FINAL_DEST" "$LATEST_LINK".
Dies gewährleistet Atomarität: Der Snapshot ist entweder vollständig oder nicht vorhanden.
Wiederherstellung des Zustands
Rollback beinhaltet umgekehrte Synchronisation mit einem Trockenlauf zur Vorschau:
rsync -aHAX --numeric-ids --delete --dry-run "$SNAP/" "/"
Nach der Überprüfung entferne --dry-run zur Anwendung. rsync bringt das Wurzelsystem in den Snapshot-Zustand, löscht neue Dateien und stellt alte über Hardlinks wieder her.
Für Docker: Ähnlich, aber nur auf Container-Verzeichnissen, Volumes ausgeschlossen.
Grenzen des Ansatzes
- Fehlende System-Atomarität: rsync liest Dateien sequentiell; das System kann sich während der Erstellung ändern. Snapshots sind dateikonsistent, aber nicht augenblicklich.
- Veränderliche Daten: Logs, Datenbanken und temporäre Dateien können sich in einem Zwischenzustand befinden. Schließe sie mit
--excludevon rsync aus. - Speicherplatz: Neue Dateiversionen belegen Platz; bereinige alte Snapshots regelmäßig.
- Nicht für Hochlast-Produktion: Geeignet für Server/Desktops mit geringer Aktivität während der Snapshot-Erstellung.
| Szenario | Erstellungszeit (ca.) | Speicherverbrauch |
|----------|---------------------------|---------------|
| Tägliches System | 2-5 min | 100-500 MB |
| Docker nach Updates | 1-3 min | 50-200 MB |
Automatisierung
Integriere in cron für tägliche Snapshots:
- 00:30: system.
- 23:30: docker.
Das Skript sollte rsync-Ausgaben protokollieren, Exit-Codes prüfen und bei Fehlern benachrichtigen.
Wichtige Punkte:
- rsync mit
--link-destemuliert Snapshots auf ext4 ohne Änderung des Dateisystems. - Hardlinks ermöglichen Deduplizierung: Unveränderte Dateien werden nicht dupliziert.
- Atomarität über temporäre Verzeichnisse verhindert partielle Snapshots.
- Trennung von System/Docker verbessert die Rollback-Genauigkeit.
- Trockenlauf ist vor der Wiederherstellung für Sicherheit unerlässlich.
Der Ansatz ist transparent, verwendet nur Standard-Linux-Utilities und skaliert auf jedes ext4-System.
— Editorial Team
Noch keine Kommentare.