Unison Dateisynchronisation zwischen zwei Ubuntu 11.10 Servern aufsetzen

Version 1.0

Author: Falko Timme , Christian Schmalfeld <c [dot] schmalfeld [at] projektfarm [dot] de>

Follow me on Twitter


Dieses Tutorial zeigt, wie man mit Unison eine Dateisynchronisation zwischen zwei Ubuntu 11.10 Servern herstellt. Unison ist ein Synchronisationswerkzeug ähnlich rsync, unterscheidet sich jedoch dadurch, dass es Veränderungen in beide Richtungen verfolgt, das heißt, Dateien die auf Server 1 geändert werden, werden auf Server 2 geändert, aber auch andersherum.

Für die Inhalte dieses Tutorials übernehme ich keinerlei Garantie.

1 Vorbemerkung

In diesem Tutorial benutze ich die folgenden beiden Ubuntu 11.10 Server:
  • server1.example.com mit der IP 192.168.0.100
  • server2.example.com mit der IP 192.168.0.101
Ich möchte das Verzeichnis /var/wwwder beiden Server synchronisieren. Ich werde Unison in diesem Tutorial als root Benutzer ausführen, damit es ausreichende Benutzerrechte hat um Benutzer - und Gruppenrechte zu synchronisieren.

Alle folgenden Befehle werden mit Administrativrechten ausgeführt, melden Sie sich deshalb zu allererst als root an:

sudo su


2 Installation von Unison

server1/server2:

Unison muss auf server1 und server2 installiert werden; da wir zum Verbinden von server1 mit server2 SSH benutzen, brauchen wir auch die SSH Pakete. Installieren Sie diese folgendermaßen:

apt-get install unison openssh-server ssh


3 Ein Private/Public Schlüsselpaar auf Server 1 erstellen

server1:

Nun erstellen Sie ein Private/Public Schlüsselpaar auf server1.example.com:

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
<-- ENTER Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
<-- ENTER Enter same passphrase again: <-- ENTER Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
32:0f:f5:49:f0:32:f8:d0:63:8d:44:88:a5:12:f9:73 root@server1.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|  .. o.o+        |
|  .....+ =       |
|  ... o O +      |
|   .o E= * .     |
|     o+ S o      |
|       =         |
|        .        |
|                 |
|                 |
+-----------------+
root@server1:~#

Es ist wichtig, dass Sie kein Passwort eingeben, da das Mirroring sonst nicht ohne menschliche Interaktion geschehen kann. Drücken Sie deshalb einfach auf ENTER!

