Rechner mit rsync synchronisieren

Aus EasyLinux 03/2005

Rechner mit rsync synchronisieren

Synchron schalten

Mit Rsync synchronisieren Sie Daten entweder auf einem lokalen Rechner oder über ein Netzwerk. Vor dem eigentlichen 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 Daten auf lokalen und entfernten Systemen. Dabei erhält es Dateieigenschaften wie Rechte oder Eigentümer und berücksichtigt optional sogar symbolische Links (also Verweise auf andere Dateien). Besonders beim Kopieren großer Datenmengen leistet rsync wertvolle Dienste: Es überträgt nur nicht vorhandene Teile und eignet sich daher auch ideal zur Wiederaufnahme abgebrochener Transfers.

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 im Gegensatz zu Unison (siehe Artikel ab Seite 17 in dieser Ausgabe) rsync grundsätzlich nur in eine Richtung arbeitet. Der generelle Aufruf lautet daher stets:

rsync quelle ziel

Nach dem Abgleich enthält das Ziel die selben 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. Es sollen alle Dateien (repräsentiert durch das Sternchen *) im Verzeichnis mp3_1 in den Ordner mp3_2 übertragen werden:

$ rsync -n 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 in diesem Fall übergangen (englisch = “to skip”), die Datei huhn1.mp3 aus dem Quellverzeichnis wandert ins Zielverzeichnis. Danach folgen Angaben zur Datenmenge und zur Übertragungsrate.

Wollen Sie das Unterverzeichnis in den Abgleich einschließen, nutzen Sie dazu die Option -r (wie “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 über den Parameter -a alle notwendigen Aktionen unter einen Hut.

So zeigt ein erneuter Testlauf mit den Optionen -an, dass der Abgleich diesmal auch das Unterverzeichnis mit berücksichtigt (Abbildung 1).

Abbildung 1: Bei Verwendung der Option "-a" kopiert "rsync" nicht nur rekursiv, sondern behält auch alle Dateieigenschaften bei.

Abbildung 1: Bei Verwendung der Option “-a” kopiert “rsync” nicht nur rekursiv, sondern behält auch alle Dateieigenschaften bei.

Damit rsync seine Aufgaben nun auch wirklich erledigt, lassen Sie beim nächsten Aufruf die Testmodus-Option -n weg. Dabei unterdrückt rsync allerdings die Ausgabe der kopierten Dateien und Verzeichnisse. Falls Sie das stört, hängen Sie zusätzlich den Parameter -v an: Damit zeigt rsync wieder an, was im Hintergrund passiert.

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 deren veralteten Versionen überschreiben.

Um zu überprüfen, welche Dateien älter sind, können Sie zum einen KDEs Datei-Manager Konqueror heranziehen. Dort betrachten Sie die Dateieigenschaften über das Menü Ansicht / Anzeigemodus / Detaillierte Verzeichnis-Ansicht. Alternativ setzen Sie auf der Kommandozeile den Befehl ls mit der Option -l ein (Abbildung 2). In dessen Ausgabe sehen Sie rechts den Dateinamen, davor stehen Datum und Uhrzeit der letzten Veränderung. Als weiter Angaben finden Sie hier unter anderem die Dateigröße in Byte sowie den Besitzer und seine Gruppe.

Abbildung 2: Überprüfen Sie vor dem Abgleich die Dateieigenschaften und das Datum der letzten Änderung, um Datenverlust zu vermeiden.

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ägstrichen 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.

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 beispielsweise das Programm SSH zur Hilfe [1]. Die meisten Distributionen richten es standardmäßig während der Installation ein. Näheres dazu finden Sie im Kasten rsync und SSH auf Seite ##.

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 mit entfernten Computern verbinden kann. Dazu stellt SSH über Port 22/tcp eine authentifizierte und verschlüsselte Verbindung zwischen den Rechnern her. Eine ausführliche Beschreibung des Programms finden Sie in [1].

Damit sie SSH zusammen 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.

Fedora Core und Suse Linux 9.1 (Professional wie Personal) installieren standardmäßig sowohl den Client als auch den Server für SSH und aktivieren den Daemon.

Dies gilt im Prinzip auch für Suse Linux 9.2, das jedoch im Gegensatz zu Fedora und seinem Vorgänger in der Firewall entsprechende Verbindungen nicht automatisch erlaubt. Sie müssen diese bei der Installation oder nachträglich über YaST gestatten.

Die Standardinstallation von Mandrake Linux dagegen lässt SSH komplett außen vor. Starten Sie zur Einrichtung der Software den Paketmanager und suchen Sie nach “openssh”. Nach der Installation der beiden gefundenen Pakete können Sie sowohl den SSH-Client als auch den entsprechenden Server sofort nutzen.

Außerdem muss auf beiden Rechnern rsync installiert sein – und das möglichst in der identischen 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 2.5.7  protocol version 26
…

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 -e ssh quelle [benutzer@]zielrechner:zielverzeichnis/

Die Angabe -e ssh sollten Sie bei der Remote-Synchronisierung aus Sicherheitsgründen immer verwenden: Die Daten gehen dann nicht im Klartext über das Netz, sondern werden verschlüsselt.

Den Ausdruck zielrechner im Beispiel können Sie wahlweise durch den Rechnernamen (z. B. rechner.domain.de) oder durch 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).

