Dateisynchronisierung · 9 min read · Feb 09, 2026

Einrichten der Unison-Dateisynchronisierung zwischen zwei Servern auf Debian 8 (Jessie)

Dieses Tutorial zeigt, wie man die Dateisynchronisierung zwischen zwei Debian 8-Servern mit Unison einrichtet. Unison ist ein Dateisynchronisierungstool, das ähnlich wie rsync funktioniert, der große Unterschied besteht darin, dass es Änderungen in beide Richtungen verfolgt/synchronisiert, d.h. Dateien, die auf server1 geändert wurden, werden auf server2 repliziert und umgekehrt.

1 Vorbemerkung

In diesem Tutorial werde ich die folgenden zwei Debian-Server verwenden:

  • server1.example.com mit der IP-Adresse 192.168.1.101
  • server2.example.com mit der IP-Adresse 192.168.1.102

Ich möchte das Verzeichnis /var/www zwischen den beiden Servern synchronisieren. Ich werde Unison in diesem Tutorial als Root-Benutzer ausführen, damit Unison über ausreichende Berechtigungen verfügt, um Benutzer- und Gruppenberechtigungen zu synchronisieren.

Alle Befehle in diesem Tutorial werden als Root-Benutzer ausgeführt. Melden Sie sich auf beiden Servern in der Shell als Root an und beginnen Sie mit Schritt 2 “ Unison installieren “.

2 Unison installieren

server1/server2:

Unison muss auf server1 und server2 installiert werden; da wir von server1 zu server2 über SSH verbinden, benötigen wir auch die SSH-Pakete, und ich werde den Nano-Editor für die Dateibearbeitung in der Shell installieren. Dies kann wie folgt erreicht werden:

apt-get -y install unison openssh-server ssh nano

3 Erstellen eines privaten/öffentlichen Schlüsselpaares auf server1

server1:

Jetzt erstellen wir ein privates/öffentliches Schlüsselpaar auf server1.example.com:

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
Generiere öffentliches/privates dsa-Schlüsselpaar.
Geben Sie die Datei an, in der der Schlüssel gespeichert werden soll (/root/.ssh/id_dsa): <– ENTER
Verzeichnis ‘/root/.ssh’ erstellt.
Geben Sie die Passphrase ein (leer für keine Passphrase): <– ENTER
Geben Sie die gleiche Passphrase erneut ein: <– ENTER
Ihre Identifikation wurde in /root/.ssh/id_dsa gespeichert.
Ihr öffentlicher Schlüssel wurde in /root/.ssh/id_dsa.pub gespeichert.
Der Fingerabdruck des Schlüssels ist:
ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 root@server1
Das Zufallsbild des Schlüssels ist:
+—[DSA 1024]—-+
| |
| |
| . |
| . E |
|+ * . S |
|.Ooo o |
|ooo+. + |
|oo=… o |
|.. oo.. |
+—————–+
root@server1:~#

Es ist wichtig, dass Sie keine Passphrase eingeben, da die Spiegelung sonst ohne menschliches Eingreifen nicht funktioniert. Drücken Sie einfach ENTER!

Als nächstes kopieren wir unseren öffentlichen Schlüssel nach server2.example.com:

ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
Die Authentizität des Hosts '192.168.1.102 (192.168.1.102)' kann nicht festgestellt werden.  
ECDSA-Schlüsselfingerabdruck ist 51:7f:b4:ed:bd:e3:fc:16:2f:55:5c:e1:2c:d7:3d:a9.  
Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (ja/nein)? <-- ja (Sie sehen dies nur, wenn dies das erste Mal ist, dass Sie sich mit server2 verbinden)  
/usr/bin/ssh-copy-id: INFO: versucht, sich mit dem neuen Schlüssel(n) anzumelden, um alle bereits installierten herauszufiltern  
/usr/bin/ssh-copy-id: INFO: 1 Schlüssel(e) müssen installiert werden -- wenn Sie jetzt aufgefordert werden, geschieht dies, um die neuen Schlüssel zu installieren  
[email protected]'s Passwort: <-- server2 root Passwort
Anzahl der hinzugefügten Schlüssel: 1
Versuchen Sie jetzt, sich mit der Maschine anzumelden, mit: "ssh '[email protected]'"  
und überprüfen Sie, ob nur die Schlüssel hinzugefügt wurden, die Sie wollten.

Überprüfen Sie nun auf server2, ob der öffentliche Schlüssel von server1 korrekt übertragen wurde:

server2:

cat $HOME/.ssh/authorized_keys
root@server2:/home/administrator# cat $HOME/.ssh/authorized_keys  
ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= root@server1

4 Unison ausführen

server1:

Wir können jetzt Unison zum ersten Mal ausführen, um das Verzeichnis /var/www auf beiden Servern zu synchronisieren. Führen Sie auf server1 aus:

unison /var/www ssh://192.168.1.102//var/www

Die Ausgabe wird ähnlich wie diese sein - Sie müssen möglicherweise einige Fragen beantworten, da dies das erste Mal ist, dass Unison ausgeführt wird:

root@server1:/var/www# unison /var/www ssh://192.168.1.102//var/www  
Kontaktiere Server...  
Verbunden [//server1//var/www -> //server2//var/www]  
Suche nach Änderungen  
Warnung: Es wurden keine Archivdateien für diese Wurzeln gefunden, deren kanonische Namen sind:  
 /var/www  
 //server2//var/www  
Dies kann entweder passieren  
weil dies das erste Mal ist, dass Sie diese Wurzeln synchronisiert haben,  
oder weil Sie Unison auf eine neue Version mit einem anderen  
Archivformat aktualisiert haben.
Die Aktualisierungserkennung kann bei diesem Lauf eine Weile dauern, wenn die Replikate  
groß sind.
Unison wird davon ausgehen, dass der 'letzte synchronisierte Zustand' beider Replikate  
vollständig leer war. Das bedeutet, dass alle Dateien, die unterschiedlich sind,  
als Konflikte gemeldet werden, und alle Dateien, die nur auf einer  
Replik existieren, als neu angesehen und auf die andere Replik propagiert werden.  
Wenn die beiden Replikate identisch sind, werden keine Änderungen gemeldet.
Wenn Sie diese Nachricht wiederholt sehen, kann es daran liegen, dass einer Ihrer Rechner  
seine Adresse von DHCP bezieht, was dazu führt, dass sich sein Hostname  
zwischen den Synchronisierungen ändert. Siehe die Dokumentation für die Umgebungsvariable UNISONLOCALHOSTNAME  
für Ratschläge zur Behebung dieses Problems.
Spenden an das Unison-Projekt werden dankend angenommen:  
http://www.cis.upenn.edu/~bcpierce/unison
Drücken Sie die Eingabetaste, um fortzufahren.[] <-- Drücken Sie Enter
Warten auf Änderungen vom Server  
Änderungen abgleichen
lokaler server2  
dir ----> example.com [f] <-- Drücken Sie Enter  
dir ----> example.de [f] <-- Drücken Sie Enter
Fahren Sie mit der Propagierung von Updates fort? [] <-- Geben Sie "y" ein  
Updates propagieren
  
UNISON 2.40.102 begann um 10:17:17.94 am 25. Sep 2015 mit der Propagierung von Änderungen  
[BGN] Kopiere example.com von /var/www nach //server2//var/www  
[BGN] Kopiere example.de von /var/www nach //server2//var/www  
Verknüpfung: kopiert /var/www/example.de/web/index.html von lokaler Datei /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html  
[END] Kopiere example.de  
[END] Kopiere example.com  
UNISON 2.40.102 beendete die Propagierung von Änderungen um 10:17:17.94 am 25. Sep 2015
  
Speichern des Synchronisierungsstatus  
Synchronisierung abgeschlossen um 10:17:17 (2 Elemente übertragen, 0 übersprungen, 0 fehlgeschlagen)

Überprüfen Sie jetzt das Verzeichnis /var/www auf server1 und server2, und Sie sollten feststellen, dass sie jetzt synchron sind.

Natürlich möchten wir Unison nicht interaktiv ausführen, daher können wir eine Präferenzdatei ( /root/.unison/default.prf) erstellen, die alle Einstellungen enthält, die wir sonst auf der Befehlszeile angeben müssten:

nano /root/.unison/default.prf
# Wurzeln der Synchronisierung
root = /var/www
root = ssh://192.168.1.102//var/www

# Pfade zur Synchronisierung
#path = current
#path = common
#path = .netscape/bookmarks.html

# Einige Regexps, die Namen und Pfade angeben, die ignoriert werden sollen
#ignore = Path stats    ## ignoriert /var/www/stats
#ignore = Path stats/*  ## ignoriert /var/www/stats/*
#ignore = Path */stats  ## ignoriert /var/www/somedir/stats, aber nicht /var/www/a/b/c/stats
#ignore = Name *stats   ## ignoriert alle Dateien/Verzeichnisse, die mit "stats" enden
#ignore = Name stats*   ## ignoriert alle Dateien/Verzeichnisse, die mit "stats" beginnen
#ignore = Name *.tmp    ## ignoriert alle Dateien mit der Endung .tmp

#          Wenn dies auf true gesetzt ist, bewirkt dieses Flag, dass die Benutzeroberfläche
#          Bestätigungen zu nicht konfliktbehafteten Änderungen überspringt. (Genauer gesagt, wenn die
#          Benutzeroberfläche damit fertig ist, die Propagierungsrichtung für einen Eintrag festzulegen
#          und zum nächsten übergeht, überspringt sie alle nicht konfliktbehafteten Einträge und
#          geht direkt zum nächsten Konflikt.)
auto=true

#          Wenn dies auf true gesetzt ist, stellt die Benutzeroberfläche keine Fragen.
#          Nicht konfliktbehaftete Änderungen werden propagiert; Konflikte werden übersprungen.
batch=true

#          !Wenn dies auf true gesetzt ist, fordert Unison eine zusätzliche
#          Bestätigung an, wenn es scheint, dass die gesamte Replik gelöscht wurde,
#          bevor die Änderung propagiert wird. Wenn das Batch-Flag ebenfalls gesetzt ist,
#          wird die Synchronisierung abgebrochen. Wenn die Pfadpräferenz verwendet wird,
#          wird die gleiche Bestätigung für oberste Pfade angefordert. (Momentan betrifft dieses Flag nur die
#          textuelle Benutzeroberfläche.) Siehe auch die Mountpoint-Präferenz.
confirmbigdel=true

#          Wenn diese Präferenz auf true gesetzt ist, verwendet Unison die
#          Änderungszeit und die Länge einer Datei als `pseudo inode
#          Nummer', wenn es Replikate auf Updates scannt, anstatt den gesamten Inhalt
#          jeder Datei zu lesen. Unter Windows kann dies dazu führen, dass Unison
#          ein Update nicht propagiert, wenn die Änderungszeit
#          und die Länge der Datei durch das Update unverändert bleiben.
#          Unison wird jedoch niemals ein solches Update mit einer Änderung von der
#          anderen Replik überschreiben, da es immer eine sichere
#          Überprüfung auf Updates direkt vor der Propagierung einer Änderung durchführt.
#          Daher ist es in den meisten Fällen sinnvoll, diesen Schalter unter Windows zu verwenden
#          und gelegentlich Unison einmal mit fastcheck auf false zu
#          setzen, wenn Sie befürchten, dass Unison ein Update übersehen haben könnte.
#          Der Standardwert der Präferenz ist auto, was dazu führt,
#          dass Unison schnelles Prüfen auf Unix-Replikaten (wo es sicher ist)
#          und langsames Prüfen auf Windows-Replikaten verwendet. Zur
#          Rückwärtskompatibilität können ja, nein und standard anstelle von
#          true, false und auto verwendet werden. Siehe den Abschnitt "Schnelles Prüfen" für weitere
#          Informationen.
fastcheck=true

#          Wenn dieses Flag auf true gesetzt ist, werden die Gruppenattribute der
#          Dateien synchronisiert. Ob die Gruppennamen oder die Gruppen
#          Identifikatoren synchronisiert werden, hängt von der Präferenz numerids ab.
group=true

#          Wenn dieses Flag auf true gesetzt ist, werden die Eigentümerattribute der
#          Dateien synchronisiert. Ob die Eigentümernamen oder die Eigentümer
#          Identifikatoren synchronisiert werden, hängt von der Präferenz
#          extttnumerids ab.
owner=true

#          Die Einbeziehung der Präferenz -prefer root bewirkt, dass Unison immer
#          Konflikte zugunsten von root löst, anstatt den Benutzer um
#          Anleitung zu bitten. (Die Syntax von root ist die gleiche wie für
#          die root-Präferenz, plus die speziellen Werte neuer und älter.)
#          Diese Präferenz wird durch die preferpartial-Präferenz überschrieben.
#          Diese Präferenz sollte nur verwendet werden, wenn Sie sicher sind, dass Sie wissen,
#          was Sie tun!
prefer=newer

#          Wenn diese Präferenz auf true gesetzt ist, gibt die textuelle Benutzeroberfläche
#          überhaupt nichts aus, außer im Falle von Fehlern.
#          Das Setzen von silent auf true setzt automatisch die batch-Präferenz
#          auf true.
silent=true

#          Wenn dieses Flag auf true gesetzt ist, werden die Änderungszeiten von Dateien
#          (aber nicht die Änderungszeiten von Verzeichnissen) propagiert.
times=true

Die Kommentare sollten die Datei selbsterklärend machen, außer für die Pfaddirektiven. Wenn Sie keine Pfaddirektiven angeben, werden die Verzeichnisse in den Wurzelanweisungen synchronisiert. Wenn Sie Pfaddirektiven angeben, sind die Pfade relativ zum Wurzelpfad (z.B. root = /var/www und path = current übersetzt zu /var/www/current), und nur diese Unterverzeichnisse werden synchronisiert, nicht das gesamte Verzeichnis, das in der Wurzelanweisung angegeben ist.

Sie können mehr über die verfügbaren Optionen erfahren, indem Sie sich die Man-Seite von Unison ansehen:

man unison

Jetzt, da wir alle Einstellungen in einer Präferenzdatei (insbesondere die Wurzel- (und optional die Pfad-) Direktiven) festgelegt haben, können wir Unison ohne Argumente ausführen:

unison

5 Erstellen eines Cron-Jobs für Unison

server1:

Wir möchten die Synchronisierung automatisieren, deshalb erstellen wir einen Cron-Job dafür auf server1.example.com:

crontab -e
*/5 * * * * /usr/bin/unison &> /dev/null

Dies würde Unison alle 5 Minuten ausführen; passen Sie es nach Ihren Bedürfnissen an (siehe

man 5 crontab

). Ich verwende hier den vollständigen Pfad zu unison ( /usr/bin/unison), nur um sicherzustellen, dass cron weiß, wo es unison finden kann. Ihr unison-Standort kann abweichen. Führen Sie

which unison

aus, um herauszufinden, wo Ihrer ist.

6 Unison testen

Jetzt werde ich die 2-Wege-Synchronisation von Unison testen, um zu sehen, ob die Einrichtung vollständig funktioniert.

Führen Sie den folgenden Befehl auf server1 aus, um eine Testdatei mit dem Inhalt “Test 1” zu erstellen:

Server1

echo "Test 1" > /var/www/test.txt

Warten Sie jetzt mindestens 5 Minuten (da wir einen Cronjob erstellt haben, der einmal alle 5 Minuten ausgeführt wird). Führen Sie dann auf server2 aus:

cat /var/www/test.txt

um den Inhalt der Datei test.txt auf dem Bildschirm anzuzeigen. Die Ausgabe sollte ähnlich wie dieses Screenshot sein.

Ausgabe des cat-Befehls auf Server 2.

Führen Sie jetzt diesen Befehl auf server2 aus, der den Inhalt unserer Testdatei auf “Test 2” aktualisiert:

Server2

echo "Test 2" > /var/www/test.txt

Und warten Sie mindestens 5 Minuten. Führen Sie dann den cat-Befehl auf server1 aus:

Server1

cat /var/www/test.txt

Die Ausgabe sollte wie auf dem Screenshot gezeigt sein.

Ausgabe des cat-Befehls auf Server 1.

7 Links

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.