Kopieren Sie als nächstes Ihren öffentlichen Schlüssel nach server2.example.com (beachten Sie bitte, dass das root-Konto auf  server2.example.com aktiviert sein muss, und dass root-Anmeldungen erlaubt sein müssen. Um root-Anmeldungen auf einem Ubuntu-System zu erlauben, benutzen Sie diesen Befehl:

sudo passwd root

Um zu überprüfen ob root-Anmeldungen erlaubt sind, prüfen Sie die Direktive PermitRootLogin in /etc/ssh/sshd_config - Es ist möglich, dass Sie danach den SSH Daemon neu starten müssen:

ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101

root@server1:~# ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101
The authenticity of host '192.168.0.101 (192.168.0.101)' can't be established.
ECDSA key fingerprint is a2:38:f3:df:7a:6c:b6:3c:d6:c3:9c:88:93:e2:f0:63.
Are you sure you want to continue connecting (yes/no)?
<-- yes (dies wird nur das erste Mal gefragt, wenn Sie sich mit einem Server verbinden) Warning: Permanently added '192.168.0.101' (ECDSA) to the list of known hosts.
root@192.168.0.101's password:
<-- server2 root Passwort Now try logging into the machine, with "ssh 'root@192.168.0.101'", and check in:
~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

root@server1:~#

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

server2:

cat $HOME/.ssh/authorized_keys

ssh-dss AAAAB3NzaC1kc3MAAACBAJgYGqpkEPBIV/Uiygz2FbOwCE9ggjXQK8anG/VxaTqH0KhZR+
oL1i+Av2aZmK/D3msUQEkqClO51jarQXbm9i7ie7Y6OwQ4G8DBZXzy8A8nQ6V1bEikqif8xmmSayqV KPvHXMv3yINteUdCNYBHAuci1NB5iAf3Gmt/bo5SRpU1AAAAFQDJnh+a6lODf+zSF2eX1L4HvQgtxw AAAIAIOdjsJkzBDseOdTMD5oVZqrrp6cy0e1846DZ4C0PKQSeT9RQqKmbOICa8t94FF8MRLdV0p4x+ R8I8VHRloErQ5v1CIVvrtzOGIGAR//Bo5wPI+8lsfbsOj8ZyZI6+bF6wHKjzNFLbgFpZjnIf/CisP8 7GtPp8MXq3bH7SI/7i6gAAAIAfByiUkqQZ7fOM18BHTqQhopxMjhJhvrATt0PJ/k2JzQp0lQm/Z31a zpvccK5GF61AwWbfQSFAGy4AOKtVXZ6ztz80sKZeDwECNFJpT6rubjsbaSX2PvacrV8sAuJI1XZPAg QTl06mJLL9dC7rNrY+2QgXoJqFtgjiFGWhCC+UjQ== root@server1.example.com
(Der Inhalt enthält keine Zeilenumbrüche)

4 Benutzung von Unison

server1:

Sie können Unison nun das erste Mal starten um das/var/www Verzeichnis der beiden Server zu synchronisieren. Benutzen Sie auf server1:

unison /var/www
ssh://192.168.0.101//var/www

Die Ausgabe wird ähnlich der folgenden sein - Sie könnten einige Fragen beantworten müssen, da dies der erste Start von Unison ist:

root@server1:~# unison /var/www ssh://192.168.0.101//var/www
Contacting server...
Connected [//server1.example.com//var/www -> //server2.example.com//var/www]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
/var/www
//server2.example.com//var/www
This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.

Update detection may take a while on this run if the replicas are
large.

Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.

If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations.  See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.

Donations to the Unison project are gratefully accepted:
http://www.cis.upenn.edu/~bcpierce/unison

Waiting for changes from server| webalizer
Reconciling changes

local          server2.e...
dir      ---->            apps  [f] <-- ENTER file     ---->            index.html  [f] <-- ENTER link     ---->            ispconfig  [f] <-- ENTER dir      ---->            php-fcgi-scripts/apps  [f] <-- ENTER dir      ---->            webalizer  [f] <-- ENTER link     ---->            webmail  [f] <-- ENTER
Proceed with propagating updates? [] <-- y Propagating updates
UNISON 2.32.52 started propagating changes at 14:25:02 on 09 Dec 2011
[BGN] Copying apps from /var/www to //server2.example.com//var/www
[BGN] Copying index.html from /var/www to //server2.example.com//var/www
[BGN] Copying ispconfig from /var/www to //server2.example.com//var/www
[BGN] Copying php-fcgi-scripts/apps from /var/www to //server2.example.com//var/www
[BGN] Copying webalizer from /var/www to //server2.example.com//var/www
[BGN] Copying webmail from /var/www to //server2.example.com//var/www
[END] Copying ispconfig
[END] Copying webmail
[END] Copying apps
[END] Copying webalizer
[END] Copying index.html
[END] Copying php-fcgi-scripts/apps
UNISON 2.32.52 finished propagating changes at 14:25:03 on 09 Dec 2011

Saving synchronizer state
Synchronization complete at 14:25:03  (6 items transferred, 0 skipped, 0 failed)
root@server1:~#

Überprüfen Sie jetzt die /var/www Verzeichnisse auf server1 und server2, diese sollten nun synchronisiert sein.

Natürlich werden Sie Unison nicht interaktiv benutzen wollen, deshalb können Sie eine Einstellungsdatei (/root/.unison/default.prf) erstellen, welche alle Einstellungen enthält, die Sie sonst per Befehlszeile konfigurieren müssten:

vi /root/.unison/default.prf

# Unison preferences file
# Roots of the synchronization root = /var/www root = ssh://192.168.0.101//var/www # Paths to synchronize #path = current #path = common #path = .netscape/bookmarks.html # Some regexps specifying names and paths to ignore #ignore = Path stats ## ignores /var/www/stats #ignore = Path stats/* ## ignores /var/www/stats/* #ignore = Path */stats ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats #ignore = Name *stats ## ignores all files/directories that end with "stats" #ignore = Name stats* ## ignores all files/directories that begin with "stats" #ignore = Name *.tmp ## ignores all files with the extension .tmp # When set to true, this flag causes the user interface to skip # asking for confirmations on non-conflicting changes. (More # precisely, when the user interface is done setting the # propagation direction for one entry and is about to move to the # next, it will skip over all non-conflicting entries and go # directly to the next conflict.) auto=true # When this is set to true, the user interface will ask no # questions at all. Non-conflicting changes will be propagated; # conflicts will be skipped. batch=true # !When this is set to true, Unison will request an extra # confirmation if it appears that the entire replica has been # deleted, before propagating the change. If the batch flag is # also set, synchronization will be aborted. When the path # preference is used, the same confirmation will be requested for # top-level paths. (At the moment, this flag only affects the # text user interface.) See also the mountpoint preference. confirmbigdel=true # When this preference is set to true, Unison will use the # modification time and length of a file as a `pseudo inode # number' when scanning replicas for updates, instead of reading # the full contents of every file. Under Windows, this may cause # Unison to miss propagating an update if the modification time # and length of the file are both unchanged by the update. # However, Unison will never overwrite such an update with a # change from the other replica, since it always does a safe # check for updates just before propagating a change. Thus, it is # reasonable to use this switch under Windows most of the time # and occasionally run Unison once with fastcheck set to false, # if you are worried that Unison may have overlooked an update. # The default value of the preference is auto, which causes # Unison to use fast checking on Unix replicas (where it is safe) # and slow checking on Windows replicas. For backward # compatibility, yes, no, and default can be used in place of # true, false, and auto. See the section "Fast Checking" for more # information. fastcheck=true # When this flag is set to true, the group attributes of the # files are synchronized. Whether the group names or the group # identifiers are synchronizeddepends on the preference numerids. group=true # When this flag is set to true, the owner attributes of the # files are synchronized. Whether the owner names or the owner # identifiers are synchronizeddepends on the preference # extttnumerids. owner=true # Including the preference -prefer root causes Unison always to # resolve conflicts in favor of root, rather than asking for # guidance from the user. (The syntax of root is the same as for # the root preference, plus the special values newer and older.) # This preference is overridden by the preferpartial preference. # This preference should be used only if you are sure you know # what you are doing! prefer=newer # When this preference is set to true, the textual user interface # will print nothing at all, except in the case of errors. # Setting silent to true automatically sets the batch preference # to true. silent=true # When this flag is set to true, file modification times (but not # directory modtimes) are propagated. times=true
Die Kommentare erklären die Datei fast vollständig, bis auf die path Direktive. Spezifizieren Sie keine path Direktive, so werden doe Vereichnisse in den root Direktiven synchronisiert. Spezifizieren Sie path Direktive, so sind die Pfade relativ zum root Pfad (e.g. root = /var/www and path = current wird übersetzt zu /var/www/current), und nur diese Unterverzeichnisse werden synchronisiert, nicht das ganze Verzeichnis, welches im root Direktiv angegeben ist.

Sie können mehr über die verfügbaren Optionen auf Unisons Lexikonseite erfahren:

man unison

Nun da Sie alle Einstellungen in die Konfigurationsdatei geschrieben haben (besonders das root (und optional das path) Direktiv) können Sie Unison ohne jegliche Schalter starten:

unison


5 Cron Job erstellen

server1:

Da Synchronisation automatisiert am sinnvollsten ist, erstellen wir dafür auf server1.example.com einen Cron Job:

crontab -e

*/5 * * * * /usr/bin/unison &> /dev/null
Dies würde Unison alle fünf Minuten starten, passen Sie die Einstellungen an Ihre Bedürfnisse an (schauen Sie sich dazu

man 5 crontab

an). Ich benutze hier den vollständigen Pfad zu unison (/usr/bin/unison) um sicherzugehen, dass Cron weiß wo es das Programm findet. Ihr unison Verzeichnis könnte ein anderes sein, benutzen Sie deshalb

which unison

um herauszufinden, welches es ist.

6 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte