Zurück zur Startseite

Rsync Hardlink für Rollback auf ext4 Linux

Der Artikel beschreibt die Implementierung von Snapshots und Rollback auf ext4 mit rsync und hardlink. Trennung von System/Docker, Atomicität, Wiederherstellbefehle. Einschränkungen und Automatisierung für Middle/Senior DevOps.

Linux ext4 Rollback: rsync und hardlink in Aktion
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
.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.

Google AdInline article slot

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 --exclude von 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-dest emuliert 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

Advertisement 728x90

Weiterlesen