Als Standardtool zur Datensynchronisation ist rsync hinlänglich bekannt. Doch rsync kann mehr als nur mit täglichen 1:1 Backups den Storage zu belasten. Über das Flag „–link-dest“ kann rsync auch inkrementelle Backups erstellen. Dabei macht es sich die Hardlink-Funktionalität des Dateisystems zu nutze und überträgt ausschließlich die Daten, die sich geändert haben, indem bereits gesicherte Daten nur „verlinkt“ werden.

Bereits auf dem Datenträger existierende Dateien nur zu verlinken, ist dabei keine Funktion von rsync, sondern die Basis dessen wie ein unix-artiges Dateisystem funktioniert. Die Position der Daten werden über so genannten Inodes festgehalten und ein Hardlink ist nichts anderes als der Dateipfad, der auf eine Inode verweist. Und das Schöne ist, dass wir unendlich viele Hardlinks auf eine Inode verweisen lassen können.

Die Basis bildet dabei das erste Vollbackup wie man es auch von der inkrementellen Backup-Software kennt:

backup_timestamp="$(date +%Y%m%d_%H%M%S)"
rsync -av --stats "${source_path}" "${backup_path}/${backup_timestamp}"

Bei allen folgenden Backups nutzen wir aber nun über „–link-dest“ das Backup des Vortages:

rsync -av --stats --delete --link-dest="${backup_path}/${last_backup}" "${source_path}"

Das Besondere ist nun, dass rsync erneut ein 1:1 Vollbackup erstellt, aber bereits existierende Dateien nur verlinkt. Anders als bei einem klassischen Vollbackup brauchen wir also für die Wiederherstellung das Backup vom Vortag gar nicht. Um genau zu sein benötigen wir keines der vorherigen Backups, denn sobald wir Backups löschen, löschen wir keine Inodes, sondern nur Hardlinks. Eine Datei ist also erst gelöscht, wenn ihr letzter Hardlink gelöscht wurde.

Da also jeder Dateipfad einem Hardlink entspricht und es dabei nicht mal wichtig ist ob es der erste oder 4. Link auf einen Inode ist, entspricht die Größe des Backups auch immer 1:1 die der Quelle:

du -h /mnt/backups/documents/20210901_044001
168G /mnt/backups/documents/20210901_044001

Möchte man dagegen mehrfache Hardlinks nicht mitzählen, muss man alle vorherigen Backups mit einbeziehen und damit ergäbe sich ein gänzlich anderes Bild:

du -d1 -h /mnt/backups/documents | sort -k2
168G /mnt/backups/documents/20210701_044001
14.2G /mnt/backups/documents/20210801_044001
3.8M /mnt/backups/documents/20210901_044001
497M /mnt/backups/documents/20211001_044001

Das Backup 20210901_044001 ist demnach nur 3.8MB groß, enthält aber trotzdem ein 1:1 Vollbackup und besitzt wie gesagt keine Abhängigkeiten zu anderen Backups. Hat man dieses Konzept erstmal verinnerlicht, merkt man wie komfortabel es im Vergleich zu anderen inkrementellen, aber auch differentiellen Sicherungen ist, die ohne die vorherigen Backups niemals wiederhergestellt werden können.

Wer Interesse an einem vollständigen Script hat, kann sich gerne meines anschauen, was sowohl auf unRAID als auch auf Synology getestet wurde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.