Datensynchronisation mit rsync

rsync ist ein vielseitiges Tool, das den Dateitransfer über Netzwerkverbindungen vereinfacht und die Synchronisierung lokaler Verzeichnisse beschleunigt. Die hohe Flexibilität macht das Synchronisierungstool zu einer ausgezeichneten Option für eine Vielzahl von Operationen auf Dateiebene.

Was ist rsync?

rsync, abgekürzt für „remote synchronization“, ist ein flexibles sowie netzwerkfähiges Synchronisierungstool unter Linux. Mit dem Open-Source-Programm können Dateien und Verzeichnisse zwischen lokalen Systemen oder über Netzwerke hinweg synchronisiert werden. Dazu nutzt das Tool eine differenzielle Datenübertragungstechnik, bei der nur die tatsächlich geänderten Abschnitte von Daten übertragen werden. Dadurch wird der Datenaustausch minimiert und der Synchronisationsprozess erheblich beschleunigt. Dank einer Vielzahl von Optionen erlaubt rsync eine genaue Steuerung des Synchronisationsverhaltens. Die flexible Syntax ermöglicht dabei sowohl einfache lokale Kopien als auch komplexe Netzwerksynchronisationen.

Die Syntax von rsync

Die Befehlssyntax von rsync ist einfach aufgebaut und ähnelt der von SSH, SCP und CP. Der grundlegende Aufbau sieht wie folgt aus:

rsync [OPTION] source destination
bash

Bei source wird der Quellpfad eingetragen, aus dem die Daten synchronisiert werden sollen, während als destination der Zielpfad angegeben wird. Dazu bietet rsync eine Vielzahl von Optionen, mit denen der Synchronisationsprozess an die jeweiligen Anforderungen angepasst werden kann. Zu den am häufigsten verwendeten Optionen gehören:

  • -a (Archive): Behält rekursiv Dateiberechtigungen, Zeitstempel, Gruppen, Besitzer und spezielle Dateieigenschaften bei.
  • -v (Verbose): Zeigt detaillierte Informationen über den Synchronisationsprozess an.
  • -r (Recursive): Synchronisiert Verzeichnisse und deren Inhalte rekursiv.
  • -u (Update): Überträgt nur Dateien, die neuer sind als die bereits vorhandenen im Zielverzeichnis.
  • -z (Compress): Reduziert den Datenverkehr über das Netzwerk.
  • -n –itemize-changes: Zeigt eine Liste der Änderungen an, die vorgenommen werden sollen.
  • --delete: Löscht Dateien im Zielverzeichnis, die in der Quelle nicht mehr existieren.
  • --exclude: Schließt bestimmte Dateien oder Verzeichnisse von der Synchronisation aus.
  • --dry-run: Simuliert den Synchronisationsprozess, ohne tatsächlich Dateien zu übertragen.
  • --progress: Zeigt den Fortschritt der Dateiübertragung an.
  • --partial: Dateien, die teilweise übertragen wurden, verbleiben im Zielverzeichnis, wenn die Übertragung unterbrochen wird. Bei einer erneuten Übertragung wird die Datei von ihrem letzten Zustand fortgesetzt.

rsync-Syntax: Beispiel

Die rsync-Syntax lässt sich leicht an einem praktischen Beispiel nachvollziehen. Mit dem folgenden Befehl wird das Verzeichnis dir1 inklusive 100 leerer Testdateien und ein zweites, leeres Verzeichnis dir2 erstellt:

$ cd ~
$ mkdir dir1
$ mkdir dir2
$ touch dir1/file{1..100}
bash

Der Inhalt von dir1 lässt auf demselben System mit dir2 mit der Option -r synchronisieren:

$ rsync -r dir1/ dir2
bash

Alternativ kann dazu die Option -a verwendet werden, die rekursiv synchronisiert und symbolische Links, spezielle Gerätedateien, Modifizierungszeiten, Gruppen, Eigentümer und Berechtigungen enthält:

$ rsync -a dir1/ dir2
bash

Hinweis: Der Schrägstrich (/) am Ende des Quellverzeichnisses in einem rsync-Befehl ist wichtig, da er angibt, dass der Inhalt des Verzeichnisses synchronisiert werden soll, nicht das Verzeichnis selbst.

$ rsync -a dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
bash

Ohne den abschließenden Schrägstrich am Quellverzeichnis wird der Inhalt des Verzeichnisses „Quellverzeichnis“ in das „Zielverzeichnis“ kopiert:

$ rsync -a dir1/ dir2
Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .
bash

In der Praxis ist es daher sinnvoll, den Schrägstrich am Ende des Quellverzeichnisses zu verwenden, um sicherzustellen, dass der Synchronisationsprozess wie erwartet abläuft und der Inhalt des Quellverzeichnisses korrekt im Zielverzeichnis landet.

rsync: Synchronisation mit einem Remote-System

Die Synchronisation eines Remote-Systems mit rsync ist im Allgemeinen nicht schwer, Voraussetzung dafür ist, dass Sie SSH-Zugriff auf den Remote-Rechner haben und die notwendigen Authentifizierungsinformationen kennen. rsync verwendet häufig SSH (Secure Shell) für die sichere Kommunikation mit Remote-Systemen. Zudem muss das Tool auf beiden Seiten installiert sein.

Ist der SSH-Zugriff zwischen beiden Rechnern verifiziert, kann der Ordner dir1 auf einem Remote-Computer synchronisiert werden. In diesem Fall soll das eigentliche Verzeichnis übertragen werden, daher fällt der nachgestellte Schrägstrich im folgenden Befehl weg:

$ rsync -a ~/dir1 username@remote_host:destination_directory
bash

Wird ein Verzeichnis von einem lokalen System auf ein Remote-System verschoben, wird dies als „push“-Operation bezeichnet. Im Gegensatz dazu sprich man von einer „pull“-Operation, wenn ein Remote-Verzeichnis mit einem lokalen System synchronisiert wird. Die Syntax dazu sieht wie folgt aus:

$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
bash

vServer (VPS) von IONOS

Günstige und starke VPS für Webserver, Mailserver und eigene Anwendungen mit persönlichem Berater und 24/7 Support!

100 % SSD-Speicher
Bereit in 55 Sek.
SSL Zertifikat

Verwendung weiterer Optionen in rsync

Mit den bereits weiter oben vorgestellten Optionen lässt sich das Standardverhalten von rsync weiter anpassen.

Übertragung nicht komprimierter Dateien mit rsync

Die Netzwerkbelastung bei der Übertragung von nicht komprimierten Dateien lässt sich mit der Option -z wie folgt reduzieren:

$ rsync -az source destination
bash

Fortschritt anzeigen und unterbrochene Übertragungen wiederaufnehmen

Mit -P lassen sich die Optionen --progress und --partial miteinander kombinieren. Damit erhalten Sie eine Übersicht über den Fortschritt der Übertragungen und können gleichzeitig unterbrochene Übertragungen wiederaufnehmen:

$ rsync -azP source destination
Output
sending incremental file list
./
file1
    0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
    0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file100
    0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101)
file11
    0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101)
. . .
bash

Führen Sie den Befehl erneut aus, um eine kürzere Ausgabe zu erhalten. Dadurch lässt sich mit rsync anhand von Änderungszeiten ermitteln, ob Änderungen vorgenommen wurden.

$ rsync -azP source destination
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
bash

Verzeichnisse mit rsync synchron halten

Um sicherzustellen, dass zwei Verzeichnisse tatsächlich synchron gehalten werden, ist es erforderlich, im Zielverzeichnis Dateien zu löschen, die aus der Quelle entfernt wurden. Standardmäßig entfernt rsync jedoch keine Dateien aus dem Zielverzeichnis. Dieses Verhalten kann mit der Option --delete modifiziert werden. Allerdings ist es ratsam, diese Option mit Vorsicht zu verwenden, da diese Dateien im Zielverzeichnis löscht, die in der Quelle nicht mehr vorhanden sind.

Bevor Sie die Option anwenden, sollten Sie die Option --dry-run verwenden. Diese ermöglicht es Ihnen, eine Simulation des Synchronisationsprozesses durchzuführen, ohne tatsächliche Dateien zu löschen. So können Sie sicherstellen, dass nur die gewünschten Änderungen vorgenommen werden, ohne versehentlich wichtige Daten zu verlieren:

$ rsync -a --delete source destination
bash

Dateien und Verzeichnisse von der Synchronisation mit rsync ausschließen

In rsync können Sie mit der Option --exclude bestimmte Dateien und Verzeichnisse von der Synchronisation ausschließen. Dies ist nützlich, wenn z. B. temporäre Dateien, Logdateien oder andere Inhalte nicht synchronisiert werden sollen.

$ rsync -a --exclude=pattern_to_exclude source destination
bash

Haben Sie ein Muster zum Ausschließen von Dateien angegeben, können Sie diesen Ausschluss für Dateien, die einem anderen Muster entsprechen, mit der Option --include= überschreiben.

$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
bash

Backups mit rsync speichern

Die Option --backup bietet Ihnen die Möglichkeit, Backups von wichtigen Dateien zu speichern. Sie wird in Verbindung mit der Option --backup-dir verwendet. Diese gibt das Verzeichnis an, in dem die Backup-Dateien gespeichert werden sollen:

$ rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
bash

Einen genauen Überblick über die verschiedenen Backup-Szenarien erhalten Sie in unserem weiterführenden Artikel Server-Backups mit rsync.