rsync unter Windows
rsync ist ein in der Linux-Welt weitverbreitetes Tool zur Synchronisation. Kommt jedoch ein Windows-Rechner ins Spiel, stellt man schnell fest dass eine nicht-unixoide Ausgabe davon gar nicht so leicht zu finden ist. Geht das also überhaupt? Die gute Nachricht: Ja, das geht. Und zwar einfacher als gedacht, seitdem es das WSL (Windows Subsystem Linux) gibt.
von Winfried Hyronimus
tl;dr: rsync über PowerShell im WSL aktivieren.
rsync ist in der Linux-Welt wohlbekannt und seit Jahrzehnten im Einsatz. Es handelt sich dabei wie der Name bereits sagt, um ein Tool für das Synchronisieren – vorwiegend – entfernter Verzeichnisse (remote sync). rsync ist dabei gleicherweise die Bezeichnung für das zur Anwendung kommende Netzwerkprotokoll als auch für die Software selbst. Eine detaillierte Beschreibung dessen, was mit rsync möglich ist, findet sich in der Dokumentation.
Außerhalb besagter Linux-Welt trifft man rsync allerdings eher selten an: Es gibt zwar einige kompilierte Fassungen für Windows, die z. T. auch eine grafische Oberfläche bieten, etwa DeltaCopy, QtdSync oder Unison oder auch die Simulation einer Linux-Umgebung (Cygwin). Diese sind jedoch allesamt nicht optimal in ihrer Handhabung oder werden – wie im Falle QtdSync – bereits seit längerem nicht mehr weiterentwickelt. Kostenpflichtige Lösungen stellen cwRsync oder Acrosync dar, die hier jedoch nicht getestet wurden.
Mit diesem Beitrag soll die Anwendung von rsync unter Einsatz des WSL (Windows Subsystem Linux) vorgestellt werden, da diese aus meiner Sicht die einfachste, flexibelste und dabei auch anwenderfreundlichste ist.
Hinweis!
Bevor tatsächlich wichtige Daten durch rsync angefasst werden, empfehle ich ausdrücklich mit Dummy-Verzeichnissen zunächst die korrekte Funktion sicherzustellen. Ein fehlerhaft ausgeführter Befehl – der etwa verkehrt herum synchronisiert – kann Daten überschreiben oder löschen.
Voraussetzungen
Für die Einrichtung wird folgendes vorausgesetzt:
- Installierte und funktionsfähige Version des Windows Subsystem Linux. Installationsanweisungen sind hier zu finden. Die gängigen Distributionen (Debian oder Ubuntu) sind völlig ausreichend.
- Installation von rsync im WSL. Dieses bereits vorinstalliert sein, ansonsten durch den bekannten Befehl
sudo apt install rsync
. - Ausführung von Skripten in PowerShell möglich. Dies kann durch Aufrufen der PowerShell mit Administratorrechten und den Befehl Set-ExecutionPolicy Unrestricted eingestellt werden, nähere Infos hier.
Es empfiehlt sich auch, zwei Verzeichnisse anzulegen die man probeweise synchronisiert. In unserem Beispiel nennen wir die beiden Verzeichnisse DUMMY_SOURCE
– das Quellverzeichnis, befindlich auf Laufwerk D:
sowie DUMMY_DESTINATION
– das Zielverzeichnis, auf Laufwerk E:
.
Zum Testen legen wir einige Dateien – natürlich keine wichtigen – in das Verzeichnis E:\DUMMY_SOURCE
.
WSL über PowerShell aktivieren
Der Trick ist nun: Das WSL lässt sich über die sogenannte PowerShell aufrufen. Der Befehl wird dann wie üblich unter dem dort installierten Linux ausgeführt, jedoch die Ausgabe erfolgt ebenfalls über die PowerShell.
Zum Testen kann die PowerShell einfach durch Drücken der Windows-Taste und Eingabe PowerShell
oder „Ausführen“ (Windows + R) mit dem Befehl powershell
gestartet werden.
Aufruf von rsync
Wir versuchen es nun gleich mit einem rsync-Befehl der unsere beiden Verzeichnisse synchronisieren soll. Hierzu müssen wir die Windows-Laufwerke aus dem WSL ansprechen, die dort im Verzeichnis /mnt/
zu finden sind:
wsl rsync -r -v /mnt/d/DUMMY_SOURCE/ /mnt/e/DUMMY_DESTINATION
Der übergebene Parameter -r
steht für recursive, rsync berücksichtigt damit Unterverzeichnisse; der Parameter -v
steht für verbose und gibt etwas detailliertere Meldungen aus.
Achtung: Für das Quellenverzeichnis muss ein Slash angehängt werden, sonst wird der Ordner DUMMY_SOURCE
im Zielverzeichnis neu angelegt. Die Ausgabe sollte etwa so aussehen:
PS D:\DUMMY_SOURCE> wsl rsync -r -v /mnt/d/DUMMY_SOURCE/ /mnt/e/DUMMY_DESTINATION
sending incremental file list
TESTFILE1.DAT
TESTFILE2.DAT
TESTFILE3.DATsent 6,293,219 bytes received 73 bytes 12,586,584.00 bytes/sec
total size is 6,291,456 speedup is 1.00
PS D:\DUMMY_SOURCE>
Die Dateien aus dem Quellverzeichnis sollten nach erfolgreicher Ausführung im Zielverzeichnis auftauchen.
Datenträgereinbindung
Wichtig zu verstehen ist dabei, dass alle Datenträger im WSL zuerst eingebunden werden müssen. Dies sind alle Festplatten normalerweise automatisch; plant man jedoch beispielsweise ein Backup von einem USB-Stick, muss dieser gesondert eingebunden werden. Hierzu editiert man die Datei /etc/fstab
mit sudo-Rechten, und stellt den Datenträger durch Einfügen folgender Zeile dort ein:
X: /mnt/X drvfs defaults 0 0
Wobei X
für einen beliebigen Laufwerksbuchstaben unter Windows steht. Standardmäßig wird nun das Laufwerk X
auch im WSL eingebunden sobald dieses gestartet wird – vorausgesetzt, Laufwerk X
ist angeschlossen. Ändert sich jedoch der Laufwerksbuchstabe des USB-Datenträgers, muss die Konfiguration angepasst werden. Ad hoc einbinden lässt sich ein Datenträger auch mit dem Befehl mount
(nähere Informationen hier).
Umsetzung als Backup-Skript
Es empfiehlt sich für die Ausführung von Backups ein Skript anzulegen, das sich automatisch oder manuell ausführen lässt. Ein solches PowerShell-Skript lässt sich einfach als Textdatei mit Endung .ps1
anlegen. Wir nennen unser Script BACKUP.ps1
.
Ist die leere Skriptdatei angelegt, wird sie unter Windows standardmäßig mit dem Editor geöffnet. Windows 10 liefert jedoch gleich eine passende Entwicklungsumgebung mit, in der das Skript getestet werden kann: Das Power Shell Integrated Scripting Environment (ISE). Um das Skript mit dieser zu öffnen klickt man rechts und sodann „Bearbeiten“.
Wir kopieren dort unseren bekannten rsync-Befehl ein:
wsl rsync -r -v /mnt/d/DUMMY_SOURCE /mnt/e/DUMMY_DESTINATION
Das Skript lässt sich nun durch Drücken auf die Taste „Play“ speichern und ausführen. Die Ausgabe von rsync sollte im unteren Fenster erscheinen. (Will man das ISE nicht benutzen, muss das Skript über die PowerShell aufgerufen werden.) Die Dateien aus dem Quellverzeichnis sollten nun im Zielverzeichnis erscheinen.
Wir ergänzen noch zwei nützliche Parameter:
wsl rsync -r -v -t /mnt/d/DUMMY_SOURCE /mnt/e/DUMMY_DESTINATION --delete-after
Hierdurch ändert sich folgendes:
-t
steht für (modification) times, die Bearbeitungs-Zeitstempel der bewegten Dateien werden beibehalten
Der Befehl --delete-after
jedoch zeigt die größte Wirkung und sollte daher erst eingesetzt werden, wenn seine Wirkung auch sicher erwünscht ist: Hiermit werden Dateien im Zielverzeichnis gelöscht, wenn sie im Quellverzeichnis gelöscht wurden.
Aufruf über Windows-Verknüpfung
Das PowerShell-Skript kann an einem beliebigen Ort gespeichert und über eine Verknüpfung aufgerufen werden. Für diese muss als „Ziel“ die PowerShell mit dem Parameter -File
, verweisend auf unser Skript festgelegt werden. Dort muss also etwa folgendes stehen:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noexit -File "C:\Users\DummyUser\Desktop\BACKUP.ps1"
Hat man die neuere PowerShell 7 installiert, sähe das Ziel so aus:
"C:\Program Files\PowerShell\7\pwsh.exe" -noexit -File "C:\Users\DummyUser\Desktop\BACKUP.ps1"
Der Parameter -noexit
ist optional. Mit diesem bleibt das Fenster offen, sodass ein Blick auf das ermöglicht wird, was RSYNC gerade getan hat. Sind Leerzeichen in den Pfaden, müssen diese in Anführungszeichen gesetzt werden.
Automatisierte Synchronisation
Unser Backup-Skript kann automatisiert aufgerufen werden. Es ist möglich, hierzu eine bestimmte Uhrzeit einzustellen, doch bietet es sich z. B. an ein Backup automatisch dann zu sichern wenn der PC gerade heruntergefahren (oder gestartet) wird. Wir öffnen hierzu die Einstellungen für die sog. Gruppenrichtlinien, erreichbar über „Ausführen“ → gpedit.msc
Hier wählen wir „Computerkonfiguration“ → „Windows-Einstellungen“ → „Skripts (Start / Herunterfahren)“. Durch Doppelklick kann bspw. „Herunterfahren“ geöffnet und durch „Hinzufügen“ das oder die gewünschten Skripte unter „PowerShell-Skripts“ ausgewählt werden.
Empfehlenswert ist dabei das Setzen weiterer Einstellungen: Unter „Computerkonfiguration“ → „Administrative Vorlagen“ → „System“ → „Skripts“ können die beiden Richtlinien
- „Windows PowerShell-Skripts beim Starten und Herunterfahren des Computers zuerst ausführen“
- „Anweisungen in Abmeldeskripts während der Ausführung anzeigen“
aktiviert werden. So wird die Ausführung des Backup-Skripts in den Vordergrund verlegt und damit sichtbar.
Eine automatische Synchronisation zu einer bestimmten Uhrzeit kann mit Hilfe der Windows-Aufgabenplanung eingerichtet werden. Diese ist erreichbar durch Drücken der Windows-Taste → „Aufgabenplanung“ oder wahlweise „Ausführen“ und Eingabe taskschd.msc
.
Wir wählen hier aus der Spalte am rechten Bildschirmrand den Punkt „Einfache Aufgabe erstellen“. Die Einstellung ist beinahe selbsterklärend; nach dem Festlegen des Ausführungsrhythmus, der Uhrzeit und des gewünschten Skripts wird die Aufgabe im Systemzeitplan gespeichert, ähnlich einem Cronjob unter Linux.
Nützliche Parameter
rsync lässt sich durch die Übergabe von Parametern umfassend konfigurieren.
- Der Parameter
-r
dürfte fast immer angegeben werden, aktiviert das Synchronisieren untergeordneter Verzeichnisse - Der Parameter
--delete
löscht Dateien im Zielverzeichnis, die im Quellverzeichnis gelöscht wurden. Er kann auf verschiedene Weisen zur Anwendung kommen:--delete-after
löscht einseitig vorhandene Dateien nach der Synchronisation,--delete-before
vor dieser,--delete-during
währenddessen. - Der Parameter
-n
listet alle Schritte auf, die rsync durchführt, ohne dass diese tatsächlich durchgeführt werden. Er ermöglicht sozusagen einen „Trockendurchlauf“ und ist gut, um die Funktion des Programms zu verstehen. Alternativer Befehl ist--dry-run
. - Parameter
-v
gibt detaillierte Meldungen des Programms heraus. - Parameter
-t
überträgt die Änderungs-Zeitstempel der synchronisierten Dateien mit.
Vorsicht bei der Angabe von Parametern: Diese erfolgt case sensitive – Groß- oder Kleinschreiben desselben Buchstabens kann unterschiedliche Wirkung haben.
Schlussbemerkung
rsync funktioniert auch mit dem WSL wie gewohnt unter Linux-Systemen. Die Einbindung über die PowerShell bietet dabei hinreichende Flexibilität für voll- oder halbautomatische Synchronisationen, die sich in gängige Schemata nahtlos integrieren lassen. Eine GUI vermisst man dabei eigentlich nicht. Die weitreichende Konfigurierbarkeit von rsync ermöglicht die Realisation individuell anpassbarer Sicherungskonzepte, die je nach Anforderung, Budget und Anwenderversiertheit problemlos skalieren.
Kommentare