Nach Bestätigung des rsync-Kommandos durch [Eingabe] erfolgt eine Passwortabfrage. Das Kennwort tippen Sie auf Aufforderung blind ein, es erscheinen also keine Sternchen statt des Passworts. Um zunächst einfach nur die Daten des entfernten Rechners anzuzeigen, lassen Sie die Angaben zum lokalen Computer einfach weg:

$ rsync -e ssh user@192.168.1.10:mp3/
Password:
drwxr-xr-x        4096 2005/01/12 15:21:35 .
-rw-r--r--     3917824 2005/01/11 21:44:13 huhn1.mp3
-rw-r--r--     3144393 2005/01/11 21:44:13 huhn2.mp3
-rw-r--r--     5186569 2005/01/11 21:44:13 huhn3.mp3
-rw-r--r--     4855776 2005/01/11 21:44:13 huhn4.mp3
-rw-r--r--     3495897 2005/01/11 21:44:14 huhn5.mp3
drwxr-xr-x        4096 2005/01/12 15:21:44 unterverzeichnis

Nach Eingabe des Passwortes und Bestätigen durch [Eingabe] 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 -e ssh user@192.168.1.10:mp3
Password:
drwxr-xr-x        4096 2005/01/12 15:21: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 die Option gegebenenfalls durch -v, um die Arbeit von rsync zu verfolgen.

$ rsync -e ssh -av user@192.168.1.10:mp3/ mp3/
Password:
receiving file list … done
huhn1.mp3
huhn2.mp3
huhn3.mp3
huhn4.mp3
huhn5.mp3
unterverzeichnis/huhn1.mp3
unterverzeichnis/huhn2.mp3
unterverzeichnis/huhn3.mp3
wrote 48 bytes  read 258 bytes  122.40 bytes/sec
total size is 32849245  speedup is 107350.47

Gerade bei großen Datenmengen empfiehlt sich darüber hinaus, mit dem Parameter -z eine Komprimierung einzuschalten. Das macht jedoch nur dann Sinn, wenn es sich nicht ohnehin um ein komprimiertes Datenformat handelt, wie bei den MP3-Dateien unseres Beispiels.

Möchten Sie sich Tipparbeit ersparen und nicht immer wieder -e ssh eingeben, dann definieren Sie durch Setzen der Bash-Umgebungsvariable RSYNC_RSH den Einsatz von ssh als Standard. Einmalig setzen Sie die Variable durch das Kommando export RSYNC_RSH=ssh. Beim nächsten rsync-Aufruf können Sie die Option -e ssh nun weglassen.

Um die SSH-Verbindungsaufnahme dauerhaft einzurichten, tragen Sie den Befehl in die Konfigurationsdatei der Bash ein. Sie finden diese in Ihrem Home-Verzeichnis unter dem Namen .bashrc (beachten Sie den Punkt am Dateianfang). Zum Bearbeiten der Datei verwenden Sie einen Text-Editor wie Kate oder KWrite.

Ausgeschlossen

