.. _Daten-Synchronisierung: Daten-Synchronisierung mit ``unison`` und ``bsync`` =================================================== .. index:: Unison .. rubric:: 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: .. code-block:: bash sudo apt-get install unison unison-gtk Nach der Installation kann Unison mittels ``unison-gtk`` aufgerufen werden. Intern verwendet Unison das Shell-Programm :ref:`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 :ref:`vimdiff `) und kann anschließend entweder mittels ``>`` oder ``<`` eine Synchronisationsrichtung manuell angeben. .. Dies kann auch, beispielsweise mit dem Skript `watcher.py .. `_, automatisiert erfolgen. 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 :ref:`Python3 ` geschriebene Neu-Implementierung von Unison (allerdings bislang ohne graphische Bedienoberfläche) heißt `bsync `__. ... to be continuted ...