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.