Daten-Synchronisierung mit unison und bsync

Unison

Möchte man eine Synchronisierung zweier Verzeichnisse nicht nur in eine Richtung, so ist das Tool Unison beziehungsweise das gleiche Programm mit graphischer Oberfläche unison-gtk zu empfehlen. Es lässt sich über die gleichnamigen Pakete via apt installieren:

sudo apt-get install unison unison-gtk

Nach der Installation kann Unison mittels unison-gtk aufgerufen werden. Intern verwendet Unison das Shell-Programm rsync zur Synchronisierung von Daten. Um Unison zu benutzen, erstellt man ein „Profil“, in welchem man zwei zu synchronisierende Verzeichnisse auswählt. Öffnet man dieses im Auswahlmenü, so scannt Unison die Verzeichnisse automatisch nach Veränderungen und zeigt diese mitsamt der Richtung und der Art der Veränderung graphisch an. Mit einem Klick auf „Go“ (Hotkey g) werden die Änderungen übernommen.

rsync und unison eignen sich sehr gut zur Verwaltung von Sicherheitskopien oder zum „Mitnehmen“ eines Projektes von einem stationären PC auf einen USB-Stick. Veränderungen sind dabei erlaubt, denn sie können wiederum in umgekehrter Richtung synchronisiert werden.

Persönlich verwende ich zur Synchronisierung von Dateien zwischen meinem Rechner und einem (mit LUKS verschlüsselten) USB-Stick folgende Methode: In einem eigenen Verzeichnis namens shared lege ich für jede zu synchronisierende Datei oder jeden zu synchronisierenden Ordner einen gleichnamigen Symlink ab, der allerdings am Namen die (zusätzliche) Endung .sync erhält. Dieses Verzeichnis mit den entsprechenden Symlinks muss sowohl auf der Festplatte wie auch auf dem USB-Stick vorhanden sein, die Ziele der Symlinks sind allerdings logischerweise unterschiedlich, beispielsweise:

/home/user/shared
    code.sync       # ---> /home/user/data/code
    configs.sync    # ---> /home/user/data/configs
    homepage.sync   # ---> /home/user/data/homepage

/media/user/usb0/shared
    code.sync       # ---> /media/user/usb0/code
    configs.sync    # ---> /media/user/usb0/configs
    homepage.sync   # ---> /media/user/usb0/homepage

Falls noch nicht vorhanden, so wird anschließend das Verzeichnis ~/.unison angelegt. In diesem Verzeichnis lassen sich beliebig viele Synchronisations-Profile als Textdateien mit der Endung .prf anlegen. Für die Synchronisation mit dem USB-Stick sieht ein solches Profil bei mir folgendermaßen aus:

# Datei: ~/.unison/usb-sync.prf

# Quell- und Zielverzeichnis:
root = /home/user/shared
root = /media/user/usb0/shared

# Angabe der zu synchronisierenden Dateien:
follow = Name *.sync

# Folgende Dateien dennoch ignorieren:
ignore = Regex .*/.backupdir/*
ignore = Regex .*/.git/*
ignore = Regex .*/.hg/*

# Bei Unterschieden zwischen Dateien nur das Nötigste ausgeben:
diff = diff -y -W 79 --suppress-common-lines

Diese Variante setzt voraus, dass der USB-Stick immer an der gleichen Stelle eingebunden wird (im obigen Beispiel /media/user/usb0). Anschließend muss nur noch unison usb-sync aufgerufen werden, um eine Synchronisation der angegebenen Inhalte zu erreichen.

Im Shell-Modus wird die von Unison vorgeschlagene Synchronisationsrichtung mit <---- oder ----> angezeigt. Drückt man f („follow“), so wird diese Empfehlung übernommen. Wurden sowohl im Quell- wie auch im Zielverzeichnis Änderungen vorgenommen, so zeigt Unison <-?-> an. Der Benutzer muss in diesem Fall die Unterschiede zwischen den Dateiversionen gegebenenfalls selbst überprüfen (beispielsweise mittels vimdiff) und kann anschließend entweder mittels > oder < eine Synchronisationsrichtung manuell angeben.

Synchronisierungen mit rsync beziehungsweise unison lassen sich nicht rückgängig machen. Zu solch einem Zweck oder für Mehrbenutzer-Systeme, wenn es zu konkurrierenden Entwicklungen kommen kann (wenn beispielsweise die gleiche Datei in zwei Verzeichnissen auf unterschiedliche Weise verändert wird), sollte eine Versionskontroll-Programm wie git oder mercurial genutzt werden.

Eine mit der Programmiersprache Python3 geschriebene Neu-Implementierung von Unison (allerdings bislang ohne graphische Bedienoberfläche) heißt bsync.

… to be continuted …