Mit Unison und SSH halten Sie Verzeichnisse über mehrere Rechner hinweg synchron.
Nicht jeder gehört zu den Glücklichen, die mit einem einzigen IT-Gerät für alles durchkommen. Viele nennen eine verteilte IT-Infrastruktur ihr Eigen, typischerweise mit je einem PC zu Hause und am Arbeitsplatz sowie einem Notebook für unterwegs.
In einer solchen Konstellation wünscht man sich, immer auf den aktuellen Stand aller Dateien zugreifen zu können, unabhängig davon, an welchem Gerät man gerade sitzt. Dabei sollen schmale Netzwerkbandbreiten die Arbeit nicht behindern, idealerweise will man auch offline arbeiten.
Eine typische Lösung für dieses Dilemma besteht darin, alle relevanten Dateien als Arbeitskopie zum Beispiel auf einem USB-Stick mitzunehmen. Doch wer dabei nicht akribisch aufpasst, endet schließlich mit mehreren, divergierenden Arbeitsständen, von denen keiner alle Änderungen beinhaltet.
Dagegen hilft eigentlich nur eine zentrale Datenhaltung auf einem Netzlaufwerk in der Cloud. Dabei leidet allerdings die Zugriffsgeschwindigkeit und damit auch die Effizienz enorm. Noch dazu muss der Client den Server permanent via Internet erreichen können – beim Pendeln oder auf Reisen oft ein Problem.
Für eine wirklich praktikable Lösung des Problems müssen drei Komponenten zusammenspielen: Ein zentraler, via Internet abrufbarer Datenbestand, lokale Arbeitskopien dieses Pools auf allen Geräten und eine einfache – am besten vollautomatische – Methode zur Synchronisierung über Server und Clients. Genau das leistet Unison [1] gemeinsam mit der Secure Shell aus OpenSSH [5] (siehe auch Kasten “Schlüsselfragen”). Den Aufbau, den wir im Folgenden in den Beispielen verwenden werden, zeigt die Abbildung 1.

