Mit “rsync” synchronisieren Sie Dateien auf einem lokalen Rechner oder über ein Netzwerk. Beim Abgleich überprüft das Programm, welche Unterschiede es zwischen Quell- und Zieldateien gibt, und überträgt nur die Änderungen.
Das Programm rsync hilft beim Abgleich von Dateien auf lokalen und entfernten Systemen. Dabei erhält es Dateieigenschaften wie Rechte oder Eigentümer und berücksichtigt auf Wunsch sogar symbolische Links (also Verweise auf andere Dateien). Besonders beim Kopieren großer Datenmengen leistet rsync wertvolle Dienste: Es überträgt nur neue oder geänderte Teile und eignet sich auch ideal zur Wiederaufnahme abgebrochener Transfers. In der letzten Ausgabe haben wir das Programm im Guru-Training schon kurz vorgestellt [1] (dort half es beim Hochladen der Urlaubsfotos auf einen eigenen Webserver), jetzt verraten wir mehr Details und Einsatzgebiete.
Lokaler Abgleich
Um die Fähigkeiten von rsync näher kennen zu lernen, starten Sie am besten einen ersten Testlauf mit zwei lokalen Verzeichnissen. Dabei gilt es allerdings zu beachten, dass rsync grundsätzlich nur “in eine Richtung” arbeitet, es kann also unabhängige Änderungen in zwei Versionen einer Datei nicht zusammenführen (neudeutsch: “mergen”). Der generelle Aufruf hat immer diesen Aufbau:
rsync quelle ziel
Nach dem Abgleich enthält das Ziel dieselben Dateien wie die Quelle. Sie sollten sich also im Vorfeld genau überlegen, in welche Richtung Sie synchronisieren wollen.
In den beiden Testverzeichnissen namens mp3_1 und mp3_2 liegen jeweils einige Dateien sowie ein Unterverzeichnis. Nun soll der zweite Ordner mit dem ersten synchronisiert werden. Beim ersten Test kommt die Option -n zum Einsatz: Hier zeigt rsync zunächst nur an, was es im Ernstfall tun würde, führt den Abgleich aber nicht durch. Wir wollen alle Dateien (repräsentiert durch das Sternchen *) im Verzeichnis mp3_1 in den Ordner mp3_2 übertragen:
$ rsync -nv mp3_1/* mp3_2/ skipping directory mp3_1/unterverzeichnis huhn1.mp3 wrote 96 bytes read 24 bytes 240.00 bytes/sec total size is 20600459 speedup is 171670.49
Die Ausgabe verrät: Das Unterverzeichnis mp3_1/unterverzeichnis würde rsync in diesem Fall auslassen (englisch “to skip”), die Datei huhn1.mp3 aus dem Quellverzeichnis wandert ins Zielverzeichnis. Danach folgen Angaben zur Datenmenge. (Die Option -v steht für “verbose” = “wortreich” und sorgt dafür, dass überhaupt eine Ausgabe erfolgt.)
Wollen Sie Unterordner in den Abgleich einschließen, nutzen Sie dazu die Option -r (“rekursiv”). Zusätzlich kann es sinnvoll sein, bestimmte Dateieigenschaften zu erhalten: Dazu zählen etwa Eigentümer und Rechte sowie Zeitstempel (englisch “timestamps”), wie z. B. der Zeitpunkt des letzten Zugriffs oder der letzten Änderung. Sie müssen sich nicht sämtliche dafür erforderlichen Optionen einzeln merken: rsync bringt mit -a (“Archivierung”) alle sinnvollen Aktionen unter einen Hut.
So zeigt ein erneuter Testlauf mit den Optionen -anv, dass der Abgleich diesmal auch das Unterverzeichnis mit berücksichtigt (Abbildung 1). Damit rsync seine Aufgaben nun auch wirklich erledigt, lassen Sie beim nächsten Aufruf die Testmodusoption -n weg.

Abbildung 1: Bei Verwendung der Option “-a” kopiert “rsync” nicht nur rekursiv, sondern behält auch alle Dateieigenschaften bei.
Sicher ist sicher
Noch einmal die Warnung: rsync gleicht grundsätzlich nur in eine Richtung ab. Überprüfen Sie also vor dem Synchronisieren, ob Sie Quelle und Ziel tatsächlich korrekt gewählt haben. Anderenfalls kann es Ihnen passieren, dass Sie aktuelle Dateien mit veralteten Versionen überschreiben.
Um zu überprüfen, welche Dateien älter sind, können Sie zum einen KDEs Dateimanager Dolphin heranziehen. Dort betrachten Sie die Dateieigenschaften über Ansicht / Ansichtsmodus / Details oder [Strg]+[3]. Alternativ verwenden Sie den Befehl ls -l (Abbildung 2). In dessen Ausgabe sehen Sie rechts den Dateinamen, davor stehen Datum und Uhrzeit der letzten Veränderung. Als weitere Angaben finden Sie hier unter anderem die Dateigröße in Byte sowie den Dateibesitzer und die Benutzergruppe der Datei.

Abbildung 2: Überprüfen Sie vor dem Abgleich die Dateieigenschaften und das Datum der letzten Änderung, um Datenverlust zu vermeiden.
Achtung, Unterverzeichnisse!
Trickreich gestaltet sich der Einsatz abschließender Schrägstriche am Ende von Verzeichnisnamen. Abhängig davon, ob Sie als Quelle mp3_1/ oder mp3_1 angeben, verhält sich rsync unterschiedlich. Das lässt sich am besten anhand eines einfachen Beispiels nachvollziehen: Das Quellverzeichnis mp3_1 enthält ein Unterverzeichnis namens unterverzeichnis, der Zielordner mp3_2 nicht. Soll das Unterverzeichnis mitsamt seinem Inhalt in das Zielverzeichnis wandern, lautet der rsync-Aufruf:
rsync -av mp3_1/unterverzeichnis mp3_2
Setzen Sie hingegegen einen Schrägstrich hinter unterverzeichnis, wandert lediglich der Inhalt aus diesem Ordner nach mp3_2 – und zwar direkt in das Verzeichnis hinein, nicht etwa in ein dortiges Unterverzeichnis. Abbildung 3 zeigt noch einmal den Vergleich der beiden Aufrufe im Testmodus (Option -n).

Abbildung 3: Der kleine, aber feine Unterschied: Ein abschließender Schrägstrich entscheidet darüber, ob “rsync” das Verzeichnis oder nur dessen Inhalt kopiert.
In die Ferne schweifen
Zum Abgleichen von Daten mit entfernten Rechnern nimmt rsync in der Regel das Programm SSH (Secure Shell) zur Hilfe [2]. Die meisten Distributionen richten es standardmäßig während der Installation ein. Näheres dazu finden Sie im Kasten rsync und SSH. Außerdem muss auf beiden Rechnern rsync installiert sein – und das möglichst in derselben Version. Welche rsync-Version auf dem Rechner vorliegt, finden Sie auf der Kommandozeile durch Aufruf des Programms mit dem Parameter --version heraus:
$ rsync --version rsync version 3.1.1 protocol version 31 ...
rsync und SSH
SSH – das Kürzel steht für Secure Shell – bezeichnet ein Netzwerkprotokoll und ein Programm, mit dessen Hilfe man sich über ein IP-Netzwerk auf anderen Computern anmelden kann, um sie aus der Ferne über Shell-Befehle zu steuern. Dazu stellt SSH über Port 22/TCP eine authentifizierte und verschlüsselte Verbindung zwischen den Rechnern her.
Damit sie SSH mit rsync nutzen können, müssen auf dem Quellrechner der SSH-Client und auf dem Zielrechner der SSH-Daemon installiert sein. Eine Verbindungsaufnahme ist nur möglich, wenn der Daemon läuft und die Firewall des Zielrechners entsprechende Verbindungen gestattet.
- Unter Kubuntu müssen Sie das Serverpaket zunächst nachinstallieren, das gelingt mit dem Befehl
sudo apt-get install openssh-server. Er wird damit auch automatisch vorkonfiguriert und gestartet. Eine Firewall läuft unter Kubuntu nicht, so dass nach der Installation von openssh-server der Zugriff gelingen sollte. - Bei OpenSuse ist der SSH-Server vorinstalliert, allerdings ist er in der Standardeinstellung deaktiviert; außerdem läuft eine Firewall. Den ersten Punkt beheben Sie über die Befehle
sudo systemctl enable sshd.serviceundsudo systemctl start sshd.service, für die Firewall-Konfiguration wechseln Sie in YaST zum Modul Sicherheit und Benutzer / Firewall und schalten dort entweder die Firewall ganz aus oder fügen auf dem Reiter Erlaubte Dienste über Zu erlaubender Dienst den Eintrag Secure Shell Server zur Liste der Ausnahmen hinzu.
Die Verwendung von rsync zur Remote-Synchronisierung unterscheidet sich nicht wesentlich von der zum lokalen Datenabgleich. Zuerst nennen Sie auch hier die Quelle, dann das Ziel. Bei der Zielangabe ergänzen Sie jedoch die Verzeichnisangabe um den Namen oder die IP-Adresse des entfernten Rechners. Verwenden Sie auf dem Zielsystem einen anderen Benutzernamen als auf dem Quellrechner, geben Sie zusätzlich den Benutzernamen im Aufruf an:
rsync quelle [benutzer@]zielrechner:zielverzeichnis/
Den Ausdruck zielrechner im Beispiel können Sie wahlweise durch den Rechnernamen (z. B. rechner.domain.de) oder die IP-Adresse (z. B. 192.168.1.10) ersetzen. Beachten Sie auch den Doppelpunkt am Ende des Rechnernamens; erst danach folgt das Zielverzeichnis. Wie beim Kommando scp folgt nach dem Doppelpunkt wahlweise eine komplette Pfadangabe (ausgehend vom Wurzelverzeichnis, also z. B. /home/user/mp3s) oder der relative Pfad (ausgehend von Ihrem Home-Verzeichnis auf dem Zielrechner, also z. B. mp3s).
Vor dem Verbindungsaufbau via SSH erfolgt eine Passwortabfrage. Das Kennwort tippen Sie dabei blind ein, es erscheinen auch keine Sternchen. Um zunächst einfach nur die Dateien auf dem entfernten PC anzuzeigen, lassen Sie die Angaben zum lokalen Ordner einfach weg:
$ rsync user@192.168.1.10:mp3/ drwxr-xr-x 4,096 2015/12/12 15:34:35 . -rw-r--r-- 3,917,824 2015/12/11 21:44:13 huhn1.mp3 -rw-r--r-- 3,144,393 2015/12/11 21:44:13 huhn2.mp3 -rw-r--r-- 5,186,569 2015/12/11 21:44:13 huhn3.mp3 -rw-r--r-- 4,855,776 2015/12/11 21:44:13 huhn4.mp3 -rw-r--r-- 3,495,897 2015/12/11 21:44:14 huhn5.mp3 drwxr-xr-x 4,096 2015/12/12 15:21:44 unterverzeichnis
Nach Eingabe des Passworts listet rsync den Inhalt des Verzeichnisses mp3 im Home-Verzeichnis des Benutzers user auf. Auch in diesem Beispiel spielt der abschließende Schrägstrich hinter dem Verzeichnisnamen eine wesentliche Rolle. Lassen Sie ihn weg, erscheint in der Ausgabe lediglich eine Angabe zum Verzeichnis selbst:
$ rsync user@192.168.1.10:mp3 drwxr-xr-x 4,096 2015/12/12 15:34:35 mp3
Wollen Sie das Verzeichnis mp3 bzw. dessen Inhalt mit einem Verzeichnis mp3 auf dem lokalen Rechner synchronisieren, überlegen Sie zunächst wieder, welches Verzeichnis die Quelle und welches das Ziel sein soll. Liegen im Verzeichnis auf dem entfernten Rechner einige Musikstücke, die auf dem lokalen Rechner noch nicht vorhanden sind? In dem Fall ist das entfernte System die Quelle und der eigene Computer das Ziel.
Setzen Sie wieder zuerst den Parameter -n ein, um einen Testlauf zu starten. Läuft alles glatt, ersetzen Sie diese Option durch -v, um die Arbeit von rsync zu verfolgen.
Gerade bei großen Datenmengen empfiehlt sich darüber hinaus, mit dem Parameter -z eine Komprimierung einzuschalten. Das ergibt jedoch nur dann Sinn, wenn es sich nicht ohnehin um ein komprimiertes Datenformat handelt, wie bei den MP3-Dateien unseres Beispiels.
Ausgeschlossen
rsync kann bei Bedarf auch bestimmte Dateien vom Synchronisieren ausschließen. Dazu setzen Sie die Option --exclude=suchmuster ein, wobei suchmuster festlegt, was das Tool ausklammern soll. Im Suchmuster können Sie die Wildcard-Zeichen “?” und “*” verwenden, die Sie auch in anderen Shell-Kommandos einsetzen. Um z. B. alle Dateien mit der Endung .bak vom Kopiervorgang auszuschließen, tippen Sie:
rsync -av --exclude='*.bak' quelle ziel
Es spielt dabei keine Rolle, wie oft Sie die --exclude-Option einsetzen. Um mehrere Dinge auszuschließen, hängen Sie einfach mehrere --exclude-Definitionen hintereinander. Einfacher geht es allerdings, wenn Sie alle Ausnahmen in einer Textdatei definieren. Dabei schreiben Sie alle Suchmuster untereinander, die Sie ausklammern wollen. Jeder Ausdruck steht dabei in einer eigenen Zeile:
*.bak *~
Anschließend übergeben Sie rsync die Liste, die Sie z. B. ausschluss.txt genannt haben, mit dem Befehl:
rsync -av --exclude-from=ausschluss.txt quelle ziel
Haben Sie auf diese Weise allgemein alle Dateien mit der Endung *.bak ausgeklammert, möchten dann aber eine einzelne Datei mit dem Namen huhn.bak doch kopieren, müssen Sie dazu nicht die Liste ausschluss.txt neu definieren. Hier helfen die Parameter --include=suchmuster bzw. --include-from=datei, die sinngemäß genauso funktionieren wie die exclude-Optionen und vor diesen im Befehl auftauchen müssen – allerdings beschreiben Sie in diesem Fall Dateien, die das Tool doch berücksichtigen soll. Im Beispiel geht das wie folgt:
rsync -av --include='huhn.bak' --exclude-from=ausschluss.txt quelle ziel
Die Reihenfolge von --include und --exclude ist wichtig, denn für jede Datei greift die erste gefundene Regel, deren Muster passt. Wenn Sie die Reihenfolge im Beispiel ändern, passt huhn.bak zuerst auf das Ausschlussmuster, und die folgende include-Regel würde ignoriert.
Auf Nimmerwiedersehen
Zwar praktisch, aber mit größter Vorsicht zu genießen, ist die Option --delete. Wie der Name schon verrät, löscht dieser Parameter Dateien. Sie entsorgen damit auf der Zielseite alles, was in der Quelle nicht (mehr) vorhanden ist. Zum einfachen Abgleichen einer MP3-Sammlung benötigen Sie diese Möglichkeit zwar nicht; für Backups über rsync kann das Verhalten aber sehr sinnvoll sein.
Sichern Sie etwa ein umfangreiches Verzeichnis regelmäßig auf einem entfernten Rechner und vergessen, im Quellverzeichnis längst verschwundene Dokumente zu löschen, füllt sich das Zielverzeichnis mit jedem Backup mehr. Kopieren Sie diese Sicherung im Falle eines Datenverlustes zurück zur Quelle, wandern unweigerlich auch die überflüssigen Dateileichen wieder mit zurück.
Zum Testen setzen Sie vorsichtshalber zunächst wieder den Parameter -n ein:
$ rsync -anv Documents user@192.168.1.10:Documents building file list ... done deleting brief1.doc ...
Die Ausgabe verrät, was im Ernstfall gelöscht würde. Sind Sie mit dem Ergebnis einverstanden, entfernen Sie -n aus dem Aufruf.
Datenschaufel
Als besonders praktisch erweist sich rsync beim Abgleich großer Datenmengen. Wollen Sie z. B. eine CD- oder DVD-Image-Datei via Internet auf eine neuere Version des Datenträgers aktualisieren, müssen Sie dazu nicht das komplette Image vom Server herunterladen. Sie können stattdessen das Transfervolumen begrenzen und rsync nur die geänderten Teile der Datei synchronisieren lassen.
Dazu benötigen Sie zunächst lokal die Image-Datei der alten CD-/DVD-Version. Die haben Sie entweder von einem früheren Download oder erstellen sie von einer physischen CD/DVD, indem Sie mit dd den Datenträger einlesen und in eine Image-Datei schreiben:
sudo dd if=/dev/sr0 of=image.iso
(Für den Zugriff auf das DVD-Laufwerk /dev/sr0 sind Root-Rechte nötig. Bei älteren Linux-Versionen heißt die Gerätedatei evtl. scd0 statt sr0.) Anschließend schauen Sie sich auf den Downloadseiten des entsprechenden Projektes nach einem rsync-Mirror um (Abbildung 4). Um das eigene Image auf den aktuellen Stand zu bringen, setzen Sie rsync mit den Optionen -a (kopiert rekursiv und behält alle Dateieigenschaften bei), -v (für eine ausführliche Darstellung) und --progress (um den Fortschritt des Downloads zu sehen) ein:
$ rsync -av rsync://server/pfad/datei.iso image.iso
receiving file list ...
1 file to consider
image.iso
30097408 1% 1.42MB/s 0:27:51
Beachten Sie, dass rsync während der Arbeit erst ein neues Image im Hintergrund anlegt, bevor es das Original löscht. Dabei handelt es sich um eine versteckte Datei, die Sie mit dem Kommando ls -a aufspüren:
$ ls -a . .. image.iso .image.iso.CaOjeZ
Im Klartext heißt das, dass Sie so viel freien Platz auf der Platte benötigen, wie das alte und das aktualisierte Image zusammen belegen. Sind Sie nicht sicher, ob die Speicherkapazität ausreicht, schauen Sie z. B. mit df -h (englisch “disk free”, “human readable”) nach:
$ df -h Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sdb5 41G 20G 19G 52% / /dev/sdb6 570G 400G 170G 71% /home [...]
Die Ausgabe verrät: Auf der Root-Partition sind noch 19 GByte und auf der Home-Partition stattliche 170 GByte verfügbar.
Abgebrochen?
Gerade beim Kopieren großer Dateien ist es ärgerlich, wenn ein mit scp[3] gestarteter Download kurz vor Ende der Übertragung abbricht. Zwar kennt scp keine Funktion zur Wiederaufnahme unterbrochener Datentransfers, mit rsync jedoch lässt sich die unvollständige Datei “reparieren”, also der Download wieder aufnehmen. Hilfreich ist hier die Option --partial: Sie sorgt dafür, dass die schon übertragenen Daten (rsync lagert diese in der erwähnten versteckten Datei) nicht gelöscht werden:
$ rsync --partial --progress user@192.168.1.10:film.mpeg .
film.mpeg
22543992 3% 5.15MB/s 0:02:14
Der Einsatz von --partial verhindert, dass rsync nach einer Unterbrechung die unvollständige versteckte Datei einfach löscht. Dies bringt jedoch einen Nachteil mit sich: Liegt auf dem Zielrechner bereits eine ältere Version der Datei, die mit rsync aktualisiert werden soll und bricht die Übertragung nach kurzer Zeit ab, dann wird die Datei auf dem Zielrechner durch den übertragenen Teil ersetzt. Wenn Sie also gerade ein ISO-Image auf den neuesten Stand bringen und mit rsync Downloadvolumen sparen wollen, erreichen Sie durch das Überschreiben des Originals genau das Gegenteil.
Mit einem kleinen Trick verhindern Sie einen solchen Verlust: Legen Sie zunächst mit ln image.iso image_orig.iso einen Hardlink an. Dabei handelt es sich nicht etwa um eine Kopie der Datei, sondern lediglich um einen weiteren Namen. Alle Hardlinks ermöglichen gleichberechtigt den Dateizugriff – erst wenn alle gelöscht sind, verschwindet auch die Datei selbst. Für das rsync-Problem bedeutet das: Bricht die Übertragung ab, verschwindet nicht mehr das Image selbst. Die partielle Datei wird als image.iso abgelegt, das Original steht als image_orig.iso weiter zur Verfügung, und Sie können selbst entscheiden, mit welcher Version Sie den nächsten Aktualisierungsversuch unternehmen.
Infos
[1] Guru-Training zu “convert” und “rsync”: Hans-Georg Eßer, “Automatische Fotobearbeitung”, EasyLinux 04/2015, S. 114 ff.
[2] SSH-Artikel: Markus Fasse, Hans-Georg Eßer, “Ferngesteuert”, EasyLinux 02/2015, S. 50 ff.
[3] Artikel zu “ssh” und “scp”: Elisabeth Bauer, “Remote Control”, EasyLinux 11/2003, S. 72 ff., http://www.easylinux.de/2003/11/072-guru-ssh/


