{"id":535,"date":"2009-02-03T11:57:49","date_gmt":"2009-02-03T09:57:49","guid":{"rendered":"http:\/\/www.tupperclub.de\/blog\/?p=535"},"modified":"2014-11-21T23:17:09","modified_gmt":"2014-11-21T22:17:09","slug":"unison-fur-die-synology-disk-station","status":"publish","type":"post","link":"https:\/\/www.tupperclub.de\/blog\/?p=535","title":{"rendered":"Unison f\u00fcr die Synology Disk Station"},"content":{"rendered":"<p>Wer kennt das Problem nicht: Man hat Verzeichnisse, die auf verschiedenen Rechnern ge\u00e4ndert werden, und trotzdem m\u00f6chte man einen konsistenten Stand der Daten haben. Normalerweise w\u00fcrde ich f\u00fcr diese Art von Problemen mein Universaltool <a href=\"http:\/\/rsync.samba.org\/\">rsync<\/a> z\u00fccken, aber das synchronisiert nur in eine Richtung.<\/p>\n<p>Eine Suche mit Google ergibt, dass es genau ein Werkzeug f\u00fcr das Problem gibt: <a href=\"http:\/\/www.seas.upenn.edu\/~bcpierce\/unison\/\">Unison<\/a>. <!--more-->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.<\/p>\n<p>Ich m\u00f6chte nat\u00fcrlich eine aktuelle Version verwenden, als bei Debian mitgeliefert wird, also ben\u00f6tige ich ein .deb f\u00fcr den Server und ein ipkg f\u00fcr die Disk Station. <\/p>\n<h3>Debian Paket<\/h3>\n<p>Das Bauen des Debian Pakets ist relativ einfach:<\/p>\n<blockquote><p>\nsudo apt-get install dpkg-dev<br \/>\nsudo apt-get install ocaml<br \/>\nsudo apt-get install dh-make<br \/>\nsudo apt-get install fakeroot<br \/>\nsudo apt-get install devscripts\n<\/p><\/blockquote>\n<p>Danach kann man den Source von Unison herunterladen und in ein Verzeichnis entpacken. Um daraus ein Debian zu bauen folgt man nun z.B. <a href=\"http:\/\/www.debian-administration.org\/articles\/337\">diesen Schritten<\/a>.<\/p>\n<p>Ich hatte Probleme bei der Installation, also habe ich das Makefile gepatcht (also zwei Zeilen auskommentiert):<\/p>\n<blockquote><p>\ndoinstall: $(NAME)$(EXEC_EXT)<br \/>\n#       -mv $(INSTALLDIR)\/$(NAME)$(EXEC_EXT) \/tmp\/$(NAME)-$(shell echo $$$$)<br \/>\n        cp $(NAME)$(EXEC_EXT) $(INSTALLDIR)<br \/>\n#       cp $(NAME)$(EXEC_EXT) $(INSTALLDIR)\/$(NAME)-$(MAJORVERSION)$(EXEC_EXT)\n<\/p><\/blockquote>\n<p>Ausserdem muss man noch das File <code>debin\/rules<\/code> anpassen, da im Unison Makefile ein anderer Variablenname f\u00fcr das Verzeichnis verwendet wird:<\/p>\n<blockquote><p>\n$(MAKE) INSTALLDIR=$(CURDIR)\/debian\/unison\/usr\/bin install\n<\/p><\/blockquote>\n<p>Nach einem <code>fakeroot debian\/rules binary<\/code> und <code>sudo dpkg -i unison_2.27.57_i386.deb<\/code> sollte das Paket ordnungsgem\u00e4\u00df installiert sein.<\/p>\n<h3>Unison f\u00fcr ARM<\/h3>\n<p>Um Unison auf die DiskStation zu bringen gibt es zwei M\u00f6glichkeiten: Entweder man kompiliert es f\u00fcr die ARM Architektur auf einem PC (cross compile) oder kompiliert es direkt auf der Disk Station. Ersteres ist <a href=\"http:\/\/download.synology.com\/download\/ds\/userguide\/Synology%20NAS%20Server%203rd-Party%20Apps%20Integration%20Guide.pdf\">ausf\u00fchrlich bei Synology beschrieben<\/a>, hat aber den Nachteil, dass ich dann auch das ocaml Paket anpassen m\u00fcsste, damit es den Cross Compiler verwendet. Nachdem z.B. die Aufrufe vom Assembler <a href=\"http:\/\/caml.inria.fr\/pub\/old_caml_site\/caml-list\/1160.html\">hart in ocaml reinkodiert sind<\/a>, wollte ich mir das nicht antun und habe mich f\u00fcr M\u00f6glichkeit zwei entschieden: direkt auf der Disk Station zu kompilieren. <\/p>\n<p>Den Compiler bekommt man, indem man <a href=\"http:\/\/www.synology-wiki.de\/index.php\/IPKG\">ipkg<\/a> installiert. Man ben\u00f6tigt noch folgende Pakete:<\/p>\n<blockquote><p>\nipkg install ocaml<br \/>\nipkg install make<br \/>\nipkg install gcc\n<\/p><\/blockquote>\n<p>Danach l\u00e4sst sich der Quellcode von Unison auf der DiskStation kompilieren, wenn man die native compilaton ausschaltet. <\/p>\n<h3>ocamlopt\/Native compilation<\/h3>\n<p>Nat\u00fcrlich habe ich mir auch angeschaut, ob es m\u00f6glich ist, Unison mit dem ocaml native code compiler zu kompilieren (ocaml erzeugt standardm\u00e4ssig nur Bytecode, der dann interpretiert wird). Dadurch w\u00fcrde Unison schneller laufen und auch die Abh\u00e4ngigkeit vom ocaml.ipkg w\u00fcrde dadurch verschwinden. <\/p>\n<p>Leider <a href=\"http:\/\/www.mail-archive.com\/debian-ocaml-maint@lists.debian.org\/msg17912.html\">fehlt der Native Code Compiler<\/a> f\u00fcr die ARM Plattform. Der Maintainer der Debian ocaml Pakete hat mir best\u00e4tigt, dass sich das auch in den aktuellen Debian Paketen noch nicht ge\u00e4ndert 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 <a href=\"http:\/\/caml.inria.fr\/mantis\/view.php?id=3746\">Bug Report<\/a> beschrieben. Nachdem der Fehler schon aus dem Jahr 2005 stammt, habe ich wenig Hoffnung, dass sich da seitdem viel getan hat.<\/p>\n<h3>Fazit<\/h3>\n<p>Ich konnte problemlos ein Debian Paket f\u00fcr die aktuelle Unison Version bauen. F\u00fcr 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\u00fcrhlich testen, ob das nun  auch wirklich funktioniert&#8230;<\/p>\n<p>Leider war es nicht m\u00f6glich, die native Version f\u00fcr die Disk Station zu bauen. Dies wird auch erst m\u00f6glich sein, wenn ocaml daf\u00fcr angepasst wurde. Manchmal hat es doch Nachteile, wenn man Software in der exotischten Sprache, die man finden konnte, schreibt&#8230;<\/p>\n<h4>Update 09.02.2009<\/h4>\n<p>Leider funktioniert die Synchronisation des \u00c4nderungsdatums 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.<\/p>\n<blockquote><p>\nroot@frodo:\/space\/shares\/scratch# unison -times -confirmbigdeletes=false -prefer=newer -batch -contactquietly -group -owner \/space\/shares\/scratch ssh:\/\/space.~~~~~~~~~\/\/volume1\/scratch<br \/>\nLooking for changes<br \/>\n  Waiting for changes from server<br \/>\nReconciling changes<br \/>\n         < ---- new file   .DS_Store  \nlocal        : absent\nspace        : new file           modified on 1901-12-13 at 21:45:52  size 6148      rwxrwxrwx user=family group=users\nPropagating updates\nUNISON 2.27.57 started propagating changes at 20:02:11 on 08 Feb 2009\n[BGN] Copying .DS_Store from \/\/space\/\/volume1\/scratch to \/space\/shares\/scratch\nFailed: 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\n100%  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\nUNISON 2.27.57 finished propagating changes at 20:02:11 on 08 Feb 2009\nSaving synchronizer state\nSynchronization incomplete  (0 items transferred, 0 skipped, 1 failure)\n  failed: .DS_Store\n<\/p><\/blockquote>\n<h4>Update 19.03.2009<\/h4>\n<p>In der Zwischenzeit hat sich doch ein ziemlich umfangreiches Repository angesammelt. Die Pakete enthalten meist nur die interpretierten Versionen, da es f\u00fcr die jeweiligen Plattformen keinen native code Compiler gibt. Bisher konnte ich aber keine Performanceprobleme feststellen.<\/p>\n<ul>\n<li><a href=\"http:\/\/www.tupperclub.de\/blog\/wp-content\/uploads\/2009\/02\/unison_22757-1_powerpc.ipk\">Unison 2.27.57 PowerPC f\u00fcr die DS-108j<\/a> (Vielen Dank,  Douglas!)<\/li>\n<li><a href=\"http:\/\/www.tupperclub.de\/blog\/wp-content\/uploads\/2009\/02\/unison_2.27.57_arm.ipk\">Unison 2.27.57 ARM f\u00fcr die DS107+<\/a><\/li>\n<li><a href=\"http:\/\/www.tupperclub.de\/blog\/wp-content\/uploads\/2009\/02\/unison_2.27.57_powerpc.ipk\">Unison 2.27.57 PowerPC f\u00fcr die DS209+<\/a><\/li>\n<li><a href=\"http:\/\/www.tupperclub.de\/blog\/wp-content\/uploads\/2009\/02\/unison_2.27.57_i386.deb\">Unison 2.27.57 f\u00fcr Ubuntu 7.10, x86<\/a><\/li>\n<\/ul>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Wer kennt das Problem nicht: Man hat Verzeichnisse, die auf verschiedenen Rechnern ge\u00e4ndert werden, und trotzdem m\u00f6chte man einen konsistenten Stand der Daten haben. Normalerweise w\u00fcrde ich f\u00fcr diese Art von Problemen mein Universaltool rsync z\u00fccken, aber das synchronisiert nur in eine Richtung. Eine Suche mit Google ergibt, dass es genau ein Werkzeug f\u00fcr das [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-535","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=535"}],"version-history":[{"count":4,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/535\/revisions"}],"predecessor-version":[{"id":2172,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/535\/revisions\/2172"}],"wp:attachment":[{"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tupperclub.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}