Unison

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Einen Editor öffnen

  3. Rechte für Dateien und Ordner ändern

Inhaltsverzeichnis
  1. Installation
  2. Unison starten
  3. Beispiel einer .prf-Datei für Unison
  4. Automatisierung
  5. Alternative Skripte
  6. Problembehebung
  7. Links

./briefcase.png Unison 🇬🇧 ist ein Programm für Linux, Windows und Mac zur Synchronisation von Dateien und Verzeichnissen auf verschiedenen Rechnern bzw. Festplatten/Datenträgern. Beim Abgleich werden nur Änderungen an den Daten synchronisiert, so dass ein erneuter Abgleich sehr schnell durchgeführt werden kann. Die größten Vorteile von Unison sind:

Hinweis:

Unison kann nur korrekt arbeiten, wenn die Systemzeit auf beiden Rechnern synchronisiert ist. Dazu empfiehlt es sich, beide Systemuhren nach einem Zeitserver im Internet zu stellen.

Installation

Eines der beiden folgenden Pakete muss installiert [1] werden:

Paketliste zum Kopieren:

sudo apt-get install unison 

Oder mit apturl die Pakete installieren. Link: apt://unison

Paketliste zum Kopieren:

sudo apt-get install unison-gtk 

Oder mit apturl die Pakete installieren. Link: apt://unison-gtk

Sollen Daten zwischen unterschiedlichen Computern synchronisiert werden, ist auf beiden Rechnern jeweils Unison und ein SSH-Server zu installieren. In diesem Falle wird Unison auf dem anderen Rechner automatisch gestartet, wodurch der Vergleich der Daten sehr viel schneller abläuft. Außerdem müssen keine Laufwerke eingehängt werden. Bedingung dafür ist, dass sowohl auf dem Server als auch auf dem Client die gleiche Unison-Version installiert ist, sonst wird mit einer Fehlermeldung abgebrochen.

Für die Synchronsation zwischen internen und externen Datenträgern eines Einzelplatzrechners wird nur das Paket unison-gtk benötigt.

Hinweis:

Sollten sich die zu synchronisierenden Daten bereits auf beiden Computern befinden, ist es empfehlenswert, die Verzeichnisse einmal manuell abzugleichen, da Unison sonst beim ersten Lauf viele Fragen stellt. Bei späteren Durchläufen "merkt" das Programm dann, welche Dateien verändert oder gelöscht wurden.

Unison starten

Die grafische Version von Unison kann über "Anwendungen --> Zubehör", die Shell-Version über die Konsole mit "unison" gestartet werden. Es öffnet sich ein Fenster, in dem gespeicherte Profile angezeigt werden. Zum Erstellen eines neuen Profils werden drei Angaben benötigt:

  1. Name des Profils

  2. Quellpfad (Datenquelle)

  3. Zielpfad (Datenziel)

Dabei kann jeder der beiden einzugebenden Pfade zu einer der folgenden Kategorien gehören:

Methode Pfad Beschreibung Sicherheit
ssh* ssh://benutzer@rechner//pfad/fuer/sync schneller wg. Unison-Serverstart auf entferntem Rechner - zusätzliche Rechenzeit für ssh; kompliziert, wenn entfernter Rechner Windows-basiert sicherer als FTP, je nach SSH-Key-Qualität
fstab /pfad/fuer/sync für interne und externe Datenträger, langsam bei Netzwerkpfaden je nachdem
Socket socket://servername:NNNN/pfad/fuer/sync schnell, Umgehung von Firewalls unsicher

* wird in unison-gtk über Ausfüllen einzelner Felder komfortabel angeboten, macht für den ersten Pfad i.d.R. keinen Sinn

Ein Profil kann ganz einfach über die Pfeiltasten und "OK" gestartet werden. Der Rest des Programms ist selbsterklärend. Sollte keine grafische Oberfläche vorhanden sein oder die grafische Version im Zusammenhang mit ssh nicht funktionieren, kann die Kommandozeilenversion von Unison wie folgt aufgerufen werden:

unison-gtk -ui text PROFILNAME 

Allerdings müssen neue Profile in diesem Fall von Hand im Verzeichnis ~/.unison/ erstellt werden. Wird "PROFILNAME" nicht angegeben, nimmt unison automatisch das Profil default.

Alternativ kann man auch eine Erstsynchronisation so anfangen (die erste Zeile sicherheitshalber):

mv ~/.unison/default.prf ~/.unison/default.old.prf
unison /pfad/fuer/quelle /pfad/fuer/ziel 

und nach abgeschlossener Synchronisation findet man eine neue Datei, die man beliebig benennen kann. Beispiel für eine Profildatei (.prf):

root = /PFAD/ZUR/QUELLE
root = /PFAD/ZUM/ZIEL

Diese Profildatei kann ggf. mit weiteren Einstellungen ("Preferences") in der Form "Wert = Ausdruck" befüllt oder nach Wunsch umbenannt werden:

mv ~/.unison/default.prf ~/.unison/aktenkoffer.prf 

Danach reicht ein:

unison aktenkoffer 

Achtung: hat man sich vertippt, sollte man Unison einfach die default.prf wegnehmen (wie oben geschehen).

Beispiel einer .prf-Datei für Unison

Im folgenden Beispiel werden Verzeichnisse in /home/NUTZER eines Desktop-PCs mit dem Laptop synchronisiert. Mit dabei ist auch das Mailverzeichnis von Thunderbird und die Bookmarks und Einstellungen des Firefox. Damit nichts verloren geht, werden ältere Dateien vor dem synchronisieren im Unterordner alt des jeweiligen Verzeichnisses in dieser Einstellung mit bis zu drei Versionen gesichert. Bei Platznot kann dieser Faktor natürlich auch reduziert werden. Die Datei ist natürlich an die eigenen Verhältnisse anzupassen.

# Roots of the synchronization
root = /home/BENUTZERNAME
root = ssh://laptop.local//home/BENUTZERNAME
# SSH und Avahi ist installiert 

# Pfade in home zu sync:
path = daten
path = Job
path = .mozilla
path = .thunderbird

# ausgenommen diesen hier:
ignore = Path {Telefon}
ignore = Path {Cache}
# liegt Cache in versteckten Verzeichnissen, ist der gesamte relative Pfad anzugeben:
ignore = Path {.mozilla/firefox/XXXXXXXX.default/Cache}

# Sicherungsdateien werden auch nicht mehr gesichert
ignore = Name *_
ignore = Name temp.*
ignore = Name *.o
ignore = Name *.tmp

# ignoriert Sicherungen 
ignore = Path {alt}
ignore = Name *~
ignore = Name .*~

# macht bis zu 3 Sicherungen im jeweiligen Unterordner alt
backuplocation = local
backup = Name *
backupprefix = alt/
maxbackups = 3
backupsuffix = .$VERSION

Automatisierung

Hat man sich eine Unison-Profildatei angelegt, so besteht häufig der Wunsch, dass automatisch synchronisiert wird. In diesem Abschnitt wird eine Beispielkonfiguration zwischen zwei Rechnern, typischer Weise einem Laptop und einem Desktoprechner, via SSH und Unison vorgestellt. Von einer Synchronisation zweier Linux-Rechner über Samba oder NFS sollte abgesehen werden. Wird NFS oder Samba verwendet, müssen die Dateien zunächst vom NFS- oder Samba-Filesystem übertragen werden, bevor sie auf Änderungen abgeglichen werden können. Selbst wenn nur die Zeitstempel abgerufen werden, ist dies zeitaufwändig, wenn größere Datenmengen synchronisiert werden sollen. Wird das SSH-Protokoll verwendet, kann Unison sich selbst auf dem anderen Rechner aufrufen und vor Ort auf Änderungen prüfen, da sich Unison den Stand jeder Datei merkt. Das ist insbesondere bei langsamen WLAN-Verbindungen und über das Internet entscheidend, da viel weniger Netzwerkverkehr entsteht. Dazu sind folgende Schritt notwendig:

1. Schritt

Paketliste zum Kopieren:

sudo apt-get install unison 

Oder mit apturl die Pakete installieren. Link: apt://unison

Des Weiteren wird auf dem Rechner, von dem die Daten auf einen anderen übertragen werden, noch die Paket

Paketliste zum Kopieren:

sudo apt-get install openssh-server 

Oder mit apturl die Pakete installieren. Link: apt://openssh-server

benötigt.

Wenn man einen Laptop mit einem Desktop-PC synchronisieren möchte, sollte typischer Weise die Profildatei und die weitere Konfiguration dieses Abschnitts vom Laptop aus vorgenommen werden. Auf dem Zielrechner, z.B. dem Desktoprechner, müssen lediglich die Pakete installiert werden.

2. Schritt

Unison wird auf dem Zielrechner konfigurieren und nach obiger Erklärung eine Profildatei anlegen. Der Pfad zum Desktoprechner wird dabei im ssh-Protokoll angegeben. Beispiel:

root = /home/BENUTZER/Dokumente/
root = ssh://DNS-ODER-IP-DES_ZIELRECHNERS//home/BENUTZER/Dokumente/

3. Schritt

Damit nicht bei jeder Synchronisation das Passwort eingegeben werden muss und diese auch automatisch durchgeführt werden kann, sollten die PCs so konfiguriert werden, dass sich der Zielrechner per öffentlichem Schlüssel am Ausgangsrechner anmelden kann (ssh über public keys). Eine genaue Anleitung, dazu findet sich im SSH-Artikel hier im Wiki.

4. Schritt

Nun sollte die Synchronisation über SSH einmalig getestet werden. Dazu kann jetzt, wie oben auch erklärt, einfach folgender Befehl ausgeführt werden:

unison PROFILNAME 

Die Profildatei wird dabei ohne Pfad und ohne Endung .prf aufgerufen. Unison sucht automatisch im Unterordner .unison des aktuellen Benutzers. Wie man feststellt, fragt Unison bei jeder veränderten Datei, welche Version übernommen werden soll und am Ende nochmal, ob die Dateien wirklich kopiert werden sollen. Auf diese Weise ist noch keine automatische Synchronisation möglich. Dazu werden noch zwei weitere Parameter benötigt:

Achtung!

Eine Synchronisierung ist kein Backup! Wenn auf einem PC eine Datei gelöscht wird und dann eine Synchronisation durchgeführt wird, wird sie auch vom anderen PC gelöscht. Es sollte auf jeden Fall eine unabhängige Backup-Lösung installiert sein.

Daraus ergeben sich folgende Ergänzungen für die Profildatei:

root = /home/BENUTZER/Dokumente/
root = ssh://dns-oder-ip-des-Zielrechners//home/BENUTZER/Dokumente/

batch = true
auto = true
logfile = /home/BENUTZER/.unison/logfile-PROFILNAME
backup = Name *
maxbackups=5

5. Schritt

Unison alle X Minuten automatisch im Hintergrund starten. Dazu verwendet man Cron, dessen Artikel weitere Erklärungen enthält, wie Cron funktioniert. Hier reicht es zu wissen, dass man mittels

crontab -e 

folgende Zeile am Ende der Datei anfügen muss:

*/15 * * * * test -e /var/lock/unison-PROFILNAME && exit 0 || (touch /var/lock/unison-PROFILNAME;unison PROFILNAME;rm /var/lock/unison-PROFILNAME)

Am Anfang der Zeile wird festgelegt, dass der nachfolgende Befehl alle 15 Minuten ausgeführt wird. Dann wird zunächst ein Lockfile angelegt, damit Unison nicht doppelt aufgerufen wird. Wenn z.B. via WLAN eine sehr große Datei kopiert wird und dies länger als 15 Minuten dauert, würde schon die nächste Instanz von Unison gestartet. Dies kann zu Problemen bei der Synchronisierung führen. Das Lockfile verhindert dies. Allerdings werden neue Dateien dann auch erst wieder synchronisiert, wenn der vorherige Vorgang abgeschlossen ist.

6. Schritt (optional)

Möchte man nicht nur im heimischen LAN oder WLAN synchronisieren, sondern auch über das Internet, so ist eine dynamische DNS-Auflösung erforderlich. Dazu kann man sich z.B. auf no-ip.com 🇬🇧 kostenlos registrieren und viele Router haben einen eingebauten DynDNS-Client, sodass dort die Zugangsdaten eingetragen werden können. Kann der Router dies nicht, kann man auch einen Ubuntu-Rechner diese Aufgabe erledigen lassen. Genauere Erklärungen dazu finden sich im Wiki-Artikel DDNS-Clients. Allerdings muss der Rechner dann immer eingeschaltet bleiben. Viele moderne Router bieten auch die Möglichkeit, Rechner, die per LAN angeschlossen sind, über das Internet zu starten.

Achtung!

Wenn man seine Routeroberfläche zum Internet öffnet, MUSS ein langes und sicheres Passwort gewählt werden!

Außerdem benötigt SSH noch eine Portweiterleitung des Ports 22 an den Desktoprechner, mit dem man synchronisieren möchte. Statt der IP wird dann in der Profildatei, die no-ip.com-Adresse eingetragen. Dies sieht dann so aus:

root = /home/BENUTZER/ORDNER/	
root = ssh://XXX.no-ip.com//home/BENUTZER/ORDNER/

Da moderne Router erkennen, wenn der Laptop im lokalen Netzwerk ist, kann auch für Synchronisierungen innerhalb der eigenen Wohnung die no-ip.com-Adresse verwendet werden, ohne Performanceverluste zu haben.

Alternative Skripte

Eine vereinfachte Konfiguration von Unison kann mittels Sucsynct oder Zenity durchgeführt werden.

Automatisierung mit sucsynct

Hinweis!

Fremdsoftware kann das System gefährden.

Das Skript sucsynct 🇬🇧 erleichtert die Verwaltung von Unison-Profilen und ermöglicht die automatische Synchronisation (sobald Dateien verändert werden). Damit sich das Programm zu einem kleinen Status-Icon in der Systemleiste minimieren kann, wird Zenity in einer Version kleiner 3 oder das neuere yad benötigt (die neueren Zenity-Versionen unterstützen leider keine Icons in der Systemleiste mehr).

Für die automatische Synchronisation muss auf allen zu synchronisierenden Rechnern zusätzlich zum Paket unison-gtk noch inotify-tools installiert [1] sein (beide universe) und openssh-client bzw. ssh auf den Server-Rechnern. Auf den ausführenden Client-Rechnern wird zudem noch bzr-gtk (universe) installiert. Dann kann man das sucsynct-Skript wie folgt herunterladen:

mkdir ~/bin
cd ~/bin
bzr branch lp:sucsynct 

Starten kann man sucsynct dann per:

~/bin/sucsynct/sucsynct 

Updates erhält man per:

bzr pull lp:sucsynct 

Zenity

Hier wird ein älteres Skript vorgestellt, bei dem der Vergleich der Dateien allerdings vergleichsweise langsam vonstatten geht. Dazu muss das folgende Paket installiert werden [1]:

Paketliste zum Kopieren:

sudo apt-get install zenity 

Oder mit apturl die Pakete installieren. Link: apt://zenity

Unison einrichten

Die Konfigurationsdateien liegen (nachdem man als Benutzer Unison einmal gestartet hat) im versteckten Verzeichnis ~/.unison/ im Homeverzeichnis. Dort legt man eine Datei Aktenkoffer.prf an [2], die folgende Zeilen enthält:

root = /home/BENUTZERNAME/Ablage/ 
root = /home/BENUTZERNAME/Aktenkoffer/

Das Skript anlegen

Mit einem Skript erleichtert man sich die Arbeit ein wenig. Es hängt die Freigabe erst ein, führt dann die Synchronisation aus, und hängt dann die Freigabe wieder aus. Außerdem kann man auch nur den lokalen Ordner ohne zu synchronisieren öffnen, um z.B. Dateien hinzuzufügen.

Folgender Text ist in einer Datei Aktenkoffer.sh zu speichern [2]:

#!/bin/bash
# Dieses Script vergleicht die Aktenkoffer lokal und auf dem Laptop
tmpfile=/tmp/zen.$$
mounten () {
 mount ~/Aktenkoffer/
  if [ $? = "32" ] ; then
   zenity --error --text="Kann Laptop nicht mounten!"
   exit 2
  fi
}
unmounten () {
 umount ~/Aktenkoffer/
}
# Auswahl der gewünschten Aktion.
zenity --list \
        --title="Aktion wählen" \
        --text="Bitte die gewünschte Aktion wählen:" \
        --column="Aktion" \
        "lokalen Aktenkoffer öffnen" \
        "Aktenkoffer synchronisieren" \
        >> $tmpfile
if [ $? == "1" ] ; then
 rm -f $tmpfile
 exit 1
fi
aktion=`cat $tmpfile`
case $aktion in
# Lokalen Aktenkoffer öffnen
 "lokalen Aktenkoffer öffnen") nautilus --no-desktop /home/BENUTZERNAME/Ablage;;
# Verzeichnis mounten und synchronisieren
 "Aktenkoffer synchronisieren") mounten
  unison-gtk Aktenkoffer.prf
  unmounten;;
 *) zenity --info --text="Keine Aktion gewählt!";;
esac
rm -f $tmpfile

Auch hier müssen wiederum die Pfade und "BENUTZERNAME" entsprechend angepasst werden. Das Skript muss nun noch ausführbar gemacht werden [3].

Einen Starter anlegen

Um die Verwendung zu erleichtern, legt man sich noch einen Starter entweder auf dem Desktop oder im Panel an. Dies geht über Rechtsklick -> "Starter anlegen..." bzw. Rechtsklick -> "Zum Panel hinzufügen... -> Benutzerdefinierter Anwendungsstarter". Dort macht man folgende Angaben:

Name: Aktenkoffer
Kommentar: Synchronisiert den Aktenkoffer zwischen Desktop und Laptop
Befehl: /Pfad/zum/Aktenkoffer.sh
Typ: Anwendung

Als Symbol kann beispielsweise das obige Logo als SVG-Datei verwendet werden.

Problembehebung

Unterschiedliche Dateisysteme

Wer einen externen Datenträger nutzt, steht evtl. vor dem Problem, dass die Dateisysteme von Quelle und Ziel der Sicherung abweichen. Dies wird insbesondere dann zum Problem, wenn das Dateisystem des Ziels mit FAT32 formatiert ist und daher die Dateirechte von Linux nicht unterstützt. Für den häufigen Fall einer Quelle mit ext3 und einem Ziel mit FAT32 dann in die jeweilige .prf folgende Zeile einfügen [2]:

perms = 0

Mehrere Ordner

In der Grundeinstellung synchronisiert Unison den angegebenen Ordner rekursiv. Das kann man ändern. Dazu folgendes Beispiel einer .prf-Datei:

root = /home/BENUTZERNAME
root = /PFAD/ZUM/ZIEL

path = Bilder
path = Dokumente
path = Musik

Nun werden ausschließlich die via "path = ..." definierten Ordner von "BENUTZERNAME" berücksichtigt. Bei Bedarf kann man auch "ignore = Path ..." nutzen, um bestimmte Ordner bewusst auszuschließen.

SSH-Server läuft auf anderem Port als 22

Wenn man den SSH-Server auf einem anderen Port als 22 laufen hat, muss man in dessen Profil den Pfad anpassen. Dazu öffnet man mit dem Editor [2] das entsprechende Profil und ändert den SSH-Pfad folgendermaßen:

ssh://benutzer@rechner:Port//pfad/fuer/sync

Unterschiedliche Unison-Versionen

Je nach Ubuntu-Distribution (z.B. 14.04. oder 16.04.) kann eine andere / neuere Version von unison in der Paketverwaltung hinterlegt sein. Diese sind üblicherweise nicht zueinander kompatibel. Die erste Nummer hinter dem Punkt muss übereinstimmen, z.B.

Option 1 (einfach): Man installiert das Paket unison-all welches neue und alte Versionen enthält.

Paketliste zum Kopieren:

sudo apt-get install unison-all 

Oder mit apturl die Pakete installieren. Link: apt://unison-all

Option 2 (fortgeschritten): Man fügt den Parameter "servercmd" in seine PRF-Konfiguration und kopiert eine funktionierende (Versions-)Binärdatei auf die andere Maschine.

root = /home/BENUTZERNAME
root = /PFAD/ZUM/ZIEL

servercmd=/home/BENUTZERNAME/bin/unison

Intern

Extern