Beibehalten vorhandener Zielsymlinks mit rsync

9

Ich verwende rsync (1) , um ein lokales Debian-Repository auf dem neuesten Stand zu halten. Vor kurzem hat die Festplatte, auf der ich sie speichere, nicht mehr genügend Speicherplatz. Daher habe ich mich für die Verwendung von Symlinks entschieden, damit ich einige der Verzeichnisse auf eine andere Festplatte ähnlicher Größe verschieben kann.

Leider scheint rsync die Symlinks zu löschen und die fast volle Festplatte wieder aufzufüllen. Nach einiger Suche entdeckte ich die --keep-dirlinksOption zu rsync, die maßgeschneidert zu sein scheint, um mein Problem zu beheben.

Nur tut es nicht. Die Symlinks auf dem Ziel werden weiterhin gelöscht.
Hier ist mein rsync-Befehl:

rsync --recursive --keep-dirlinks --links --hard-links --times --verbose \
 --delete --delete-excluded $EXCLUDE $SOURCE_EXCLUDE \
 $RSYNC_HOST::$RSYNC_DIR/pool/ $TO/pool/

Die EXCLUDEs werden erweitert, um eine große Anzahl von Architekturen zu eliminieren, an denen ich nicht interessiert bin --exclude binary-alpha/ --exclude disks-alpha .... Vor dem Start von rsync sieht mein Poolverzeichnis folgendermaßen aus:

lrwxrwxrwx  1 root root   23 2014-09-22 13:58 contrib -> /u2/debian/pool/contrib
drwxrwxr-x 62 root root 4096 2012-04-09 03:02 main
lrwxrwxrwx  1 root root   24 2014-09-22 13:58 non-free -> /u2/debian/pool/non-free

Sobald der Rsync startet, erhalte ich Folgendes:

receiving incremental file list
deleting non-free
deleting contrib
./
contrib/
contrib/a/

Und so weiter, und die Symlinks werden durch Verzeichnisse voller Dateien ersetzt.

Beeinträchtigen einige der anderen Rsync-Optionen --keep-dirlinks? Welche kann ich nicht kombinieren? Oder ist es die Reihenfolge der Optionen, die mein Problem verursacht?

unkilbeeg
quelle

Antworten:

7

Die Optionen --deleteund --delete-excludedstören Ihren Plan, da sie feststellen, dass der Symlink nicht in der Quelle vorhanden ist, und ihn daher löschen.

Dies geschieht nur, wenn Sie anweisen rsync, das gesamte Verzeichnis mit der source/ targetNotation (dem abschließenden Schrägstrich nach der Quelle) zu kopieren . Wenn Sie source/* targetstattdessen verwenden, erweitert die Shell die Liste der zu kopierenden Dateien und Verzeichnisse. Dies ist nicht der Fall (versuchen Sie es jedoch --dry-runzuerst mit).

Anstelle dieses fragilen Setups würde ich jedoch empfehlen, die beiden Festplatten mit Hilfe von LVM zu einem großen Volume zu kombinieren, das diese Art von Trick nicht benötigt.

Sven
quelle
Vielen Dank! Ich habe das Skript geändert und es scheint zu funktionieren. Dies gibt mir ein wenig Zeit - die Festplatte wird sich immer noch füllen, aber ich habe Zeit, Dinge zu verschieben. Sie haben Recht, wenn Sie beides mit LVM kombinieren. Ich hatte bereits darüber nachgedacht, aber meine Füße zu ziehen, da es bedeutet, Dinge weg und dann wieder weiter zu bewegen. Besser früher als später, denke ich.
Unkilbeeg
Ich hatte ein ähnliches Problem, das durch die Verwendung von --keep-dirlinks ohne die von mir verwendete Option -a behoben wurde. "Geringfügige" Belästigung wie im dritten Absatz, die von mir verwendeten Dateisysteme sind 64-T-Byte-SAN- "Festplatten". Es ist zwar möglich, dass mehrere zu noch größeren Laufwerken kombiniert werden können, beispielsweise 256-Terabyte-Laufwerke, aber ich gehe davon aus, dass die Administratoren Gründe für die Größe haben, die wir haben. Manchmal sieht es so aus, als würde man nur herausfinden, wie man mit dem lebt, was man hat.
user1683793
Meine ultimative Lösung war neue Hardware. Der ursprüngliche Computer war alt genug, um nur IDE-Laufwerke zu unterstützen, und das größte Laufwerk, das Sie damals bekommen konnten, war 512G.
Unkilbeeg