Synchronisation de fichiers avec Unison

0 – Introduction 

Unison est un logiciel de synchronisation bidirectionnelle. Il fonctionne principalement sur SSH mais pas que.

site : http://www.cis.upenn.edu/~bcpierce/unison/

Il se décline en deux programmes compatibles toutes plateformes: un client/serveur texte et l’interface graphique.

Vu qu’il est multi-plateformes et bidirectionnel, Unison est souvent utilisé pour synchroniser un poste de travail Windows/Mac avec une machine Linux.

L’avantage par rapport à rsync est donc que ce n’est pas une copie d’un dossier vers un autre, mais bien une synchronisation entre des dossiers distants (ou locaux).

Sur un serveur, le client texte et les nombreuses options permettent d’automatiser entièrement une synchro, sans aucune intervention humaine. La magie linux fait même que cette synchro peut être lancée en continue.

 

Dans ce billet, je vais vous parler de la mise en place de synchronisations et de leur automatisation sur un serveur Linux et aussi sous Windows pour un poste de travail.

Unison me permet les synchronisations locales de tous mes documents/photos/musiques, de disque interne à disque interne et vers ma freebox. Je synchronise également tout ca en temps réel avec le client ownCloud vers un serveur (c’est temporaire car comme Nicolas l’explique dans son billet https://mespotesgeek.fr/owncloud-bittorrent-sync-clone-de-dropbox/, le client owncloud n’est pas encore mûr, et c’est peu dire..).

Infra sauvegarde

 Ca fait longtemps que je cherchais un logiciel qui faisait des synchro que je pouvais aussi lancer en graphique et qui fonctionne bien sous Windows … sans pub/limitation.

Je m’en sers donc tous les jours sur ma machine pour du local mais aussi sur certains serveurs pour synchroniser des dossiers en continue.

 

I – Installation

Rien de plus simple : le paquet s’appelle ‘unison’ sur quasiment toutes les platesformes (rpmfusion pour les RedHat-like). Il est également disponible pour Windows à cette adresse : http://www.commentcamarche.net/download/telecharger-236-unison , après avoir installé la librairie GTK+ disponible ici :  http://sourceforge.net/projects/gtk-win/

En mode graphique, rien de bien compliqué, il suffit de se laisser guider par l’assistant. Pour peaufiner sa configuration aux petits oignons, il faudra éditer 2,3 lignes dans un fichier et ca sera réglé.

Le paquet est à installer sur toutes les machines qu’il faudra synchroniser. Cependant, il n’y a toujours qu’un seul chef d’orchestre, la seconde machine étant passive. Les logs et les profils de synchronisations se trouvent donc sur une seule machine.

 

II – Création d’un profil

Unison fonctionne par profils. Un fichier ‘.prf’ regroupe la source, la destination, le protocole de connexion (pour des sites distants) et la politique de synchronisation. Pour avoir deux dossiers synchronisés, on choisira par exemple que la modification la plus récente est prioritaire. On peut également spécifier qu’en cas de conflit, une source est toujours prioritaire sur l’autre, etc.

Le profil étant lié à un utilisateur, il doit se trouver dans le dossier personnel de ce dernier. C’est toujours dans $USERDIR/.unison, que ce soit sous Windows ou sous Linux.

Sous Linux, on le retrouvera donc pour root dans /root/.unison

Voici un exemple de fichier pour une synchronisation bidirectionnelle entre deux serveurs Linux :

 

Voici un exemple de fichier pour une sauvegarde de dossiers locaux sous Windows :

 

Pour info, voici le contenu de mon common-settings.conf :

 

III – Lancement d’un profil

Rien de plus simple sous Windows, il suffit de lancer l’interface graphique et de choisir le profil à lancer. Un assistant permet de créer le profil si on veut.

Sur un serveur Linux, on change d’utilisateur pour être celui qui effectue les synchronisations et on exécute la commande suivante :

Remplacer home.www par le nom de votre profil. Le fichier associé à ce profil est de même nom, avec l’extention ‘.prf’ en plus.

 

IV – Automatisation sous Linux

C’est un cas de vérité générale qu’on va appliquer à un script bash pour Unison, mais qui s’applique à n’importe quel script/démon.

J’ai fais un script, rien de sorcier, qui lance la commande précédente. Je vérifie simplement avant qu’une autre exécution de Unison n’est pas en cours. Je marque également une pause à la fin, pour pas que ca pompe trop de ressources à essayer de l’exécuter en continue.

Pour mes tests, je fais ça en root et j’ai échangé mes clés publiques entre mes serveurs. Chacun se connecte donc en SSH sur l’autre sans passphrase. A éviter en environnement de production!

Notre script est le suivant :

 

Je le rend exécutable et je vais le faire tourner en continue :

On recharge sa table init avec :

Voila, avec le respawn, le script va être lancé en continue et donc, la synchronisation sera non-stop.
On peut vérifier en regardant les logs les détails de synchronisation (Attention, j’ai du créer le dossier ‘/var/log/unison’). Il n’y a pas de log tant qu’il ne se passe rien ! Vérifier aussi que votre script tourne (quand il ne synchronise pas, il dort) :

On peut vérifier simplement :
On crée un fichier sur la machineA :

Il est créé sur la machine B :

Je le supprime sur la machineB :

Il est supprimé sur la machineA :

 

V – Sous Windows

Là, ça se complique un tanquinet.

Il va falloir créer un script batch, fournir le chemin complet vers l’exécutable texte d’Unison, optimiser ses profils pour Windows et planifier les exécutions de ce script.

On déplace les exécutables Unison dans C:\Program Files (x86)\Unison\ (qu’on aura prit soin de créer) et on renomme Unison text en « unison.exe ».

On édite les variables d’environnement de Windows pour que quand on tape « unison » en console, il reconnaisse la commande :

Clic droit sur le poste de travail → propriétés → paramètres systèmes avancés → onglet « paramètres systèmes avancés » → en bas on clic sur « variables d’environnement »

Changement des variables d'environnement

Là, on modifie la variable système Path en ajoutant à la fin (tel quel) :

On ouvre un terminal pour vérifier :
On appuie sur <windows>+ r
On tape ‘cmd‘,

On arrive sur notre petit terminal crosoft et on tape :

Exemple :

Unison en ligne de commande windows

On écrit un petit script BATCH qui va lancer tous nos profils au démarrage et qu’on enregistre pour le moment sur le bureau (j’ai appelé le miens unison.bat) :

Maintenant, on le met dans les programmes exécutés à l’ouverture de session.

Dans « tous les programmes », on clique droit « Démarrage » -> ouvrir :

Ajouter un script batch à l'ouverture de session

Voila, vos fichiers seront synchronisés à chaque ouverture de session.
Si vous double cliquez votre script unison.bat, la synchro va se faire sous vos yeux.
 

Sous Windows, j’ai choisi de synchroniser mes fichiers qu’au boot, pour pas exploser les perfs et qu’il y ait des problèmes sur des fichiers édités ou quoi. C’est mon choix, faites le vôtre !

Vincent

2 thoughts on “Synchronisation de fichiers avec Unison”

  1. Doo dit :

    Nice, et le côté bi-directionnel fonctionne bien ? Parce-que j’ai cherché à faire de la réplication de ce type fut un temps, et en fait … ça marchait juste mal 🙁
    T’as testé d’appliquer des limitations de bande passante ?

    1. Vincent Gallissot dit :

      Le côté bi-directionnel est au top : dernière modification prend le dessus et en cas de conflit tu peux privilégier une source. J’ai encore vu aucun cas où ça s’était mal passé !
      J’ai pas testé d’appliquer des limites de BP. D’après la doc tu peux pas gérer directement ce paramètre, il faudrait passer par la directive maxthreads qui te permettra juste de ralentir le traitement des données, mais avec un processeur digne de ce nom sur un SSD … Le mieux sera une limitation côté firewall directement sur la machine ou sur le serveur pour limiter la bande passante. Avec IPTables, on peut facilement limiter le débit entrant du port SSH pour une certaine IP par exemple.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *