rsync1) ist sowohl ein Netzwerkprotokoll (TCP Port 873) als auch ein unter der GPL stehendes Programm zur Synchronisation von Daten, meistens über ein Netzwerk. Die Synchronisation läuft bei rsync nur unidirektional, also von einem Quellverzeichnis zu einem Zielverzeichnis, ab. Wenn beide Verzeichnisse geändert wurden, werden die Änderungen nicht zusammengeführt (merge), sondern die Änderungen im Zielverzeichnis gehen verloren. Bei der Datenübertragung werden Teile einer Quelldatei (die zu übertragende Datei), die sich bereits in der Zieldatei befinden, nicht übertragen, wodurch viel Transfervolumen gespart werden kann (Delta-Kodierung)2)3).
rsync kann zB immer dann verwendet werden, wenn ein Fileserver auf neue Hardware umzieht. Im Gegensatz zu normalen Kopiervorgängen, wo uU bei einem Fehler der komplette Kopiervorgang abgebrochen wird, kann rsync diese Fehler ignorieren bzw. übergehen und ggf die Fehler in ein Log-File schreiben. Gerade bei Fileservern kann es uU auch wichtig sein, den original Zeitstempel der Dateien und Verzeichnisse zu erhalten; normale Kopiervorgänge zB ändern das Änderungsdatum auf das aktuelle zum Zeitpunkt des Kopierens. rsync wird durch seine Eigenschaft, nicht den gesamten Verzeichnisbaum zu kopieren, sondern nur geänderte Daten und davon auch nur Teile, auch in verschiedenen Backup-Szenarien Anwendung finden.
Syntax
Access via remote shell:
Pull: rsync [OPTION…] [USER@]HOST:SRC… [DEST]
Push: rsync [OPTION…] SRC… [USER@]HOST:DEST
Access via rsync daemon:
Pull:
rsync [OPTION…] [USER@]HOST::SRC… [DEST]
rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION…] SRC… [USER@]HOST::DEST
rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST
rsync 3.0.7 | ||
---|---|---|
Option (lang) | (kurz) | Bedeutung |
--help | -h | Hilfe anzeigen |
--archive | -a | Archiv-Modus = -Dgloptr (-Do benötigen root-Rechte!) device group links owner permission times recursive |
-D | Geräte + Spezialdateien transferieren (nur root!) | |
--group | -g | Besitzer-Gruppe transferieren |
--links | -l | Symbolische Links transferieren |
--owner | -o | Besitzer transferieren (nur root!) |
--perms | -p | Zugriffsrechte transferieren |
--times | -t | Datum transferieren |
--recursive | -r | Ganze Verzeichnis-Bäume replizieren |
--rsh=CMD | -e | Zu benutzende "Remote Shell" (z.B. ssh) |
--compress | -z | Komprimierung der Datenübertragung (remote sinnvoll) |
--quiet | -q | Ablaufmeldungen unterdrücken (nur Fehlermeldungen) |
--verbose | -v | Meldung pro transferierter Datei |
2x --verbose | -vv | Meldung mit übersprungenen Dateien |
3x --verbose | -vvv | Meldung mit Debuginfo (sehr viel!) |
--delete | Dateien löschen, die auf dem Sender fehlen | |
--delete-during | Dateien WÄHREND Transfer löschen [--del] | |
--delete-before | Dateien VOR Transfer löschen | |
--delete-after | Dateien NACH Transfer löschen | |
--dry-run | -n | Aktionen nur anzeigen, NICHT ausführen |
--update | -u | Neuere Dateien NICHT überschreiben |
--hard-links | -H | Harte Links erhalten (aufwendig!) |
--sparse | -S | Sparse Dateien erhalten (lange 0-Byte Sequenzen) |
--acls | -A | ACLs transferieren (enthält --perms) |
--ignore-errors | Löschen auch bei aufgetretenen I/O Errors | |
--ignore='[Pattern]' | Dateien die dem angegebenen Pattern entsprechen ausschließen | |
--extended-attributes | -X | »Nur Mac OSX« Extended Attributes transferieren |
--filter="[+/-] [Pattern]" | -f | Elemente auf die das angegebene Suchpattern zutrifft kopieren (+) bzw. weg lassen (-) |
Lokal das Verzeichnis »~/Desktop/Bilder« nach »/tmp/archiv« kopieren:
$ rsync ~/Desktop/Bilder/ /tmp/archiv/
Dadurch werden nur Dateien aus dem Bilder Ordner synchronisiert, evtl. vorhandene Unterverzeichnisse werden nicht berücksichtigt. Ebenfalls wird den Dateien im Zielverzeichnis das zum Zeitpunkt der Synchronisation aktuelle Datum als Änderungsdatum vergeben. Um nun evtl. vorhandene Unterverzeichnisse mit zu synchronisieren und den Dateien ihren eigentlichen Zeitstempel bzgl. des Änderungsdatums zu erhalten, verwenden Sie die Optionen -r (rekursiv) und -t (time):
$ rsync -rt ~/Desktop/Bilder/ /tmp/archiv/
Jetzt werden auch die Unterverzeichnisse von »~/Desktop/Bilder« übertragen und der originale Zeitstempel wird beibehalten. Wenn jetzt im Quellverzeichnis Dateien liegen, die unterschiedlichen Benutzern gehören, würde bei og Kommando im Zielverzeichnis jede Datei dem User gehören, der den rsync Befehl ausführt. Um die Owner Informationen zu erhalten, verwenden Sie den Schalter -o für den Eigentümer und -g für die Gruppe Note: Diese Option darf nur root verwenden, daher müssen Sie bei dieser Option das rsync-Kommando mit sudo ausführen:
$ sudo rsync -rtog ~/Desktop/Bilder/ /tmp/archiv/
Jetzt haben wir bereits den Inhalt des Quellverzeichnissen mit samt seinen Unterverzeichnissen (-r) übertragen, wir haben den Zeitstempel (-t), Besitzer (-o) und Gruppe (-g) erhalten, jetzt bräuchten wir noch die Zugriffsrechte an sich. Um die ACLs zu erhalten, verwendet man den Schalter -p andernfalls würden die Verzeichnisse und Dateien die Standardberechtigungen, welche in der umask vorgegeben sind, erhalten:
$ sudo rsync -rtogp ~/Desktop/Bilder/ /tmp/archiv/
Mittlerweile haben wir schon ein recht brauchbares Ergebnis.
Remote Login: Jetzt können wir mal damit beginnen, ein Verzeichnis auf einen anderen Rechner zu synchronisieren. Dafür müssen die Zugangsdaten eines berechtigten Benutzers auf der Zielmaschine bekannt sein und auch den kompletten (absolute) Pfad zum Zielverzeichnis muss man angeben. Um nun das og Testverzeichnis ~/Desktop/Bilder mit dem letzten Parametersatz (-rtogp) auf einen anderen Rechner (192.168.111.159) mit dem Benutzer dtp als Logininformation in das Verzeichnis /tmp/archiv zu kopieren verwenden Sie folgendes Kommando:
$ sudo rsync -rtogp ~/Desktop/Bilder/ dtp@192.168.111.159:/tmp/archiv/
In diesem Fall werden Sie zweimal aufgefordert ein Passwort einzugeben. Das erste mal für das sudo Kommando → Das ist das Passwort eines administrativen Benutzers (root) auf der lokalen Maschine) und das zweite Mal für die Login Daten des Remote Servers.
Einsatz von Filtern: Um nur die Verzeichnisstruktur, jedoch keine Dateien zu kopieren, können entsprechende Filter gesetzt werden. Der Filter »-f"+ */"« includiert (+) alle Verzeichnisse (*/) und der Filter »-f"- *"« schließt alle Dateien aus:
$ rsync -a -f"+ */" -f"- *" /Quelle /Ziel
Um nur die Verzeichnisstruktur und PDF Dateien zu kopieren und alle anderen Dateien wegzulassen, erweiteren Sie die vorrangegangenen Filter um den Filter »-f"+ *.pdf"«:
$ rsync -a -f"+ */" -f"+ *.pdf" -f"- *" /Quelle /Ziel
Die rsync Implementierung unter Mac OSX hält noch eine Besonderheit bereit, es kann mit den »Extended Attributes« von Apple umgehen. Wir wollten damit über den Umweg einer Mac OSX Workstation einen Third Party AFP Server (Helios) auf einen anderen (ExtremeZ-IP) migrieren. Dabei wurden auf der Workstation beide Server gemountet und im Terminal ein rsync mit dem Parametersatz »rsync -vvrltuX --ignore-errors --delete --force --exclude='Network Trash Folder' $SRC $DST« angeworfen. Dabei sorgt dann im Prinzip das AFP Protokoll für die Weitergabe der EAs und jeder AFP Server für sich dann für das korrekte Abspeichern der EAs in seinem Filesystem.
In diesem speziellen Setup war jedoch eine gepatchte rsync Version von Nöten. Bei der Default rsync Version 3.0.7 werden die erweiterten Attribute auf dem Quellserver nicht korrekt ausgelesen, was beim Transport einen Fehler erzeugt. Mike Bombich hat eine gepatchte Version in seinem Blog bereit gestellt, welche den korrekten Transport der EAs gewährleisten soll4). Aber auch diese Version hatte einen Bug, welcher vor Allem bei hohen Datenmengen und großen Verzeichnistiefen wieder für Probleme bei den erweiterten Attributen sorgte aber dieser Bug wurde im März 2011 dann von Mike gefixt und ab da konnten wir auch erfolgreich unseren Fileserver migrieren. Einen herzlichen Dank an Mike an dieser Stelle für den Bugfix. Leider ist es Stand 05/2013 nun so, dass Mike diese Version von seiner Webseite entfernt hat.
— pronto 2011/01/28 10:10