Rysnc-Leitfaden und 11 Beispiele für eine effektive Nutzung

Einführung in Rsync: Ein leistungsstarkes Tool zur Dateisynchronisierung

Rsync ist ein vielseitiges und kostenloses Kommandozeilenwerkzeug, das die Synchronisation von Dateien und Verzeichnissen sowohl lokal als auch über das Netzwerk ermöglicht. Es bietet eine effiziente Methode zur Übertragung von Daten zwischen verschiedenen Speicherorten.

Durch seine Vielseitigkeit ist Rsync besonders nützlich für Datenmigrationen, die Erstellung von Backups und die Spiegelung von Daten. Webmaster und Systemadministratoren profitieren insbesondere bei wiederkehrenden Aufgaben der Datenübertragung von Rsync.

Dieser Artikel führt Sie in die Funktionsweise von Rsync ein und illustriert diese anhand von praktischen Beispielen.

Die Funktionsweise von Rsync im Detail

Rsync ist ein Befehlszeilenprogramm, das primär für Unix-ähnliche Betriebssysteme entwickelt wurde. Es ermöglicht eine nahtlose Synchronisierung von Dateien zwischen verschiedenen Rechnern oder Hosts.

Das Herzstück von Rsync ist der Delta-Transfer-Algorithmus. Dieser Algorithmus ermöglicht es, nur die Unterschiede zwischen den Dateien zu übertragen, anstatt die gesamte Datei erneut zu kopieren. Die beteiligten Quellen und Ziele können sowohl lokal als auch entfernt sein. Rsync kann Datenübertragungen auf zwei Arten durchführen:

  • Übertragung und Synchronisation via SSH oder RSH.
  • Verwendung des TCP-Rsync-Daemons für die Synchronisation.

Ursprünglich für Unix-Systeme entwickelt, läuft Rsync problemlos auch unter Linux.

Der Synchronisationsprozess erfolgt in folgenden Schritten:

  • Rsync stellt über SSH eine Verbindung zum Remote-Host her und fordert gegebenenfalls ein Passwort an.
  • Nach erfolgreicher Verbindung kommuniziert der Rsync-Prozess des Remote-Hosts mit der Quelle.
  • Diese beiden Instanzen bestimmen, welche Dateien und Verzeichnisse synchronisiert werden müssen, wobei der Delta-Übertragungsalgorithmus die Unterschiede zwischen den Dateien identifiziert.

Wenn eine Datei auf dem Remote-System existiert, aber nicht auf dem Host-System, wird diese auf das Host-System kopiert. Bei bereits existierenden Dateien wird lediglich der Unterschied (die geänderten Teile) übertragen. Dateien, die auf beiden Systemen identisch sind, werden nicht verändert.

Rsync speichert die identifizierten Unterschiede in einer temporären Datei, bevor diese ins Zielverzeichnis verschoben werden, was die Aktualisierungen inkrementell gestaltet.

Vorbereitungen:

  • Sie benötigen Root- oder Sudo-Rechte.
  • Zugriff auf das Terminal/die Kommandozeile ist erforderlich.
  • SSH-Zugriff ist für sichere Rsync-Befehle notwendig.
  • Zwei Maschinen werden für die Demonstration von Rsync benötigt.

Für dieses Tutorial verwenden wir Linux Mint 21.1 Vera, jedoch können die Anweisungen problemlos auf andere Linux-Distributionen übertragen werden.

Rsync vs. SCP: Ein Vergleich

Secure Copy (SCP) ist ein weiteres beliebtes Kommandozeilenprotokoll zum Kopieren von Dateien. Es verwendet einen linearen Ansatz, bei dem Dateien direkt von der Quelle zum Ziel kopiert werden. Auch SCP verwendet SSH für eine sichere Datenübertragung.

Die Syntax für SCP-Befehle ist wie folgt:

scp option SOURCE DESTINATION

Doch warum sollte man Rsync gegenüber SCP bevorzugen?

Rsync bietet gegenüber SCP signifikante Vorteile:

  • Höhere Geschwindigkeit: Rsync ist schneller als SCP, da es ein Remote-Update-Protokoll nutzt, das nur die Änderungen und nicht die vollständigen Dateien überträgt. Bei regelmäßigen Synchronisationen wird nach dem ersten vollständigen Kopieren nur noch die Differenz übertragen.
  • Geringerer Bandbreitenverbrauch: Da nicht die gesamten Dateien neu kopiert werden müssen, sinkt der Bandbreitenverbrauch. Zusätzlich verwendet Rsync Kompressions- und Dekompressionsalgorithmen, um die Dateigröße während der Übertragung weiter zu reduzieren.
  • Mehr Befehlszeilenoptionen: Rsync bietet eine größere Anzahl von Befehlszeilenoptionen als SCP, was eine präzisere Steuerung und Konfiguration ermöglicht.

Zusammenfassend lässt sich sagen, dass Rsync ein ausgezeichnetes Tool für inkrementelle Synchronisationen ist, während SCP nützlich für einmalige, einfache Dateiübertragungen ist. In der Praxis ist SCP für alltägliche Aufgaben geeignet, bei wiederkehrenden Datenübertragungen ist jedoch Rsync die bessere Wahl.

Die Rsync Befehlssyntax

Die allgemeine Syntax des Rsync-Befehls lautet wie folgt:

rsync OPTION QUELLE ZIEL

Die einzelnen Komponenten bedeuten:

  • OPTION – Die verschiedenen Optionen des Rsync-Befehls.
  • QUELLE – Das Quellverzeichnis.
  • ZIEL – Das Zielverzeichnis.
  • USER – Der Benutzername des Remote-Systems.
  • HOST – Der Hostname oder die IP-Adresse des Remote-Systems.

Die Optionen sind Parameter, die den Befehl um zusätzliche Funktionen erweitern. Beispielsweise ermöglicht die Option „-r“ eine rekursive Synchronisation der Daten. Die Option „-r“ überträgt jedoch nicht die Besitzverhältnisse von Gruppen und Benutzern, Zeitstempel, Berechtigungen oder symbolische Links. Stattdessen kann die Option „-a“ verwendet werden, die im Archivmodus arbeitet und dafür sorgt, dass alle Eigentumsrechte, Berechtigungen und symbolischen Links während des Kopiervorgangs erhalten bleiben.

Weitere wichtige Rsync-Optionen:

  • -z: Daten komprimieren, um Speicherplatz zu sparen.
  • -h: Ausgabe in einem menschenlesbaren Format.
  • -b: Erstellt während der Datensynchronisation ein Backup.
  • -e: Verwendet das SSH-Protokoll für Remote-Datenübertragungen.
  • –progress: Zeigt den Fortschritt der Datensynchronisation an.
  • -v: Gibt eine ausführliche Ausgabe des Befehls an.
  • –n: Führt einen Testlauf durch, um Einstellungen und Konfigurationen vor der eigentlichen Datensynchronisation zu prüfen.
  • -q: Unterdrückt Ausgaben und Optionen des Rsync-Befehls.

Installation von Rsync

Rsync ist auf den meisten Unix- und Linux-Systemen bereits vorinstalliert. Sollte dies nicht der Fall sein, kann es einfach über die Paketverwaltung installiert werden.

Für Debian/Ubuntu und Mint:

sudo apt-get install rsync

Für Arch-Linux:

pacman -S rsync

Auf Gentoo:

emerge sys-apps/rsync

Für CentOS/Fedora/REHL:

sudo yum install rsync

Auf openSUSE:

sudo zypper install rsync

Da wir Linux Mint verwenden, war Rsync bereits vorinstalliert. Sie können überprüfen, ob es installiert ist, indem Sie einfach ‚rsync‘ im Terminal ausführen. Es werden dann die Funktionen, Optionen und andere wichtige Informationen angezeigt.

$ rsync
rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Lassen Sie uns nun einige praktische Anwendungsfälle von Rsync betrachten.

Für die folgenden Übungen werden wir zwei Verzeichnisse erstellen:

  • Ein Quellverzeichnis
  • Ein Zielverzeichnis

Verwenden Sie dazu folgende Befehle:

mkdir source-directory
mkdir dest-directory

Um das Verhalten von Rsync zu demonstrieren, erstellen wir einige Testdateien im Quellverzeichnis. Dies wird mit dem folgenden Befehl realisiert:

touch source-directory/file{1..100}

Dieser Befehl erzeugt 100 leere Dateien im Quellverzeichnis. Die erstellten Dateien können mit dem Befehl `ls source-directory` angezeigt werden.

$ ls
dest-directory  source-directory

$ touch source-directory/file{1..100}

$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Das Zielverzeichnis ist zu Beginn leer.

Lokales rekursives Kopieren von Verzeichnissen

Rsync kann nicht nur Dateien zwischen einem lokalen und einem entfernten Server kopieren, sondern ist auch sehr nützlich für lokale Kopiervorgänge.

In diesem Fall verwenden wir folgende Rsync-Syntax:

rsync-Option QUELLE ZIEL

Um alle Dateien aus dem Quellverzeichnis ins Zielverzeichnis zu kopieren, führen Sie folgenden Befehl aus:

rsync -r source-directory/ dest-directory

Dieser Befehl kopiert rekursiv alle Dateien und Unterverzeichnisse aus dem Quellverzeichnis ins Zielverzeichnis.

$ ls
dest-directory  source-directory

$ ls dest-directory


$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

$ rsync -r source-directory/ dest-directory

$ ls dest-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

So werden alle Dateien aus dem Quellverzeichnis in das Zielverzeichnis kopiert.

Lokales Kopieren einer Einzeldatei

Nachdem wir gelernt haben, wie man zwei Verzeichnisse synchronisiert, betrachten wir nun das Kopieren einer einzelnen Datei.

Wir bearbeiten die Datei `file1` im Quellverzeichnis und synchronisieren sie dann mit der gleichen Datei im Zielverzeichnis.

Zum Bearbeiten der Datei verwenden wir folgenden Befehl:

nano source-directory/file1

Fügen Sie nun den folgenden Text in den Nano-Editor ein:

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.

Speichern und schließen Sie die Datei.

Lassen Sie uns nun die Datei mit Rsync kopieren:

sudo rsync -v --existing source-directory/file1 dest-directory
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80
$ 

Wie Sie sehen können, haben wir die Option `–existing` verwendet. Diese aktualisiert die vorhandenen Dateien. Ohne diese Option würde der Befehl zwar erfolgreich ausgeführt, die Datei jedoch nicht aktualisiert werden.

Wenn die zu kopierende Datei noch nicht im Zielverzeichnis existiert, nutzen Sie folgenden Befehl:

rsync -v source-directory/newfile dest-directory
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

Kopieren von Mehreren Dateien

Um mehrere Dateien zu kopieren, müssen Sie die Pfade aller Quelldateien angeben, gefolgt vom Zielverzeichnis.

Dazu erstellen wir zwei neue Dateien, `newfile2` und `newfile3`, im Quellverzeichnis:

touch source-directory/newfile{2..3}

Um nun diese Dateien zu synchronisieren, verwenden Sie folgenden Befehl:

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00
$ 

Kopieren einer Datei oder eines Verzeichnisses von lokal nach remote

Die Rsync-Syntax zur Übertragung von Daten von einem lokalen zu einem Remote-System ist:

rsync option SOURCE [email protected]:DEST

Dazu benötigen Sie die IP-Adresse des Remote-Computers. Die IP-Adresse muss nach der Quelldatei hinzugefügt werden.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Vor Beginn der Übertragung werden Sie nach dem Passwort gefragt. Sollte der Remote-Benutzer ein anderer sein, müssen Sie diesen vor der IP-Adresse, gefolgt von @, angeben.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Um mehrere Dateien oder Verzeichnisse zu kopieren, listen Sie die Datei- oder Verzeichnispfade einfach auf:

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Spezifische Protokolle für Remote-Übertragungen

Mit Rsync können Sie bestimmte Dateiübertragungsprotokolle festlegen. Verwenden Sie dazu die Option `-e` gefolgt vom Protokollnamen.

Um beispielsweise das SSH-Protokoll zu verwenden, hängen Sie `-e ssh` an den Rsync-Befehl an:

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Kopieren einer Datei oder eines Verzeichnisses von Remote nach Lokal

Die Syntax für die Übertragung von Remote zu Lokal ist:

sync option [email protected]:SRC DEST

Dies fungiert als Pull-Request. Um Dateien von einem Remote-Server auf Ihren lokalen Rechner zu übertragen, verwenden Sie folgenden Befehl:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Dieser Befehl zieht die Dateien im Zielverzeichnis des Remote-Computers in das Quellverzeichnis des lokalen Computers.

Um eine bestimmte Datei zu ziehen, geben Sie ihren vollständigen Pfad an:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Um mehrere Dateien oder Verzeichnisse zu kopieren, listen Sie die Pfade innerhalb geschweifter Klammern auf, getrennt durch Kommas:

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

Ebenso können Sie auch einzelne Dateien angeben.

Live-Fortschritt während der Übertragung anzeigen

Es ist hilfreich, den Fortschritt der Übertragung bei größeren Datenmengen live verfolgen zu können. Hierzu verwenden Sie die Option `–progress`. Fügen Sie diese dem Rsync-Befehl hinzu, um die Übertragungsgeschwindigkeit, die Restzeit und die übertragene Datenmenge zu sehen.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Löschen von Quelldateien nach der Übertragung

Verwenden Sie die Option `–remove-source-files`, um Quelldateien nach der erfolgreichen Übertragung zu entfernen. Dies ist besonders nützlich, um Speicherplatz freizugeben oder Dateien ohne Spuren zu sichern.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Rsync-Testlauf

Mit Rsync können Sie einen Testlauf durchführen, um die Konfiguration zu prüfen, bevor Sie die eigentliche Übertragung starten. Dies verhindert unbeabsichtigte Aktualisierungen oder das Löschen von Dateien.

Verwenden Sie dazu die Option `–dry-run`:

sudo rsync -v --dry-run source-directory/file1 dest-directory
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)
$

Die Ausgabe ähnelt der einer normalen Übertragung, enthält jedoch den Hinweis `(DRY RUN)` am Ende.

Festlegen der Minimal- und Maximaldateigröße

Rsync ermöglicht es, die minimale und maximale Dateigröße für die Übertragung festzulegen.

Um Dateien mit einer Mindestgröße von 15 KB zu übertragen, verwenden Sie `–min-size=15k`:

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Dieser Befehl kopiert nur Dateien mit einer Mindestgröße von 15 KB, kleinere Dateien werden ignoriert.

Analog dazu können Sie mit `–max-size` eine maximale Dateigröße definieren:

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Hier werden Dateien über 450 KB nicht kopiert.

Bandbreitenlimit festlegen

Wenn Sie bandbreitenintensive Aufgaben durchführen, können Sie mit Rsync die Bandbreite begrenzen. Verwenden Sie dazu `–bwlimit=KB/s`:

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

In diesem Beispiel wird die Bandbreite auf 100 KB/s begrenzt.

Abschließende Worte

Damit endet unsere Einführung in Rsync. Wir haben die Grundlagen der Nutzung von Rsync kennengelernt und viele Befehle praktisch ausprobiert.

Rsync bietet noch viele weitere Funktionen, die in diesem Artikel nicht behandelt wurden. Es lohnt sich, die Manpage von Rsync zu konsultieren, um alle Aspekte des Tools besser zu verstehen.

Als nächsten Schritt können Sie sich Befehlszeilen-Spickzettel für Windows, Linux und macOS ansehen.