rsync kann bei Bedarf auch bestimmte Dateien vom Synchronisieren ausschließen. Dazu setzen Sie die Option –exclude=suchmuster ein und spezifizieren als suchmuster genauer, was auszuklammern ist. Ein solches Suchmuster besteht aus zwei Komponenten: der Angabe, nach welchem Zeichen gesucht wird, und der Angabe, wie oft die gesuchten Zeichen auftreten dürfen.

Zwar lassen sich solche Suchmuster beliebig kompliziert gestalten, meist decken aber Wildcards das Gewünschte schon ab. So lässt ein Fragezeichen in einer Zeichenkette nur denjenigen Buchstaben unbestimmt (z. B. h?llo => hallo, hGllo, h7llo, …), an dessen Position sich das Fragezeichen befindet. Ein Stern dagegen steht für beliebig viele verschiedene Zeichen (z. B. G*ss => Guss, Genuss, …). Um also alle Dateien mit der Endung .bak von einem 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 ausgeklammer, möchten dann jedoch 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. Allerdings beschreiben Sie in diesem Fall jene Dateien, die doch in den Transfer mit aufgenommen werden sollen.

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. Mittels –delete entsorgen Sie 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 regelmäßige Backups über rsync kann dieses 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, dann wandern unweigerlich auch die überflüssigen Dateileichen wieder mit zurück.

Zum Testen setzen Sie vorsichtshalber zunächst wieder den Parameter -n ein:

$ rsync -e ssh -an dokumente/ user@192.168.1.10:dokumente
Password:
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 beispielsweise die Daten einer vorliegenden CD oder DVD via Internet mit einer neueren Version des Mediums aktualisieren, müssen Sie dazu nicht das komplette Image vom Server herunterladen. Sie können statt dessen das Transfervolumen begrenzen, indem Sie rsync nur die geänderten Teile der Datei synchronisieren lassen.

Dazu erstellen Sie zunächst ein Image, also ein Abbild der Daten-CD/DVD. Auf der Kommandozeile erledigen Sie das nach dem Mounten des Mediums z. B. mit dem Aufruf:

mkisofs -r -J -o image.iso /pfad/zur_cd

Dabei ersetzen Sie die Angabe /pfad/zur_cd durch den Gerätenamen, der auf Ihrer Distribution zum Einsatz kommt: Also unter Suse Linux durch /media/cdrom oder unter Fedora Core 2 durch /media/cdrecorder. Das neu anzulegende ISO-Image landet in der Datei image.iso.

Anschließend schauen Sie sich auf den Download-Seiten des entsprechenden Projektes nach einem rsync-Mirror um. 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://adresse.zum.server/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 aufgespü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 plus das aktualisierte Image zusammen verschlingen. Sind Sie nicht sicher, ob die Speicherkapazität ausreicht, schauen Sie z. B. mit dem Befehl df (englisch “disk free”) und dem Parameter -h (“human readable”) nach:

$ df -h
Filesystem           Größe Benut  Verf Ben% Eingehängt auf
/dev/hda12            7,6G  6,5G  681M  91% /
/dev/hda7              99M  4,4M   90M   5% /boot
/dev/hda13             79G   55G   21G  73% /home

Die Ausgabe verrät: Auf der Root-Partition sind noch 681 MByte, auf der Boot-Partition nur noch 90 MByte und auf der Home-Partition stattliche 21 GByte verfügbar.

Abgebrochen?

Gerade beim Kopieren großer Dateien ist es ärgerlich, wenn ein mit scp[1] 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”.

Eine interessante Möglichkeit bietet in diesem Zusammenhang der Einsatz der 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 -e ssh --partial --progress user@192.168.1.10:film.mpeg .
Password:
film.mpeg
    22543992   3%    5.15MB/s    0:02:14

Der Einsatz von –partial verhindert, dass rsync nach einer Unterbrechung die versteckte Teildatei 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 Download-Volumen 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 dem Befehl 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, dann 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] SSH-Artikel: Elisabeth Bauer, “Remote Control”, EasyLinux 11/2003, S. 72 ff., https://www.linux-community.de/artikel/4607

EasyLinux 03/2005 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben