Aus Linux-Magazin 08/2007

Backup- oder FTP-Ersatz: Rsync hält Dateien aktuell

Rsync ist der Klassiker für Synchronisierungsaufgaben wie Backup und Mirroring: Er aktualisiert Daten in einer Richtung, überträgt also geänderte Dateien von einem Master zur Kopie. Dieser Artikel stellt Rsync vor und verrät, worauf beim Syncen zu achten ist.

Zwei Datenbestände zu synchronisieren, das bedeutet, sie identisch zu machen: Nach einer solchen Aktion liegen in den Verzeichnissen auf zwei Rechnern exakt die gleichen Dateien. Das ist in einigen Fällen eine leichte Aufgabe, etwa wenn einer der beiden Orte nur das Backup-Archiv ist, an dem es nie zu Änderungen kommt.

Anders sieht die Situation aus, wenn Anwender Dateien an einem Desktop-Rechner und parallel dazu auf einem Notebook bearbeiten, neu erzeugen oder löschen. Dann ist manchmal unklar, was zu tun ist, um einen synchronen Zustand zu erreichen.

In den kniffligeren Situationen geht es oft nicht ohne manuelles Eingreifen. Tools wie Unison (siehe Sysadmin-Einführung sowie [3], [6]) erkennen Problemkonstellationen und lassen die betroffenen Dateien in Ruhe; aus dem Log ergibt sich dann, auf welche Dateien der Anwender oder Administrator noch einen Blick werfen muss.

Ändern sich Daten immer nur an einer Stelle, reicht die einseitige Synchronisation aus. Die erledigt komfortabel ein klassisches, vom Samba-Team entwickeltes Tool namens Rsync [1], das lokal oder über das Netzwerk zwei Verzeichnishierarchien angleicht. Beim Transport übers Netz verwendet Rsync das identisch benannte eigene Netzwerkprotokoll (»rsync://«). Um den Abgleich so effizient wie möglich zu gestalten, zerlegt Rsync Dateien in Blöcke, vergleicht mit Hilfe von Prüfsummen und überträgt nur geänderte Teile.

Datensicherung mit Rsync

Das Backup-Szenario ist wohl die populärste Anwendung von Rsync: Hier gibt es zu einem Verzeichnis an anderer Stelle eine exakte Spiegelung, die ein »rsync«-Aufruf regelmäßig oder nach größeren Änderungen aktualisiert. Modifikationen an den Dateien auf dem Backup-Rechner kommen dabei nicht vor, zur Synchronisation sucht Rsync also nur auf dem Quellrechner nach neuen, veränderten oder gelöschten Dateien.

Die einfachste Möglichkeit, dieses Verhalten zu erreichen, ist ein Befehlsaufruf der folgenden Form:

rsync -av --delete Quelle Ziel

Das Ziel ist dabei häufig ein Verzeichnis auf einem entfernten Rechner, für den Verbindungsaufbau verwendet Rsync standardmäßig eine SSH-Verbindung. (Ältere Versionen erfordern dafür noch die Zusatzoption »–rsh=ssh«.) Dann hat das Ziel die Form »Rechner:Verzeichnis« oder »Benutzer@Rechner:Verzeichnis«. Ein vollständiges Beispiel sieht so aus:

rsync -av --delete /home/xyz/Daten test@backup.linux-magazin.de:/var/backup/xyz/

Die Option »-a« schaltet Rsync in den Archivmodus, sie ist eine Abkürzung für »-rlptgoD«: »-r« (rekursiv); »-lptgo« (symbolische Links, Rechte (permissions), Zugriffszeiten (times), Gruppe (group) und Besitzer (owner) bleiben erhalten; »-D« (Gerätedateien). Mit »-v« gibt sich das Tool nur etwas gesprächiger, »–delete« führt zum Löschen von Dateien im Backup, die es auf dem Quellrechner nicht länger gibt. Abbildung 1 zeigt einen Aufruf, der über die Option »–stats« noch mehr Informationen ausgibt.

Abbildung 1: Höchst ausführlich: »rsync« gibt mit den Optionen »-v« und »--stats« nach den übertragenen Dateien noch statistische Daten aus.

Abbildung 1: Höchst ausführlich: »rsync« gibt mit den Optionen »-v« und »–stats« nach den übertragenen Dateien noch statistische Daten aus.

Sicher ist sicher

Die Option »–delete« ist mit Vorsicht zu genießen (siehe Kasten “Rsync-Fallen”). Es bietet sich daher an, mit dem Parameter »-n« einen Testlauf durchzuführen und in der Ausgabe zu überprüfen, welche Dateien Rsync im Ernstfall löscht. Eine andere Möglichkeit zur Sicherung der Daten auf dem Zielrechner ist die Option »-b«, die Löschkandidaten nicht einfach von der Platte fegt, sondern mit einem Backup-Suffix versieht. Standardmäßig nimmt Rsync dafür die Tilde; die Option »–suffix« setzt eine andere Erweiterung:

rsync -avb --suffix=.bak --delete /home/xyz/Daten test@backup.linux-magazin.de:/var/backup/xyz/

Darüber hinaus ist es möglich, die zu löschenden Dateien auf dem Zielrechner stattdessen in ein eigenes Verzeichnis zu sichern. Die Option »–backup-dir« akzeptiert wahlweise entweder einen Ordner relativ zum Homeverzeichnis (»–backup-dir=alt/« schreibt die Sicherungskopien nach »~/alt« auf dem Zielrechner) oder eine absolute Pfadangabe.

Muss sich Rsync oft um den Abgleich zweier Maschinen kümmern, die beide veränderte Dateien enthalten, schützt die Option »-u« (update) vor Datenverlust. Sie verhindert, dass Rsync Dateien überschreibt, die auf dem Zielsystem einen neueren Zeitstempel haben als auf der Quelle. Dieser Mechanismus funktioniert nur korrekt, wenn beide Rechner mit derselben Systemzeit arbeiten, indem sie sich beispielsweise die Zeit von einem NTP-Server (Network Time Protocol) holen.

Rsync tunen

Mehrere Optionen beschleunigen Rsync. So ist es beispielsweise möglich, Daten mit dem Parameter »-z« komprimiert auf die Reise zu schicken – ideal für langsame Verbindungen. Anders motiviert ist die Option »–bwlimit« (bandwidth limit). Hinter dem Parameter folgen ein Gleichheitszeichen und eine Angabe in Kilobit pro Sekunde, zum Beispiel:

rsync -avz --bwlimit=30 /home/xyz/Daten test@backup.linux-magazin.de:/var/backup/xyz/

Damit beschränkt Rsync freiwillig die von ihm genutzte Bandbreite, worüber sich alle übrigen Prozesse freuen, die dieselbe Datenleitung nutzen.

Rsync in Skripten

Die bisher gezeigten Rsync-Aufrufe erfordern zur Authentifizierung jeweils die Eingabe des Benutzerpassworts, sind also interaktiv. Vollautomatische Backups mit Rsync-Aufrufen in Skripten sind aber auch möglich. Dazu ist es nur erforderlich, ein SSH-Schlüsselpaar zu erstellen und dem Zielrechner den öffentlichen Key zu übermitteln. Beim Erzeugen des Schlüsselpaars (»ssh-keygen -t dsa«) gibt der Anwender nur eine leere Passphrase ein, danach funktioniert die Anmeldung auf entfernten Rechnern ohne Kennwortabfrage.

Den öffentlichen Schlüssel (»~/.ssh/id_dsa.pub«) trägt der Anwender dazu auf dem entfernten Rechner in die Datei »~/.ssh/authorized_keys« ein. Sie bietet Platz für mehrere solcher Schlüssel, daher ist beim Kopieren des neuen Key darauf zu achten, keine bereits vorhandenen Einträge zu überschreiben. Praktischerweise liefert das OpenSSH-Paket das Tool »ssh-copy-id« mit, das einen Hostnamen als Argument erwartet und den Inhalt der öffentlichen Schlüsseldatei an die Datei »~/.ssh/authorized _keys« auf dem entfernten Rechner anhängt:

$ ssh-copy-id -i ~/.ssh/id_dsa.pub remote.host
32
user@remote.host's password:

Um das Sicherheitsrisiko, das sich aus dem passwortlosen SSH-Schlüssel ergibt, einzuschränken, ist es möglich, für bestimmte Keys nur einzelne Kommandos zu erlauben. Dazu bearbeitet der Anwender auf dem Zielrechner die Datei »~/.ssh/authorized_keys« mit einem Texteditor und ergänzt vor dem gewünschten Schlüssel (»ssh-dss …«) einen Befehlseintrag in der Form »command=”rsync Optionen”«. Dabei ist es wichtig, das erlaubte Kommando und den Schlüssel in eine Zeile ohne Umbruch zu schreiben.

Teilabschnitte

Rsync eignet sich hervorragend dazu, große Datenmengen aktuell zu halten. Liegt auf der eigenen Platte beispielsweise das ISO-Image eines Release-Kandidaten für eine Linux-Distribution und ist diese nun erschienen, kann es den Download beschleunigen, »rsync« zum Aktualisieren der Imagedatei heranzuziehen statt das neue Image herunterzuladen, da sich vielleicht nur wenig verändert hat.

Das folgende Beispiel zeigt, wie Rsync ein lokales Debian-ISO-Image auf die Final-Version aktualisiert:

rsync -avz --progress rsync://cdimage.debian.org/debian-cd/4.0_r0/i386/iso-dvd/debian-40r0-i386-DVD-1.iso debian-testing-i386-DVD-1.iso

Bricht ein Transfer ab, löscht Rsync standardmäßig die schon übertragenen Teilstücke einer Datei. Die Option »–partial« verhindert dies und sorgt dafür, dass Rsync bei der Wiederaufnahme der Datenübertragung genau dort ansetzen und weitermachen kann.

Auf dem Zielrechner speichert Rsync die partielle Datei zunächst unter einem versteckten Dateinamen mit einer willkürlich gewählten Dateiendung (das gilt auch für Dowloads ohne »–partial«; siehe Listing 3). Nach beendetem Transfer (oder auch bei einem Übertragungsabbruch) gibt Rsync der Datei ihren ursprünglichen Namen zurück (siehe auch Kasten “Rsync-Fallen”).

Download vom
Rsync-Server

01 $ # (in einem Terminal-Fenster den Download mit Rsync starten ...)
02 $ rsync -avz --partial --progress rsync://cdimage.debian.org/debian-cd/4.0_r0/i386/iso-dvd/debian-40r0-i386-DVD-1.iso .
03 MOTD: Welcome to the rsync archive at Academic Computer Club, Umeå University.
04 receiving file list ...
05 1 file to consider
06 debian-40r0-i386-DVD-1.iso
07      1277952   0%  254.27kB/s    5:07:52
08 
09 $ # (... und im anderen sehen, dass Rsync versteckte temporäre Dateien erzeugt)
10 $ ls -la
11 -rw------- 1 huhn huhn 3145728 2007-06-11 21:57 .debian-40r0-i386-DVD-1.iso.0lt27l

Rsync-Fallen

Einige Rsync-Optionen sind unter Umständen dazu geeignet, großes Unheil hervorzurufen, wenn man sie unvorsichtig einsetzt. Wer die folgenden Standardfehler kennt, vermeidet Probleme.

  • Der Klassiker: Die Option »–delete« ist mit
    Vorsicht zu genießen. Wer beispielsweise in einem
    Rsync-Aufruf versehentlich Quelle und Ziel vertauscht, löscht
    mit »–delete« zahlreiche Originaldateien. Um auf der
    sicheren Seite zu sein, empfiehlt sich ein Testlauf mit
    »-n«.
  • Der abschließende Schrägstrich für
    Verzeichnisse sorgt ebenfalls oft für Verwirrung: Lautet der
    Aufruf zum Beispiel »rsync Optionen /home/xyz/Daten
    backup.linux-magazin.de:/var/backup/xyz/«,
    überträgt Rsync das Verzeichnis »Daten« zum
    Ziel, legt also »/var/backup/xyz/Daten« an. Steht im
    Aufruf hingegen »/home/xyz/Daten/«, sorgt der
    Schrägstrich dafür, dass nur der Inhalt von
    »Daten« übertragen wird. Eine Datei
    »~xyz/Daten/test.txt« wandert also gleich ins
    Zielverzeichnis und wird zu »/var/backup/xyz/test.txt«
    statt »…/xyz/Daten/test.txt«.
  • Abbruch der Datenübertragung bei Verwendung von
    »–partial«: Dass Rsync die bereits übertragenen
    Teilstücke unter dem Namen der Datei speichert, ist nicht
    immer vorteilhaft. Wenn der Anwender Rsync einsetzt, um eine
    bereits vorhandene größere Datei (beispielsweise ein
    ISO-Image) zu aktualisieren, und der Transfer abbricht,
    überschreibt Rsync das Original mit dem gerade
    übertragenen (kleineren) Teil. Um den Verlust des Originals zu
    verhindern, kann er vor dem Rsync-Aufruf einen Hardlink
    anlegen.
  • Andere Server nicht überlasten: Es ist keine gute Idee,
    zwei Rsync-Instanzen auf dasselbe Verzeichnis loszulassen, da dies
    den Load deutlich in die Höhe treiben kann. Startet ein
    Anwender Rsync beispielsweise via Cronjob, um regelmäßig
    einen Mirror zu aktualisieren, sollte er eine doppelte
    Skriptausführung über einen Locking-Mechanismus
    verhindern.

Rsync-Daemon

Rsync gibt es auch als Server: Dazu startet der Systemadministrator den Daemon »rsyncd«, der wahlweise als selbstständiger Server läuft oder über passende Konfiguration von »inetd« beziehungsweise »xinetd« erst bei Kontaktaufnahme startet. Den Standard-Port 873 legt der Rsync-Eintrag in der Datei »/etc/services« fest. Um einen eigenständigen Rsync-Daemon zu aktivieren, ist nur eine Verlinkung des Startskripts aus »/etc/init.d/« in die richtigen Runlevel nötig, dann aktiviert das System »rsyncd« bei jedem Systemstart.

Auf Debian-Systemen ist es zusätzlich nötig, die Datei »/etc/default/rsync« anzupassen, damit das Startskript seine Arbeit aufnehmen kann. In »/etc/default/rsync« muss mindestens der Eintrag »RSYNC_ENABLE=true« stehen. Rechner, auf denen noch der alte »inetd« läuft, überredet der Admin mit dem folgenden Eintrag in der Datei »/etc/inetd.conf« dazu, den Rsync-Daemon bei Bedarf zu aktivieren:

rsync  stream  tcp  nowait  root /usr/bin/rsync rsyncd --daemon

Für den moderneren »xinetd« leistet eine neue Datei »rsync« im Verzeichnis »/etc/xinetd.d/« das Gleiche (Listing 1). In beiden Fällen ist es auch möglich, statt »/usr/bin/rsync« den Daemon-Namen »/usr/sbin/rsyncd« anzugeben – beide Namen zeigen auf denselben Inode. Ein Vorteil des »xinetd« ist, dass er erlaubt, die Anzahl der Verbindungen pro IP-Adresse zu begrenzen – im Beispiel ist nur eine Verbindung pro IP-Adresse (»per_source = 1«) zulässig.

Listing 1:
»/etc/xinetd.d/rsync«

01 service rsync
02 {
03      socket_type  = stream
04      protocol     = tcp
05      wait         = no
06      user         = root
07      instances    = 50
08      per_source   = 1
09      server       = /usr/bin/nice
10      server_args  = /usr/bin/rsync --daemon
11 }

Unabhängig von der Startmethode liest der Rsync-Daemon die zentrale Konfigurationsdatei »/etc/rsyncd.conf«. Listing 2 zeigt im Abschnitt »[ftp]« ein Beispiel für Anonymous-Zugriff. Das Schlüsselwort »motd file« (message of the day) definiert die Begrüßungsmeldung des Servers, »uid« und »gid« legen User- und Gruppen-ID fest, mit denen der Daemon nach dem Verbindungsaufbau einen Kindprozess startet. Für Anonymous-Zugänge stehen hier oft »nobody« und »nogroup«. Die »max connections« legen fest, wie viele Clients sich insgesamt am Server anmelden dürfen.

Listing 2:
»/etc/rsyncd.conf«

01 # GLOBAL OPTIONS
02 
03 motd file = /etc/motd.rsync
04 uid = nobody
05 gid = nogroup
06 max connections = 50
07 socket options = SO_KEEPALIVE
08 timeout = 1200
09 log file = /var/log/rsyncd.log
10 transfer logging = true
11 
12 # MODULE OPTIONS
13 
14 [ftp]
15         comment = public archive
16         path = /var/www/pub
17         use chroot = yes
18         max connections=10
19 
20 [debian-amd64]
21         comment = Debian Etch for AMD64
22         path = /home/ftp/pub/debian-amd64
23 
24 [privater_Bereich]
25         comment = Meine eigenen Daten
26         path = /home/huhn
27         secrets file = /etc/rsyncd.huhn.secrets
28         auth users = huhn
29         uid = huhn

Um den Zugriff zu beschränken, bietet es sich an, Rsyncd über »xinetd« zu starten und dort die Anzahl der Verbindungen pro IP-Adresse einzuschränken; alternativ ist es möglich, die Zahl der maximalen Connects global oder für einzelne Freigaben zu beschneiden (Listing 2).

Zugangskontrolle

Rsyncd erlaubt es dem Administrator auch, gezielt IP-Adressen oder ganze Bereiche in »/etc/rsyncd.conf« auszuklammern. Das geht mit dem Schlüsselwort »hosts deny«, hinter dem ein Gleichheitszeichen und dann eine Liste von IP-Adressen oder Hostnamen (durch Leerzeichen getrennt) folgen, zum Beispiel:

hosts deny = *.example.com 192.168.1.30 202.181.238.133/24

Listing 2 zeigt nicht nur einen Anonymous-Zugang, sondern auch die Freigabe »[privater_Bereich]«, die durch ein Passwort geschützt ist und lediglich der Benutzerin »huhn« den Zutritt erlaubt. Im »secrets file« stehen der Benutzername und hinter dem Doppelpunkt das Kennwort im Klartext, etwa »huhn:sommer2007«. Da die Daten unverschlüsselt sind, ist es wichtig, diese Passwortdatei mit »chmod 600 /etc/rsyncd.huhn.secrets« zu verstecken – Rsync beschwert sich aussagekräftig im Logfile, wenn die Zugriffsrechte nicht passen (Listing 4).

Möchte ein Benutzer auf sein Homeverzeichnis zugreifen (das in der Regel nicht für alle lesbar ist), funktioniert das nur über passendes Setzen der »uid«. Die Benutzernamen im »secrets file« haben übrigens nichts mit den Systembenutzern aus »/etc/passwd« zu tun. Abbildung 2 zeigt, was ein Benutzer bei einem Passwortfehler zu sehen bekommt.

Listing 3:
Logfile-Auszüge

01 2007/06/11 13:32:46 [6668] rsyncd version 2.6.9 starting, listening on port 873
02 2007/06/11 13:32:55 [6681] connect from asteroid.huhnix.org (192.168.2.15)
03 2007/06/11 13:33:00 [6681] secrets file must not be other-accessible (see strict modes option)
04 2007/06/11 13:33:00 [6681] continuing without secrets file
05 2007/06/11 13:33:00 [6681] auth failed on module privater_Bereich from asteroid.huhnix.org (192.168.2.15): missing secret for user "huhn"
Abbildung 2: Zugriff verwehrt: Wer das Passwort nicht kennt, erhält keinen Zugang zu Freigaben eines Rsync-Servers, die der Administrator mit einem »auth users«-Block geschützt hat.

Abbildung 2: Zugriff verwehrt: Wer das Passwort nicht kennt, erhält keinen Zugang zu Freigaben eines Rsync-Servers, die der Administrator mit einem »auth users«-Block geschützt hat.

Backup mit Geschichte: Rsnapshot

Mit Rsync als Backup-Programm gibt es im Archiv immer genau eine Version – die letzte Sicherung. Dateien, die Anwender vor einem Rsync-Lauf löschen, verschwinden auch aus dem Backup. Das Tool Rsnapshot [2] schützt Daten etwas länger, indem es verschiedene Versionen der Verzeichnissammlung speichert. Damit kann der Admin auch auf den Hilferuf “Ich habe vorgestern eine Datei gelöscht” souverän reagieren.

Er konfiguriert Rsnapshot über die Datei »/etc/rsnapshot.conf«, die unter anderem Informationen über die zu sichernden Verzeichnissen enthält. Gewöhnlich legt das Tool alle Backups im Verzeichnis »/.snapshots/« ab. Für regelmäßige Backups sorgen dann zwei Einträge in der Crontab, die »rsnapshot« mit dem Argument »hourly« oder »daily« aufrufen. Mit der Zeit entstehen so verschiedene Unterverzeichnisse »daily.0«, »daily.1« … sowie »hourly.0«, »hourly.1« …, die jeweils vollständige Backups enthalten. Unveränderte Dateien speichert Rsnapshot aber nicht redundant, sondern spart über Hardlinks Speicherplatz: Nur geänderte Dateien liegen dann in verschiedenen Versionen vor.

Fazit

Rsync ist für alle Synchronisierungsaufgaben gut geeignet, die Dateien nur in einer Richtung aktualisieren; als Daemon kann es einen FTP-Server ersetzen. Für komplexere Szenarien, bei denen sich Dateien auf zwei Rechnern parallel verändern, ist aber ein Tool wie Unison besser geeignet.

Infos

[1] Rsync: [http://samba.anu.edu.au/rsync/]

[2] Rsnapshot: [http://www.rsnapshot.org/]

[3] Unison: [http://www.cis.upenn.edu/~bcpierce/unison]

[4] Heike Jurzik, “Synchroner Datenstrom”: LinuxUser 04/06, S. 90 oder [http://www.linux-user.de/ausgabe/2006/04/090-rsync/]

[5] Peer Heinlein, “Unwetterzentrale – Snapshot-Backups mit Rsync”: Linux-Magazin 09/04, S. 72 oder [https://www.linux-magazin.de/heft_abo/ausgaben/2004/09/unwetterzentrale]

[6] Daniel Rohark, “Datentandem – Daten synchronisieren mit Unison”: LinuxUser 02/04, S. 60 oder [http://www.linux-user.de/ausgabe/2004/02/060-unison/]

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben