Unison für die Synology Disk Station

Wer kennt das Problem nicht: Man hat Verzeichnisse, die auf verschiedenen Rechnern geändert werden, und trotzdem möchte man einen konsistenten Stand der Daten haben. Normalerweise würde ich für diese Art von Problemen mein Universaltool rsync zücken, aber das synchronisiert nur in eine Richtung.

Eine Suche mit Google ergibt, dass es genau ein Werkzeug für das Problem gibt: Unison. Das Tool funktioniert nicht korrekt, wenn verschiedene Zeichenkodierungen auf den verschiedenen Rechnern verwendet werden, aber da es sich bei meinem Anwendungsfall um mehrere Linux Rechner handelt, sollte das kein Problem sein. Eigentlich handelt es sich um einen Linux Server und eine Synology Disk Station DS107+, aber die basiert ja auch auf Linux.

Ich möchte natürlich eine aktuelle Version verwenden, als bei Debian mitgeliefert wird, also benötige ich ein .deb für den Server und ein ipkg für die Disk Station.

Debian Paket

Das Bauen des Debian Pakets ist relativ einfach:

sudo apt-get install dpkg-dev
sudo apt-get install ocaml
sudo apt-get install dh-make
sudo apt-get install fakeroot
sudo apt-get install devscripts

Danach kann man den Source von Unison herunterladen und in ein Verzeichnis entpacken. Um daraus ein Debian zu bauen folgt man nun z.B. diesen Schritten.

Ich hatte Probleme bei der Installation, also habe ich das Makefile gepatcht (also zwei Zeilen auskommentiert):

doinstall: $(NAME)$(EXEC_EXT)
# -mv $(INSTALLDIR)/$(NAME)$(EXEC_EXT) /tmp/$(NAME)-$(shell echo $$$$)
cp $(NAME)$(EXEC_EXT) $(INSTALLDIR)
# cp $(NAME)$(EXEC_EXT) $(INSTALLDIR)/$(NAME)-$(MAJORVERSION)$(EXEC_EXT)

Ausserdem muss man noch das File debin/rules anpassen, da im Unison Makefile ein anderer Variablenname für das Verzeichnis verwendet wird:

$(MAKE) INSTALLDIR=$(CURDIR)/debian/unison/usr/bin install

Nach einem fakeroot debian/rules binary und sudo dpkg -i unison_2.27.57_i386.deb sollte das Paket ordnungsgemäß installiert sein.

Unison für ARM

Um Unison auf die DiskStation zu bringen gibt es zwei Möglichkeiten: Entweder man kompiliert es für die ARM Architektur auf einem PC (cross compile) oder kompiliert es direkt auf der Disk Station. Ersteres ist ausführlich bei Synology beschrieben, hat aber den Nachteil, dass ich dann auch das ocaml Paket anpassen müsste, damit es den Cross Compiler verwendet. Nachdem z.B. die Aufrufe vom Assembler hart in ocaml reinkodiert sind, wollte ich mir das nicht antun und habe mich für Möglichkeit zwei entschieden: direkt auf der Disk Station zu kompilieren.

Den Compiler bekommt man, indem man ipkg installiert. Man benötigt noch folgende Pakete:

ipkg install ocaml
ipkg install make
ipkg install gcc

Danach lässt sich der Quellcode von Unison auf der DiskStation kompilieren, wenn man die native compilaton ausschaltet.

ocamlopt/Native compilation

Natürlich habe ich mir auch angeschaut, ob es möglich ist, Unison mit dem ocaml native code compiler zu kompilieren (ocaml erzeugt standardmässig nur Bytecode, der dann interpretiert wird). Dadurch würde Unison schneller laufen und auch die Abhängigkeit vom ocaml.ipkg würde dadurch verschwinden.

Leider fehlt der Native Code Compiler für die ARM Plattform. Der Maintainer der Debian ocaml Pakete hat mir bestätigt, dass sich das auch in den aktuellen Debian Paketen noch nicht geändert hat, allerdings sei der Fehler in diesen Paketen behoben, wenn auch noch nicht freigeschalten. Ich habe daraufhin versucht ocaml 3.11.0 selbst neu zu kompilieren und bin trotzdem wieder beim Native Code Compiler gescheitert. Die Fehlermeldungen sehen ziemlich genau so aus, wie in diesem Bug Report beschrieben. Nachdem der Fehler schon aus dem Jahr 2005 stammt, habe ich wenig Hoffnung, dass sich da seitdem viel getan hat.

Fazit

Ich konnte problemlos ein Debian Paket für die aktuelle Unison Version bauen. Für die Diskstation konnte ich immerhin die interpretierte Version bauen. Wenn ich wieder eine freie Minute habe, werde ich evtl. beide in passender Form hier bereitstellen. Jetzt muss ich aber erst mal ausfürhlich testen, ob das nun auch wirklich funktioniert…

Leider war es nicht möglich, die native Version für die Disk Station zu bauen. Dies wird auch erst möglich sein, wenn ocaml dafür angepasst wurde. Manchmal hat es doch Nachteile, wenn man Software in der exotischten Sprache, die man finden konnte, schreibt…

Update 09.02.2009

Leider funktioniert die Synchronisation des Änderungsdatums zwischen manchen Disk Stations nicht (z.B. DS-107+ und Ubuntu), mit anderen aber schon (z.B. DS-209+ und Ubuntu). Diese Funktion ist jedoch Voraussetzung, wenn man ein Verzeichnis sinnvoll mit mehreren Rechnern abgleichen will. Meine Vermutung ist, dass es hier vielleicht Probleme mit der Byte Order gibt, aber eine Anfrage auf der Unsion Liste zu diesem Thema blieb leider ohne Erfolg.

root@frodo:/space/shares/scratch# unison -times -confirmbigdeletes=false -prefer=newer -batch -contactquietly -group -owner /space/shares/scratch ssh://space.~~~~~~~~~//volume1/scratch
Looking for changes
Waiting for changes from server
Reconciling changes
< ---- new file .DS_Store local : absent space : new file modified on 1901-12-13 at 21:45:52 size 6148 rwxrwxrwx user=family group=users Propagating updates UNISON 2.27.57 started propagating changes at 20:02:11 on 08 Feb 2009 [BGN] Copying .DS_Store from //space//volume1/scratch to /space/shares/scratch Failed: Failed to set modification time of file /space/shares/scratch/.unison..DS_Store.02a2343badb0ed90c1f4b72e3d8bb083.unison.tmp to 1901-12-13 at 21:45:52: the time was set to 1901-12-13 at 21:45:52 instead 100% 00:00 ETAFailed [.DS_Store]: Failed to set modification time of file /space/shares/scratch/.unison..DS_Store.02a2343badb0ed90c1f4b72e3d8bb083.unison.tmp to 1901-12-13 at 21:45:52: the time was set to 1901-12-13 at 21:45:52 instead UNISON 2.27.57 finished propagating changes at 20:02:11 on 08 Feb 2009 Saving synchronizer state Synchronization incomplete (0 items transferred, 0 skipped, 1 failure) failed: .DS_Store

Update 19.03.2009

In der Zwischenzeit hat sich doch ein ziemlich umfangreiches Repository angesammelt. Die Pakete enthalten meist nur die interpretierten Versionen, da es für die jeweiligen Plattformen keinen native code Compiler gibt. Bisher konnte ich aber keine Performanceprobleme feststellen.

6 Gedanken zu „Unison für die Synology Disk Station“

  1. Hm, das schaut mir interessant aus! Offensichtlich gibt es auch ein graphisches Frontend. Mal anschauen, ob das taugt, um einen persönlichen Datenbereich auf verschiedenen Fest- und Mobilrechnern zu synchronisieren…

  2. Für Unison gibt es in der Tat ein grafisches Interface, allerdings habe ich das noch nie gesehen (meine Server haben keine GUI). In meinem Debian Paket fehlen die GUI Komponenten deshalb auch.

    Die Alternative wäre übrigens Novel iFolder, aber nachdem das auf mono basiert, wird es für die Disk Station nicht viel leichter zu kompilieren sein.

    Unison wird offiziell gar nicht weiterentwickelt, Novel iFolder irgendwie nicht mehr so richtig.

  3. Endlich eine etwas neuere Info zu diesem Thema. Versuche schon seit einem Monat auf der DS-108j Unison zum laufen zu bringen. Leider kann ich deinen Weg nicht nachgehen, da es für dieses Produkt keinen Compiler auf der Disk Station gibt. Ocaml wäre verfügbar – ich bin aber bis jetzt kläglich daran gescheitert eine Crosscompiler-Umgebung so zum laufen zu bringen, dass ich Unison (NATIVE=false) kompilieren kann. Wäre für ein bisschen Hilfe sehr dankbar.

  4. Laut der Wiki Seite auf http://www.synology-wiki.de/index.php/Welchen_Prozessortyp_besitzt_mein_System%3F müsste die DS-108j auf einer MPC8241 CPU basieren. Dafür gibt es anscheinend wirklich keinen gcc.

    Wenn Du unison kompilieren möchtest, musst Du es über den cross-compiler kompilieren und vorher so patchen, dass auch die ocaml Dateien mit dem cross-compiler übersetzt werden. In meinem Artikel verweist ein Link darauf, wie Du unison ggf. anpassen kannst. Ich fürchte aber, dass das vor Dir noch keiner probiert hat und vermutlich nicht auf Anhieb klappen wird. Ich hatte das anfangs auch überlegt, aber dann das direkte kompilieren auf der Diskstation vorgezogen.

    Evtl. wäre es einen Versuch wert, erst den gcc für diese Plattform zu kompilieren. Leider ist Unison praktisch unwartbar, da es in der sinnlosesten Sprache überhaupt geschrieben ist…

  5. Yippie Yippie Yeah! Habe jetzt doch einen naiven Compiler für die DS-108j gefunden. Hab per ipkg ocaml und make installiert und dann unison auf der Diskstation compiliert und siehe da, es hat funktioniert. Zwar nicht die native-Version, aber egal. Falls ihr die ipk online stellen möchtet kann ich sie euch zukommen lassen (für alle anderen „verzweifelten“ Besitzer einer ds-108j). Musst mir dafür nur eine Mailadresse oder einen uploadlink zukommen lassen. Natürlich gibts keine Garantie, dass es funktioniert oder irgendeinen Support meinerseits 😉

Kommentare sind geschlossen.