Aujourd’hui, je laisse le clavier à Cédric pour contribuer. Voila un bon article, bien expliqué, qui permet de résoudre avec linux un problème courant. Merci Cédric!

Philippe

J’ai depuis quelques temps un problème très simple : un ordinateur fixe (sous Ubuntu) et un portable (Sous Windows XP), avec un certain nombre de répertoires dupliqués. Comme ma femme et moi même modifions tous les deux des fichiers dans ces répertoires, il est très difficile de savoir lesquels sont les plus récents.

Il existe plusieurs logiciels, mais aucun ne me convenait vraiment:

  • RSync n’est pas adapté puisqu’il permet uniquement de faire une sauvegarde, pas une synchronisation bi-directionnelle.
  • Le porte-document de Window fonctionne sur le principe, mais pas en pratique: il faut monter un disque sur le réseau pour le partager, la gestion des droits est une horreur (au final on ne peut plus accéder à ses propres fichiers !), et de toute façon au dessus de 500-1000 fichiers, c’est tellement lent que c’est inutilisable.
  • J’utilisais Allway Sync auparavant  qui fonctionne bien lorsque les deux systèmes sont sous Windows. Avec un PC Linux aussi, il suffit d’installer un serveur FTP pour donner l’accès aux fichier. Malheureusement l’interface graphique n’est vraiment pas agréable, et avec le protocole FTP, les accents passent mal, certaines modifications ne sont pas bien vues.
  • D’autres logiciels existent sous Windows ou sous Linux, mais rarement pour les deux.

Et dernièrement, je suis enfin tombé sur celui que j’attendais, qui a exactement toutes les options que j’attendais: il s’appelle Unison.

Principe de fonctionnement

Voici ce que dit la documentation:

Unison is a file-synchronization tool for Unix and Windows. It allows two replicas of a collection of files and directories to be stored on different hosts (or different disks on the same host), modified separately, and then brought up to date by propagating the changes in each replica to the other.

Il y a toute une liste de possibilités très intéressantes:

  • Tourne sous Windows, Linux, Solaris, et est cross-platform: on peut synchroniser un PC Windows et un PC linux.
  • Il peut gérer des modifications sur deux connections ou plus, et l’outils détectera quels changements sont les plus récents ou s’il y a un conflit.
  • Tourne totalement en user-mode
  • Unison se connecte à travers des protocoles standards, en particulier SSH. Donc il suffit d’avoir configuré une connection SSH, sur un réseau local ou sur Internet. Il est bien adapté aux connections lentes vu que seuls les changements sont synchronisés (utilise RSync).
  • C’est possible de le configurer pour garder un historique: quand un fichier est modifié ou effacé, il est possible de garder un nombre prévu de versions des fichiers.
  • Résistant aux erreurs: si la connection est interrompue ou le programme est fermé brutalement, la base de donnée restera utilisable.
  • Les fichiers à synchroniser sont très configurables: par répertoire, avec possibilité d’ignorer certains fichiers ou dossier (Même en regex).
  • Et en plus: il est gratuit et open-source !

Techniquement, voici comment il fonctionne en quelques points:

  • Il existe une version console et une GUI (qui utilise GTK). Le programme est écrit en Caml, ce qui, il est vrai, n’est pas très commun !
  • Le programme tourne sur le client, mais la version console est également lancée sur le serveur pour la synchronisation (en lançant la commande à travers SSH, donc pas la peine qu’il tourne en permanence). La contrainte, c’est qu’il faut avoir exactement la même révision des 2 côtés, ce qui n’est pas le plus simple.
  • Il y a un concept de version-control (Style SVN ou GIT) automatique, géré sur le client et le serveur (spécifique à chaque connection), qui permet de savoir quels fichiers sont modifiés ou effacés. La liste des modifications est calculée en parallèle sur le client et sur le serveur, puis tout est envoyé au client.
  • Les fichiers à synchroniser sont reportés soit sur la console, soit sur l’interface graphique. Cette interface est en plus très claire et pratique à utiliser.
  • Les nombreuses options peuvent soit être mises sur la ligne de commande, soit dans un fichier d’options. Il est d’ailleurs même possible d’avoir plusieurs profils pour synchroniser différent répertoires avec différents hôtes, ou avec des options différentes (par exemple un profil en batch qui synchronise tout mais ignore les conflits, un autre pour le mode interactif).

La GUI est très simple mais très fonctionnelle. On comprend très facilement quel changement a été identifié (Le client, donc Fixe à gauche, le serveur à droite). En cliquant sur une ligne, on peut voir sur quoi Unison se base pour indiquer un changement, et aussi résoudre un conflit ou changer la direction de synchronisation.

Comment je veux l’utiliser

Je suis l’heureux propriétaire d’un Dockstar, comme Philippe, qui l’a présenté dans l’article Seagate Dockstar installation et amélioration. Le mien utilise un disque dur de 500GB divisé en 2 partitions : une pour le file-system, une autre en NTFS pour ajouter des fichiers.

L’idée est de se servir du Dockstar et de la partition NTFS comme serveur central de sauvegarde, et que les deux ordinateurs (fixe sous Ubuntu et Portable sous Windows XP) se connectent dessus et synchronisent les fichiers. Il suffit donc d’un serveur SSH sur le Dockstar qui devient accessible des 2 autres ordinateurs.

Synchroniser Linux avec le dockstar

Installation depuis les dépôts

Voici la première étape, celle qui doit être la plus simple vu qu’Unison est prévu avant tout pour Linux, et que à la fois GTK et SSH sont installés de base.

Unison est normalement très simple à installer vu qu’il se trouve dans les dépôts. Il faut l’installer à la fois sur le client (Ubuntu) et le serveur (Dockstar). En plus Unison est disponible sur ARM pour le Dockstar.

sudo apt-get install unison

Mais la première difficulté vient de la version du logiciel, car je rappelle qu’elles doivent strictement être les même sur le client et sur le serveur. Dans tous les cas on se rend vite compte du problème:

cedric@Fixe:~$ unison
Contacting server...
Fatal error: Received unexpected header from the server: expected "Unison 2.27.52\n" but
received "Unison 2.32\n0000000052", which differs at "Unison 2.27".

Cela vient du fait que j’utilise une Debian Squeeze (Testing) sur le Dockstar, qui a des paquets plus récents que la version d’Ubuntu que j’utilise.

La première solution consiste à mettre à jour la version utilisée par Ubuntu. Et par facilité, à directement aller chercher le paquet Debian, qui fonctionne bien sous Ubuntu:

wget http://ftp.de.debian.org/debian/pool/main/u/unison/unison_2.32.52-1_i386.deb
dpkg -i unison_2.32.52-1_i386.deb

Et là, tout fonctionne très bien.

Sauf que je m’apercevrai plus tard en essayant de synchroniser avec Windows que le support d’Unicode n’est présent dans Unison qu’à partir de la version 2.40. Sans ce support, tous les fichiers dont le nom contient des accents ne sont pas correctement traités, et Unison détecte ces fichiers sur le client et le serveur comme étant des fichiers différent. Donc en synchronisant Windows-Linux, à avoir tous les fichiers en double (l’un avec le nom correct, l’autre avec les caractères accentués changés) !

Donc dans mon cas, j’étais obligé d’utiliser une version au moins 2.40 sur les 3 ordinateurs. La où ça se complique un peu, c’est qu’il faut les compiler vu qu’à ce moment, il ne semble pas y avoir de binaire disponible pour cette version, en tous cas sous ARM.

Compilations des sources

Compiler n’est pas tout à fait évident vu que Unison est écrit en Caml. Ca nécessite donc d’installer quelques paquets supplémentaires s’ils ne sont pas déjà présent. Sur le Dockstar, le paquet ocaml-native-compilers n’est pas disponible pour ARM. Il contient une version du compilateur OCaml optimisé. Mais le makefile permet de s’en passer en ajoutant NATIVE=false à la commande.

Voici donc les commandes que j’ai utilisé pour le Dockstar (en mode texte seulement):

apt-get install ocaml tags
wget http://www.seas.upenn.edu/~bcpierce/unison/download/releases/unison-2.40.61/unison-2.40.61.tar.gz
tar -xvzf unison-2.40.61.tar.gz
cd unison-2.40.61
make ./mkProjectInfo
make UISTYLE=text NATIVE=false
cp unison ~/tools/unison-2.40.61

Il y a quelques messages d’erreurs mais qui sont ignorés et ne posent pas de problème. Il est possible de mettre Unison dans /usr/bin et écraser l’ancien.

Pour le Fixe, je voulais la version avec Gtk. Il suffit donc normalement de remplacer UISTYLE=text par UISTYLE=gtk2 sur les lignes précédentes, mais là il y a une erreur dans les librairies GTK qui annule la compilation. Mais j’ai réussi à trouver un paquet tout fait:

wget https://launchpad.net/~groetschel/+archive/ppa/+files/unison-gtk_2.40.16-1ubuntu1%7Eppa2_i386.deb
sudo dpkg -i unison-gtk_2.40.16-1ubuntu1~ppa2_i386.deb

Et là voilà, il y a maintenant les mêmes versions sur les 2 !

Créer une clé pour SSH

Cette manipulation est optionnelle, mais je ne voulais pas à avoir à entrer de mot de passe pour initialiser la connexion SSH, et ainsi avoir la possibilité de lancer une synchronisation automatique en batch. De même en mode interactif, l’outil se connecte directement sans demander de mot de passe.

Il faut créer des clés, en principe sur le client (le Fixe). J’ai choisi pour générer la clé de la copier dans ~/.ssh/dockstar, et de ne pas mettre de mot de passe (en laissant vide). C’est possible de mettre un mot de passe, mais dans ce cas il faudra utiliser l’agent SSH pour stocker les clés:

ssh-keygen -t dsa
scp ~/.ssh/dockstar.pub cedric@dockstar
rm ~/.ssh/dockstar.pub
chmod og-rwx ~/.ssh/dockstar

Et sur le Dockstar:

cat .ssh/dockstar.pub >> .ssh/authorized_keys
rm .ssh/dockstar.pub

Créer un fichier de configuration

Il est maintenant possible de lancer unison-gtk sur le fixe pour commencer la synchronisation, et la GUI demandera le Root, c’est à dire le répertoire à synchroniser (qui peut être différent sur le client et sur le serveur). On peut ensuite sélectionner des répertoires ou fichiers à ignorer avant de synchroniser.

Mais il est aussi possible d’utiliser un fichier de configuration sur le client, qui permet d’utiliser facilement un bon nombre d’options. A noter que ces options peuvent aussi être mises sur la ligne de commande.

Il faut savoir qu’Unison a un concept de Root et Path:

  • Root définit le répertoire principal à synchroniser, typiquement la racine d’une partition. On doit en définir un pour le client et un pour le serveur, mais il n’est pas possible d’en avoir plusieurs. Sinon il faut utiliser plusieurs profils. Par défaut, tous les sous-répertoire du Root sont synchronisés, sauf si des Path sont définis.
  • Path définit un sous-répertoire de Root. Un Path doit être identique pour le client et pour le serveur, relativement au Root. L’avantage est que l’on peut définir plusieurs Path. Donc une utilisation courante consiste à définir comme Root la racine d’une partition, et comme Path les différent répertoires à synchroniser sur cette partition.

En plus des Root et Path, il y a ensuite la possibilité d’ajouter des Ignore, c’est-à-dire des répertoires ou fichiers à ignorer.

Voici le fichier de configuration que j’utilise sur le Fixe, enregistré sous le nom de ~/.unison/default.prf (Créé dès que l’on lance la GUI):

# Unison preferences file
servercmd = /home/cedric/tools/unison-2.40.61
 
# Root of the synchronization
root = /media/Donnees
root = ssh://cedric@dockstar//media/data/backup    # // are required !!
 
# Paths to synchronize
path = Appartement
path = Cedric
path = Lettres
path = Ma musique
path = Sophie
 
ignore = Name Thumb.db
ignore = Name *~*
 
# Options
perms = 0
dontchmod = true
 
# Merge options
merge = Name * -> meld CURRENT1 CURRENT2
diff = meld CURRENT1 CURRENT2
confirmmerge = true

Certains de ces paramètres sont optionnels. Par exemple je spécifie servercmd parce que je n’ai pas mis le binaire dans /usr/bin sur le Dockstar. Il est possible pour les options ignore de spécifier des fichier (Name), chemins (Path) ou même des Regexps (Regex).

Les options perms et dontchmod sont nécessaires parce que j’utilise une partition NTFS, qui ne gère pas les droits. Donc inutile d’essayer des les changer, et il ne faut pas non plus considérer des différences de permission comme un changement.

Les dernières options merge et diff permettent de lancer un outil approprié pour voir les différences sur les fichiers texte, et éventuellement de les merger. L’option confirmmerge n’autorise pas Unison à faire un merge automatiquement.

En lançant la GUI, Unison demande quel fichier de configuration utiliser. Mais on peut aussi le spécifier par défaut en utilisant:

unison-gtk default

Synchroniser Windows avec le dockstar

Installer Unison pour Windows

C’est la partie qui promettait d’être compliquée, en effet. Windows, par défaut, n’a pas de support de GTK ni de SSH donc il faut tout ajouter. Mais finalement tout se passe plutôt bien.

Comme dit précédemment, un des problèmes que j’ai rencontré, c’est que les versions antérieures à la 2.40 ne supportent pas l’Unicode. Donc s’il y a des fichiers dont les noms contiennent des accents, ils ne sont pas reportés correctement depuis le serveur, et Unison voit donc 2 fichiers différents. Comme enlever tous les accents des noms de fichiers n’est pas une option, et qu’avoir des doublons à chaque fois n’a pas de sens, il a fallu trouver une autre solution. Après pas mal de recherche, j’ai découvert qu’il fallait utiliser une version plus récente.

Heureusement il existe une version compilée pour Windows sur cette page:

2010.10.15-Esup-Unison-Unison_GTK_2.40.61.zip

Ce fichier Zip ne contient que l’exécutable. Donc il faut aussi récupérer une version de GTK pour Windows si elle n’est pas déjà installée. Il existe de nombreuses versions sur Internet, j’ai choisi le zip de cette page qui contient toutes les librairies:

gtk+-bundle_2.22.1-20101227_win32.zip

Plutôt que de l’installer et ajouter le chemin dans le PATH, j’ai préféré:

  • Extraire le zip GTK quelque part dans C:\Program Files\ et le renommer Unison
  • Copier le binaire d’Unison dans le répertoire GTK\bin de la librairie GTK. De cette façon Unison trouvera la DLL GTK sans avoir besoin de changer le PATH.
  • Créer un lien dans le menu Démarrer vers l’exécutable Unison.

De cette façon, Unison se lance correctement.

Installer SSH pour Windows

Il y a plusieurs possibilités pour installer SSH sous Windows, mais la plupart ont plus ou moins besoin de Cygwin. Mais sinon la meilleure solution consiste à installer PuTTY, qui est un outil très complet. Il permet de se connecter en SSH au Dockstar sans aucun problème.

Pour utiliser une clé avec SSH comme sous Linux, il faut suivre les étapes suivantes:

  • Générer des clés publique et privée avec PuTTYgen. La procédure est simple.
  • Ensuite enregistrer la clé privée dockstar.ppk dans le répertoire GTK/bin créé précédemment.
  • Pour la clé publique, il faut l’ajouter dans le fichier authorized_keys du Dockstar (Voir pour Linux plus haut). Si la clé est créée sans mot de passe, PuTTY ne demandera plus de mot de passe pour initialiser la connexion.

Pour utiliser PuTTY avec cette clé, il faut indiquer le fichier dans les options Connection / SSH / Auth, et le username dans Connection / Data.

Unison a besoin d’une interface non-graphique pour la connexion. Un exécutable appelé PLink est fourni avec PuTTY et peut être utilisé. Mais il y a aussi un programme appelé Unison-SSH, qui est simplement un wrapper autour de PLink qui peut être téléchargé sur cette page:
ssh.exe
Il faut copier ce programme dans le même répertoire qu’Unison.

Le fichier de configuration

Comme pour Linux, il vaut mieux créer un fichier de configuration, qui existe une fois qu’Unison a été lancé:

C:\Documents and Settings\\default.prf

Voici le contenu de mon fichier:

# Unison preferences file
servercmd = /home/cedric/tools/unison-2.40.61 
 
# Paths
root = D:\
root = ssh://cedric@192.168.0.13//media/data/backup # // are required !!
 
path = Appartement
path = Lettres
path = Sophie 
 
ignore = Name Thumbs.db
ignore = Path {Sophie/Blog}
ignore = Path {Sophie/Mistral/Internet}
ignore = Name *~* 
 
# SSH
#sshcmd = C:\Program Files\PuTTY\plink.exe
sshargs = -i dockstar.ppk 
 
# No permissions on NTFS
perms = 0
dontchmod = true

Il ressemble beaucoup au fichier utilisé sous Linux. L’option sshcmd peut être spécifiée si le programme SSH ne peut pas être trouvé dans le PATH ou répertoire courant, ou s’il ne s’appelle pas ssh.exe. L’option sshargs indique le fichier de clé à utiliser.

Une fois tout ça configuré, il suffit de lancer Unison, en ajoutant éventuellement le paramètre default dans la ligne de commande.

Bonne synchronisation !

Seagate dockstar installation et amélioration