Abbildung 1: Die Nutzerdateien zweier Rechner, einer mit permanenter und einer mit gelegentlicher Netzwerkverbindung, werden via Internet gegen einen zentralen Server synchronisiert.
Schlüsselfragen
Für Unison bietet SSH die Grundlage für das Authentifizieren des Clients beim Server sowie für den vor fremden Blicken geschützten Transport der abzugleichenden Daten durchs Internet. Grundsätzlichere Informationen zu OpenSSH finden Sie auf der Webseite des Projekts [5], konkrete Anwendungstipps für die Nutzung zur Authentifizierung im Ubuntuusers-Blog [6]. Auf dem Server muss der SSH-Dienst auf einem Port (typischerweise Port 22) lauschen. Liegt der Server vom Internet aus gesehen hinter einer Firewall beziehungsweise einem Router, müssen Sie diesen Port durchleiten.
Auf jedem einzelnen Client muss ein geheimer Schlüssel und dessen öffentliches Pendant vorliegen. Üblicherweise dient dazu ein RSA-Schlüsselpaar in den beiden Dateien ~/.ssh/id_rsa beziehungsweise ~/.ssh/id_rsa.pub. Fehlen diese Schlüssel oder haben Sie die Passphrase des geheimen Schlüssels vergessen, generieren Sie mit ssh-keygen ein neues Schlüsselpaar. Zum Erzeugen einer neuen Passphrase genügt der Aufruf ssh-keygen -p. Den öffentlichen Schlüssel eines jeden Clients müssen Sie nun einmalig dem Server bekanntgeben und damit autorisieren. Das erledigen Sie über folgenden Aufruf:
$ ssh-copy-id Client@server.mycloud.tld
Der Schlüssel landet auf dem Server in der Datei ~/.ssh/authorized_keys. Ab jetzt führt der Weg zum Verbindungsaufbau vom Client zum Server über die Passphrase des lokalen geheimen Schlüssels und nicht mehr (nur) über das Passwort des entfernten Servers.
Um diese Passphrase nur einmal pro Sitzung am Client eingeben zu müssen, bedienen Sie sich des ssh-agents, der bei vielen aktuellen Desktop-Systemen automatisch beim Login startet. Übergibt Sie ihm per ssh-add den per Passphrase entsperrten geheimen Schlüssel, dann bedarf es für jede nachfolgende SSH-Verbindung während dieser Sitzung keiner weiteren Eingabe der Passphrase mehr. Sie sollten daher Ssh-add auch beim Login ausführen, zum Beispiel durch Eintrag in ein Autostart-Skript.
Üblicherweise nutzen dann Desktops automatisch das grafische Dialogfenster ssh-askpass, um die Passphrase abzufragen. Manche, wie etwa KDE Plasma, bringen dazu ihre eigene Implementierung mit (bei Plasma: ksshaskpass), was ihnen ermöglicht, die Passphrase nach der Eingabe für weitere Sitzungen im integrierten Passwort-Safe abzulegen. Damit erübrigt sich in der Zukunft eine neuerliche Eingabe der Passphrase.
Die Befehle zur Installation von OpenSSH auf dem Server sowie des entsprechenden Clients auf Desktop-Rechnern und Notebooks finden Sie in Listing 1.
Listing 1
[... Server ...] $ sudo apt-get install openssh-server [... Client (KDE Plasma) ...] $ sudo apt-get install openssh-client ksshaskpass [... Client (andere Desktop-Umgebungen) ...] $ sudo apt-get install openssh-client ssh-askpass
Unison einrichten
Für ein sauberes Funktionieren von Unison müssen alle an der Replikation beteiligten Systeme – also alle Clients sowie der zentrale Server – dieselbe Software-Version benutzen: Sowohl das User Manual als auch der Reference Guide von Unison verweisen explizit darauf, dass sich zwischen einzelnen Releases das Datenformat der Archive ändern kann. Daher empfiehlt es sich, Unison direkt aus dem Quellcode zu generieren, um so in der Arbeitsumgebung leichter verschiedene Distributionen und deren Generationen mischen zu können. Für diesen Artikel fand die aktuell als stabil empfohlene Unison-Version 2.48.4 Verwendung [4].
Um Unison zu bauen, benötigen Sie neben GNU Make noch den Compiler Ocaml sowie einige Bibliotheken. Um diese unter Debian und dessen Ablegern samt aller notwendigen Abhängigkeiten einzuspielen, verwenden Sie den Befehl aus der ersten Zeile von Listing 2. Dann wechseln Sie ins Home-Verzeichnis, laden den Unison-Quellcode herunter, entpacken ihn, und wechseln ins dabei neu entstandene Quellcodeverzeichnis (Zeilen 2 bis 5).
Im Wesentlichen besteht Unison aus drei ausführbaren Dateien, die Sie nun mit den Befehlen aus den Zeilen 6 bis 10 bauen und nach /usr/local/bin installieren (Zeilen 11 bis 17). Das kommandozeilenbasierte Unison führt den eigentlichen Abgleich durch und kann sowohl im Hintergrund als auch interaktiv auf der Kommandozeile laufen. Der Dateisystemwächter Unison-fsmonitor schließlich kommt bei permanentem Kontakt zwischen Client und Server zum Einsatz. Bei Änderungen auf einer Seite informiert er die jeweils andere und initiiert zeitnah einen Abgleich.
Bei Unison-gtk handelt es sich um die interaktive Alternative mit grafischer Benutzerschnittstelle. Sie empfiehlt sich vor allem für mobile Geräte mit nur temporärer Verbindung zum Server sowie für den Fall von Inkonsistenzen zwischen Client und Server. Letztere entstehen zwangsläufig, sobald sich aus irgendeinem Grund Dateien auf beiden Seiten ändern, ohne dass rechtzeitig ein Abgleich stattfinden konnte. Das kann Unison nicht mehr automatisch auflösen. In solchen Situationen erweist sich der grafische Client als übersichtlicher und erleichtert damit das Auswählen der maßgeblichen Dateiversion.
Listing 2
$ sudo apt-get install make ocaml libgtk2.0-dev liblablgtk2-ocaml-dev $ cd $ wget --content-disposition https://github.com/bcpierce00/unison/archive/2.48.4.tar.gz $ tar xvzf unison-2.48.4.tar.gz $ cd ~/unison-2.48.4 $ make UISTYLE=text $ sudo mv src/unison /usr/local/bin/unison-2.48.4 $ sudo mv src/unison-fsmonitor /usr/local/bin/ $ make UISTYLE=gtk2 $ sudo mv src/unison /usr/local/bin/unison-2.48.4-gtk $ cd /usr/local/bin $ sudo chown root:root unison-* $ sudo chmod 0755 unison-* $ sudo ln -s unison-2.48.4 unison-2.48 $ sudo ln -s unison-2.48 unison $ sudo ln -s unison-2.48.4-gtk unison-2.48-gtk $ sudo ln -s unison-2.48-gtk unison-gtk
Abgleich konfigurieren
Die Funktion von Unison wird über Profil-Dateien gesteuert, die sich bei Bedarf auch schachteln lassen – dazu später mehr. Diese Profile folgen einer Semantik, die wir im Folgenden anhand der Beispiele in ihren Grundzügen erklären. Bei Änderungen an den Dateien sollten Sie auf jeden Fall das Unison-Handbuch konsultieren, vor allem die Kapitel über Profile [2] und Pfadspezifikationen [3].
Als User-Space-Anwendung legt Unison seine Konfiguration im Verzeichnis ~/.unison ab, sodass es dem einzelnen Anwender obliegt, sie ganz nach seinen Bedürfnissen zu gestalten. So gesehen kann das Unison-Profil common.prf aus Listing 3 nur als Beispiel dienen, das Sie für Ihre Zwecke individuell anpassen müssen.
Listing 3
# Unison common profile to sync any client's
# home directory with server in Internet
root = /home/Client
root = ssh://Client@server.mycloud.tld:SSH-Port//home/Client
logfile = /home/Client/.unison/unison.log
ignore = Path Downloads
ignore = Path Maildir
ignore = Name .*
ignorenot = Path .unison
ignore = Path .unison/*
ignorenot = Path .unison/*.prf
ignorenot = Path .gnupg
ignore = Path .gnupg/*
ignorenot = Path .gnupg/{gpg.conf,pubring.gpg,secring.gpg}
ignorenot = Path .ssh
ignore = Path .ssh/known_hosts*
Zeile 4 gibt das lokale Verzeichnis an, das Unison gegen den Server und dessen Verzeichnis (Zeile 5) synchronisieren soll. Zeile 7 definiert die Log-Datei, die alle einzelnen Abgleiche protokolliert.
Ab Zeile 9 wird es interessant, denn mit den bisherigen Angaben würde Unison den gesamten Inhalt der angegebenen Verzeichnisse gegeneinander abgleichen. Die Zeilen 9 und 10 schließen zwei Pfade im Client-Wurzelverzeichnis (/home/Client), hier Downloads/ und Maildir/, explizit vom Abgleich aus.
Zudem klammert Zeile 11 alle Dateien und Verzeichnisse aus, die das angegebene Muster im Namen haben. In diesem Fall also alle versteckten Dateien und Verzeichnisse (sogenannte Dotfiles) im gesamten Pfad ab dem Wurzelverzeichnis, also zum Beispiel auch die Datei /home/Client/Ordner/.Datei. Dazu gehört auf jeden Fall das Verzeichnis /home/Client/.unison/ und dessen Inhalt.
Allerdings soll Unison seine Profile, und nur die, aus dem Verzeichnis .unison/ sehr wohl synchron halten. Deshalb schließt Zeile 13 .unison/ zunächst wieder komplett ein, Zeile 14 nimmt davon dann aber dessen Inhalt (Logs und Archive) aus. Zeile 15 sorgt dann dafür, dass alle auf .prf endenden Dateien, also die Unison-Profile dennoch synchronisiert werden.
Ähnlich geht der Block in den Zeilen 17 bis 19 für das versteckte Verzeichnis .gnupg/ vor. Hier schließt jedoch Zeile 19 ganz explizit nur die drei gelisteten Dateien in die Synchronisation mit ein.
Erstmaliger Abgleich
Im Folgenden nehmen wir für einen initialen Abgleich folgendes Ausgangsszenario an: Der zu synchronisierende Dateibaum ist auf dem Server komplett befüllt; auf dem Client steht er vollständig leer, bis auf die Unison-Profile in ~/.unison/ und das SSH-Zertifikat in ~/.ssh/. In diesem Idealzustand dient somit der Server ausschließlich als Quelle, der Client ausschließlich als Ziel des Abgleichs.
Liegt ein anderer Zustand vor, sollten Sie sich auf eine längere Sitzung einstellen, denn dann treten beim ersten möglicherweise viele Konflikte auf, die alle mit größter Sorgfalt behandelt werden wollen – sonst zerschießen Sie sich schnell den Datenbestand. Auf keinen Fall dürfen sich auf dem Client im Verzeichnis ~/.unison/ Reste irgendwelcher Unison-Abgleichsarchive befinden.
Sie stoßen diesen erstmaligen Abgleich ebenso an wie jenen für mobile Geräte im folgenden Abschnitt. Als Rückmeldung erhalten Sie dann die Warnung aus Abbildung 2. Darin tut Unison kund, dass es sich offensichtlich um einen initialen Abgleich handelt, der etwas länger dauern kann.

Abbildung 2: Beim erstmaligen Abgleich erscheint eine Warnung, die man nur im Idealfall – bei einem noch leeren Client – ruhigen Gewissens mit Ok beantworten darf.
Mobiler Betrieb
Der Modus für den mobilen Betrieb ist vor allem – aber, wie später noch ausgeführt, nicht nur – für Geräte wie das Notebook mobile.myprovider.tld aus Abbildung 1 gedacht. Für diese einfache Betriebsart genügt ein recht übersichtliches Profil (Listing 4), das Sie als mobile.prf abspeichern. Es stellt sicher, dass keinesfalls der Dateisystemmonitor Unison-fsmonitor startet (Zeile 7) und dass lediglich der Basisabgleich nach den Vorgaben aus Listing 3 stattfindet (Zeile 11).
Listing 4
# Unison profile for mobile # clients with occasional # network connection # exclude explicitely use # of file watcher watch = false # load definitions for # actual reconciliation include common
Um die Synchronisierung anzustoßen, starten Sie am besten die grafische Anwendung. Auf der Kommandozeile tippen Sie dazu unison-gtk mobile. Da der Start am Prompt doch etwas unkomfortabel ist, empfiehlt es sich, einen entsprechenden Eintrag auf den Desktop, in die Taskbar oder das Applikationsmenü zu setzen.
Nach dem Start von Unison warten Sie ab, bis die Anwendung die Unterschiede der beiden Replikas anzeigt (Abbildung 3). Im einfachsten Fall, wenn der durch die grünen Pfeile vorgeschlagene Abgleich auch der erwartete ist, drücken Sie nun auf Go und warten das Ende des Synchronisationslaufs ab. Selbst im Fall von durch rote Fragezeichen markierten Konflikten dürfen Sie ruhigen Gewissens den Abgleich starten: Unison arbeitet dann nur die Updates mit den grünen Pfeilen ab und lässt die Konflikte unberührt.

Abbildung 3: Eine typische Darstellung des Zustands zwischen zwei Replikas in der grafischen Benutzeroberfläche von Unison.
Authentifizierung
Bei jedem Aufruf fragt Unison die Passphrase des Zertifikats für die SSH-Verbindung ab (Abbildung 4). Solange Sie die Benutzeroberfläche von Unison-gtk nach der Eingabe nicht schließen, können Sie beliebig viele Abgleiche ohne erneute Eingabe tätigen. Elegant ist das aber nicht.
Besser integrieren Sie das Shell-Skript unison-mobile.sh aus Listing 5 so in die Desktop-Umgebung, dass es automatisch beim Login aufgerufen wird. Dann erfolgt die Passphrase-Abfrage nur einmal, um für die Dauer der Sitzung das eigene SSH-Zertifikat für den Server freizugeben. Es steht dann für beliebig viele Abgleiche – und für ganz reguläre SSH-Sitzungen – zur Verfügung.
Listing 5
#!/bin/sh # Load user's SSH Certificate into SSH agent # Hint: Passphrase will be requested # -- either to be entered manually # -- or will be retrieved from desktop's wallet ssh-add < /dev/null > /dev/null 2>&1
Geben Sie nicht nur die Passphrase ein, sondern haken wie in Abbildung 5 auch Passwort merken ab, legt der Desktop die Passphrase in seinem Wallet ab, und Sie ersparen sich auch bei zukünftigen Logins weitere Abfragen.

Abbildung 5: Die Übergabe der Passphrase an dem Desktop-Wallet (hier unter KDE Plasma) erspart bei künftigen Abgleichen die Tipparbeit.
Konflikte behandeln
Nach der Synchronisation stellt die Unison-Benutzeroberfläche das Ergebnis recht übersichtlich dar (Abbildung 6). Erfolgreich abgeglichene Dateien erhalten einen grünen Haken, eine Zusammenfassung führt die noch bestehenden Konflikte auf. Nehmen Sie jetzt durch Drücken von Rescan einen neuen Vergleich der Replikas vor, verschwinden alle erfolgreich abgeglichenen Dateien, und es bleiben nur noch die Konflikte übrig.

Abbildung 6: Unison informiert über das Ergebnis eines Abgleichs und weist auf weiterhin bestehende Konflikte hin.
Die markieren Sie dann einen nach dem anderen und bereiten sie durch Auswahl der Menüpunkte Skip, Left to Right oder Right to Left für einen neuerlichen Abgleich vor. Dabei stellt Unison die für die Konfliktauflösung gewählte Vorgehensweise mit blauen Richtungspfeilen dar (Abbildung 7). Ein erneuter Klick auf Go stößt dann den Abgleich an.

Abbildung 7: Konflikte bei der Synchronisation verarzten Sie manuell, indem Sie für jeden eine passende Richtung für den Abgleich auswählen.
Stationärer Betrieb
Das Profil stationary.prf aus Listing 6 ist für Rechner mit dauerhafter Netzwerkverbindung gedacht, wie die Workstations private.myhome.tld und work.myoffice.tld aus Abbildung 1.
Durch die Aktivierung des Batch- und weiterer Modi durch die Zeilen 9 bis 11 läuft Unison vollständig im Hintergrund, stellt keine weiteren Fragen mehr, und gleicht alles ab, was konfliktfrei möglich ist. Zeile 12 schaltet zusätzlich den automatischen Dateisystemmonitor Unison-fsmonitor im Hintergrund dazu, der für raschen Abgleich sorgt, sobald sich in einer der beiden Replikas etwas regt.
Listing 6
# Unison profile for stationary # clients with (almost) permanent # network connection # don't ask, just constantly # reconcile based on file # watcher by propagating # non-conflicting chances batch = true silent = true auto = true repeat = watch # load definitions for # actual reconciliation include common
Durch den Umstand, dass die Verbindung beim Login auf- und erst beim Logout wieder abgebaut wird, entsteht quasi eine permanente Kommunikation zwischen Client und Server. Dafür sorgt das Shell-Skript unison-stationary.sh aus Listing 7, das Sie in die Liste der Autostart-Skripte einreihen. Unter KDE Plasma etwa legen Sie es ins Verzeichnis ~/.config/autostart-scripts/.
Zeile 6 aktiviert das SSH-Zertifikat – so wie oben für den mobilen Betrieb – und lädt es für die Sitzung. Zeile 7 startet Unison im Textmodus und als Hintergrundprozess mit dem Profil aus Listing 6. Ab jetzt und bis zum Logout gilt: Jede Änderung im Dateisystem auf einer der beiden Seiten löst einen zeitnahen Abgleich im Hintergrund aus und wird in der Log-Datei protokolliert. Konflikte fallen erst einmal durchs Raster, lassen sich aber jederzeit durch Aufruf von unison-gtk mobile in der grafischen Benutzeroberfläche entdecken und entsprechend behandeln.
Listing 7
#!/bin/sh # Load user's SSH Certificate into SSH agent # and start unison w/ cmdline user interface # Hint: unison runs in background and starts # unison-fsmonitor on client and server side ssh-add < /dev/null > /dev/null 2>&1 unison -ui text stationary > /dev/null 2>&1
Fazit
Mit Unison in der Version 2.48.4 steht ein sehr verlässliches, mächtiges und effizientes Werkzeug zum bidirektionalen Abgleich von Dateisystemen zwischen Rechnern zur Verfügung. In Kombination mit SSH lässt sich dieser Abgleich auch über das Internet sicher bezüglich Authentifizierung und Datentransport vornehmen. Kleine Anpassungen optimieren die Lösung dabei für den mobilen beziehungsweise stationären Betrieb.
Die grafische Benutzeroberfläche von Unison zeigt die Unterschiede beider Replikas übersichtlich auf und unterstützt den Anwender bei der Auflösung von Konflikten. Mit der hier gezeigten Konfiguration lassen sich Datenbestände über mehrere Rechner hinweg alltagstauglich auf aktuellem Stand halten, was dem Anwender ermöglicht, recht frei und rasch zwischen seinen Arbeitsstationen zu wechseln.
Der Autor
Werner Hein beschäftigt sich seit 1994 in seiner Freizeit mit Linux und seit 1997 professionell mit der Entwicklung des Modems in Mobiltelefonen. Er nutzt die hier gezeigte Lösung, um sein Notebook sowie zwei PCs zu Hause und am Arbeitsplatz über einen zentralen Server im heimischen LAN zu synchronisieren.
Infos
-
Profile: https://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#profile
-
Pfadspezifikationen: https://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#pathspec
-
Unison 2.48.4 (Quellcode): https://github.com/bcpierce00/unison/archive/2.48.4.tar.gz
-
OpenSSH: https://www.openssh.com
-
SSH-Authentifizierung mit Public Key: https://wiki.ubuntuusers.de/SSH/#Authentifizierung-ueber-Public-Keys






