fdupes: Hardlinks und Backup mit rsync

Wie in meinem Blog-Beitrag fdupes- Duplikate finden beschrieben, kann man doppelte Dateien auch mit Hardlinks zusammenführen.
Dies minimiert die Gefahr, doppelte Dateien aus den „falschen“ Verzeichnissen zu löschen. Jedoch bleiben die Dateieinträge in jedem Verzeichniss erhalten.
Was bei der normalen Arbeit mit dem Rechner/Server tendenziell nicht stört, wird beim Kopieren oder Backupen plötzlich zum Problem….

Nehmen wir an, wir haben eine 600MB großes CD-Image einer Linux-Distribution im Verzeichnis „CD-Images“ liegen. Das gleiche Image liegt auch im Verzeichnis „CD-Images-unsortiert“(welches in diesem Beispiel ein Unterverzeichnis von „CD-Images“ ist) und im Verzeichnis „Downloads“.
Somit würden auf dem Datenträger für dieses eine, gleiche, Image 1,8GB belegt werden.
Mit dem Ausführen eines fdupes ./ -rL würden diese Images verlinkt
[+] ./CD-Images/Linux-Image.iso
[h] ./CD-Images/CD-Images_unsortiert/Linux-Image.iso
[h] ./Download/Linux-Image.iso
Jetzt werden nur noch einmal die 600MB-Imagegröße belegt.

Würde man jetzt das Verzeichnis „CD-Images“ rekursiv (mit Unterverzeichnissen) auf eine externe Festplatte (oder andere Partition) kopieren, würden 1,2GB kopiert.
Kopiert auch noch das Verzeichnis „Downloads“ auf die externe Festplatte wird das Image wiederum kopiert und es würden 1,8GB auf der externen Festplatte belegt werden.
Der Grund dafür ist, dass für das Betriebssystem ein Hardlink kein Link, sondern die Datei (auf die der Hardlink verweist) ist.
Für das Betriebssystem liegen immer noch 3 600MB große Images in 3 Verzeichnissen. Nur für das Dateiystem ist es eine Datei, welche auf 3 Verzeichnisse verweist.
Um nun die Datei und die Hardlinks zu kopieren kann man den Befehl rsync verwenden.
rsync besitzt u. a. auch den Parameter -H, welcher Hardlinks erkennt und auf der Ziel-Partition repliziert.

Mit

würde das Verzeichnis „CD-Images“ mit dem Unterverzeichnis „CD-Images-unsortiert“ auf einen externen Datenträger repliziert und das Linux-Image.iso würde auch auf dem Ziel nur 600MB belegen, da die Hardlinks erhalten bleiben.
Ein weiteres

würde zwar das Verzeichnis „Downloads“ replizieren aber weitere 600MB mit dem Linux-Image.iso belegen, da rsync Hardlinks nur ab seinem übergebenen Quellverzeichis rekursiv erkennen kann.
Da aber beim kopieren/synchronisieren von „Downloads“ das rsync keinen Zugriff auf „CD-Images“ hatte, konnte rsync auch keinen Hardlink verifizieren und behandelt die Datei Linux-Image.iso als eigenständige Datei.
Würden also mit einem rsync von einem Rechner/Server die Verzechnisse einzeln auf einen externen Datenträger als Backup synchronisiert, so kann das Backup mehr Speicherplatz benötigen, als auf dem Quell-Rechner/Server belegt sind.
Es kann durchaus sinnvoll sein Verzeichnisse einzeln zu sichern (Synchronisationsdauer). In diesem Fall sollten aber auch keine Hardlinks mit fdupes verzeichnisübergreifend erzeugt werden.
Wenn mit fdupes Hardlinks verzeichnisübergreifend erzegt werden, so sollte dies bei einem Backup berücksichtigt werden.