Behält rsync Hardlinks auf dem Ziel bei, wenn die Quelldateien identisch, aber getrennt sind?

Behält rsync Hardlinks auf dem Ziel bei, wenn die Quelldateien identisch, aber getrennt sind?

Ich betreibe einen (Linux-basierten) Rsync-Server zur Softwareverteilung. Ein (Windows-basierter) Quellcode-Repository-Server, der sich außerhalb meiner Kontrolle befindet, sendet Softwarepakete über Rsync dorthin, und etwa hundert Satellitenserver weltweit ziehen ebenfalls über Rsync von dort.

Das Quellrepository enthält viele große doppelte Dateien. Ich möchte den Speicherplatz- und Bandbreitenverbrauch auf den Satellitenservern reduzieren, indem ich diese Duplikate durch Hardlinks ersetze. Der Administrator des Quellrepositorys ist nicht bereit oder in der Lage, dies an der Quelle zu tun, also versuche ich, es nachträglich auf dem Verteilungsserver zu tun. Ich habe ein einfaches Bash-Skript basierend auf dem fdupesBefehl erstellt, das Gruppen von Duplikaten findet und sie durch Hardlinks zu einer einzelnen Datei ersetzt. Die rsync-Übertragungen zu den Satellitenservern bewahren diese Hardlinks wie gewünscht dank der Option -H. Die Übertragung vom Quellrepository führt jedoch zu inkonsistenten Ergebnissen. Manchmal bleibt die Deduplizierung erhalten. Manchmal überträgt der Quellserver alle Dateien einer deduplizierten Gruppe erneut und die Deduplizierung wird unterbrochen, obwohl sich die Quelldateien nicht geändert haben.

Daher meine Frage: Wie verhält sich rsync offiziell, wenn es aufgefordert wird, zwei identische, aber separate Dateien zu synchronisieren, und die Dateien bereits mit dem richtigen Inhalt im Ziel vorhanden sind, aber als Hardlinks zur gleichen Datei? Was sind die genauen Kriterien für die erneute Übertragung einer Datei? Gibt es eine Möglichkeit, sicherzustellen, dass der Hardlink im Ziel in dieser Situation erhalten bleibt, auch wenn der Hardlink in der Quelle nicht vorhanden ist?

Antwort1

tl;dr: Um die Deduplizierung auf Dateiebene über Hardlinks am Ziel beizubehalten, führen Sie sie rsyncmit der --checksumOption aus.

Vollständige Antwort, basierend auf einer Reihe von Experimenten, die ich durchgeführt habe:

Wenn zwei Dateien an der Quelle nicht fest verknüpft sind, rsyncwird jede von ihnen einzeln mit dem Ziel synchronisiert. Dabei spielt es keine Rolle, ob die Dateien am Ziel fest verknüpft sind. Wenn eine der Dateien (oder beide) erneut übertragen wird, wird der feste Link am Ziel unterbrochen, andernfalls bleibt er unberührt. Das heißt, selbst mit dieser --hard-linksOption rsyncwird ein fester Link am Ziel nicht unterbrochen, nur weil die Dateien an der Quelle nicht fest verknüpft sind.

Die Kriterien für die erneute Übertragung einer Datei hängen von den Optionen --checksum( -c) und --ignore-times( -I) ab.

  • Wenn diese Option --checksumangegeben ist, werden nur Dateien erneut übertragen, die sich in Größe oder Prüfsumme zwischen Quelle und Ziel unterscheiden. Wenn sich der Dateiinhalt nicht geändert hat, bleibt folglich ein Hardlink am Ziel erhalten, auch wenn er an der Quelle nicht vorhanden ist.
  • Wenn die Option --ignore-timesangegeben ist, werden alle Dateien erneut übertragen. Dabei werden alle Hardlinks am Ziel unterbrochen, die an der Quelle nicht vorhanden sind.
  • Wenn keine dieser beiden Optionen angegeben ist, rsyncwerden für die Entscheidung die Änderungszeitstempel der Quell- und Zieldateien verwendet. In diesem Fall wird ein Hardlink am Ziel immer unterbrochen, wenn sich die Zeitstempel der beiden Quelldateien unterscheiden, da nur einer der beiden Zeitstempel übereinstimmen kann.

Antwort2

Wenn Sie die Option -H oder --hard-links verwenden, bleiben die Quell-Hardlinks erhalten.

Das wirdnichtErstellen Sie Hardlinks – das müssen Sie im Nachhinein tun, indem Sie nach Dateien mit derselben Prüfsumme suchen, eine löschen und einen Hardlink hinzufügen, um sie zu ersetzen. Schließlich möchten Sie nicht, dass rsync jede Datei mit doppeltem Inhalt zu einem Hardlink auf dieselbe Datei macht. Stellen Sie sich vor, jede Datei mit der Länge 0 wäre ein Hardlink – wenn Sie einer Datei Inhalt hinzufügen, haben Sie den Inhalt für alle geändert.

verwandte Informationen