Unison

Unison est un logiciel de synchronisation, semblable à rsync.

Rsync est davantage destiné à réaliser des sauvegardes de routine. À noter que rsync peut prendre le rôle d'Unison et vice-versa, mais chacun a ses avantages et ses inconvénients.

Unison reste l'outil idéal pour maintenir de façon identique le contenu de plusieurs répertoires différents, répertoires qui peuvent évoluer différemment entre chaque établissement d'une synchronisation.

Unison est multi-plateforme et peut fonctionner à travers SSH RSH ou les sockets. Avec lui, vous pourrez réaliser des synchronisations entre des répertoires sous Windows, Mac et Linux.

Si un fichier est créé, supprimé ou s'il a été modifié dans l'un des deux répertoires, la modification sera appliquée sur l'autre.

Il existe deux façons d'utiliser Unison :

  • soit par le biais de l'interface graphique avec unison-gtk ;
  • soit en console grâce à la commande unison.

Installez le paquet unison. Pour l'interface graphique, installez également unison-gtk.

Pour que la synchronisation fonctionne, il faut que la version d'Unison sur les deux systèmes concernés soit quasi-identique (les deux premiers nombres de la version doivent être les mêmes). Si vous avez besoin d'une version antérieure d'Unison pour des questions de compatibilité (synchronisation entre machines distantes), vous trouverez des (très) anciennes versions précompilées sur le site d'Unison. Vous pouvez également recompiler Unison sur un des deux systèmes.

Lancez l'application comme indiqué ici ou via le terminal comme indiqué plus bas

Lors du premier lancement d'Unison, un profil est créé. La première étape est de lui indiquer les deux répertoires destinés à la synchronisation.

Notion de profil

Le profil est un fichier de configuration pour une synchronisation donnée, contenant les répertoires à synchroniser ainsi que des options.

Unison appliquera ce profil à chaque appel du programme.

Lors du premier lancement, Unison demande un premier répertoire local (c'est-à-dire sur la machine où est installé Unison). Puis un autre répertoire, soit :

  • local (idéal pour clé USB, disque dur externe…)
  • distant (SSH, RSH et Socket)

Cet assistant a alors créé un profil.

Unison établit une liste entre le répertoire 1 (celui de gauche sur le tableau) et le répertoire 2 (celui de droite).

En fonction de ce qu'il trouve comme changements entre les 2 répertoires il proposera de faire une action.

L'icône Go applique ces changements.

Limite de l'interface graphique

On peut noter l'absence de traduction en français.

Astuce : un profil est enregistré dans votre répertoire personnel dans un dossier .unison, sous forme d'un fichier .prf. Vous pouvez donc éditer vos profils à votre guise. Voir la section Peaufiner les profils.

Les commandes sont assez simples :

unison

⇒ Cette commande lance Unison avec les données du profil par défaut (default.prf).

unison monprofil

⇒ lance Unison avec les données du fichier monprofil.prf.

unison -option

⇒ lance Unison avec les options indiquées en paramètres (détaillées plus bas. Voir les options).

unison chemin1 chemin2 -option

⇒ lance la synchronisation entre chemin1 et chemin2 avec les options : par exemple -times pour conserver la date originale !

Peaufiner les profils

Unison enregistre ses profils dans le dossier .unison de votre répertoire personnel. Tout d'abord, si ce dossier n'existe pas encore, créez-le :

mkdir ~/.unison

Pour modifier le profil principal, il suffit d'éditer le fichier ~/.unison/default.prf

Un fichier de profil Unison respecte un certain ordre :

  • en premier, le répertoire local :
root=/home/moncompte/cheminquiseraanalyseenpremier/
  • puis le répertoire distant :
root=/chemindelautrecheminasynchroniser/
  • éventuellement les sous-répertoires distants à sélectionner, si on ne veut pas synchroniser tout le dossier.
path=./seulementCeSousRepertoire/
path=./etCeluiCi/
Ces sous-répertoires doivent être relatifs au répertoire principal (root)
  • enfin, les options.

Les options

Les options peuvent être utilisées :
  • soit dans les profils, sous la forme : option = true ou option = valeur;
  • soit en ligne de commande comme paramètres : unison -option.

Voici quelques options :

  • Limiter la synchronisation à certains dossiers ou types de fichiers :
path=./dossierASynchroniser/
path=./musique/*.mp3
# Le joker est encore une "nouvelle fonctionnalité expérimentale" pour les *path* (cf. https://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html#paths) et ne fonctionne pas chez certains utilisateurs
  • Rajouter une liste de fichiers ou répertoires à ignorer :
ignore= Path dossieraignorer/
ignore= Name *.odt
  • Sauvegarde des échanges dans un répertoire :
backupdir=/chemin

Par défaut, Unison fait 2 sauvegardes

  • Valider les propositions présentées :
auto=true
  • Enregistrer un journal pour les transferts :
log=true
logfile=/home/moncompte/.unison/log
  • automatiser toutes les synchronisations sans même une seule confirmation :
batch=true
  • Pour les médias amovibles :
mountpoint=docs/fichier.txt
  • Silence :
silent=true
  • Booster Windows :
fastcheck=true
  • Ne pas tenir compte des permissions :
perms=0
  • Synchronisation des dates :
times=true
  • Conserver la version la plus récente du ficher (à utiliser avec times=true) :
force=newer
  • Conserver le propriétaire et le groupe propriétaire :
owner = true
group = true

Exemple simple de profil

#j'indique uniquement le répertoire parent
root=/home/login/
#le chemin du périphérique (à condition que ce soit toujours le même)
root=/media/keyaudio

#puis les sous-répertoires
path=documents
path=musique/podcasts

Avec ce profil, Unison ne synchronisera que les répertoires documents et musique/podcasts de keyaudio.

L'option mountpoint est fortement conseillée pour les médias amovibles. Elle permet à Unison de vérifier que la clé USB est bien présente et donc d'éviter une suppression successive de fichiers en cas de démontage trop rapide du support amovible (voir synchroniser_les_peripheriques_usb et la_securite_avec_l_usb).

Pour la synchronisation de dossiers distants (avec SSH, par exemple), voir la section synchroniser_des_dossiers_distants, ci-dessous

Synchroniser les périphériques USB

Problèmes de droits

Dans le cas où vous désirez établir une synchronisation avec une clé USB, un disque dur externe, une carte SD, etc, tout périphérique en FAT ou FAT32, vous risquez d'être embêté.

En effet, ces systèmes de fichiers ne gèrent pas les droits et les notions de propriétaires.

Par défaut, Ubuntu donne des droits root temporaires lors du montage du périphérique.

Il existe plusieurs moyens d'éviter ce problème :

  • La méthode la plus simple (elle ne touche pas aux fichiers de montage du périphérique) consiste à ajouter la ligne "perms=0" dans le fichier du profil qui se trouve dans le dossier ~/.unison/ (fichier en extension .prf). Ainsi, Unison ne se préoccupe pas des permissions lors de la synchronisation. Voir les options. Si elle ne fonctionne pas, où si elle ne vous convient pas (par exemple si vous avez plusieurs profils et que vous ne souhaitez pas modifier les profils un à un), les modifications ci-dessous devraient fonctionner.
  • reformater le périphérique USB (en ext2, ext3 ou ext4 par exemple). Mais il ne sera pas reconnaissable par les autres systèmes d'exploitation, ni par vos appareils embarqués (appareil photo, PDA, etc.).
  • monter le périphérique manuellement en indiquant le propriétaire, cela à chaque fois que l'on désire l'utiliser :
mount -o uid=1000 ...
  • Indiquer le montage de votre clé dans le fichier /etc/fstab, avec une entrée de la forme :
/dev/sda1 /mnt/removable vfat user,rw,noauto 0 0
Si à l'utilisation vous avez encore des retours de problèmes de permissions sur les fichiers, il peut être utile de configurer votre profil pour les synchronisations avec votre support amovible en FAT32, afin de ne pas prêter attention aux droits à l'aide de l'option perms = 0. Voir les options.

Différencier plusieurs périphériques USB

Imaginez que vous ayez plusieurs périphériques USB, comme une clé USB, un disque dur externe, un lecteur de carte USB, etc. Votre disque dur externe peut prendre ainsi comme point de montage soit sda1, sdb1, etc. En fonction de qui se branche en premier ! Pour éviter cela il faut utiliser l'UUID (plus de renseignements sur uuid_et_label ou sur comment renommer un disque).

Pour connaître le numéro UUID de votre périphérique USB, taper dans un terminal :

ls -l /dev/disk/by-uuid/

Nous noterons par la suite uuid_du_peripherique, l'UUID correspondant à notre périphérique.

Puis créer un point de montage fixe :

sudo mkdir /media/sync

Puis éditer le fichier /etc/fstab et indiquez lui ce point de montage fixe (ici, sync) en ajoutant la ligne correspondante :

UUID=uuid_du_peripherique /media/sync vfat user,rw,exec,noauto,iocharset=utf8,codepage=850 0 0

et voilà, plus de soucis !

Une variante est possible avec le label de votre periphérique USB. Dans fstab, à la place de UUID=uuid_du_peripherique, écrivez LABEL=nomdulabel.

La sécurité avec l'USB

Le risque avec les médias amovibles, c'est qu'ils peuvent ne pas être présents. Pour éviter ce problème, il existe une option d'Unison qui permet de vérifier qu'un certain fichier soit accessible sur les deux répliques (les deux "root"). Il s'agit de la commande mountpoint. Il faut donc indiquer un fichier qui est présent sur les deux répliques, par exemple "mountpoint=docs/fichier.txt". Si le fichier n'est pas accessible sur l'un ou l'autre des périphériques (ou sur les deux), le processus sera interrompu.

Cette option existe depuis la version 2.17 d'Unison.

Lancer automatiquement Unison lors du branchement du périphérique

udev

La solution la plus logique serait d'utiliser udev qui gère nos périphériques USB (plus de renseignements sur la section exécuter_certains_programmes_selon_certains_événements de la documentation de udev).

Pour lancer un script à partir d'udev, il faut créer une règle, en créant un fichier : /etc/udev/rules.d/10-local.rules (nécéssite les droits d'administration).

FIXME À tester ! (attention, une règle erronée peut vous conduire au désastre)

Script sur la clé USB

Il faut autoriser le lancement des scripts en allant dans Système → Préférence → Périphériques et médias amovibles, onglet Stockage, puis cocher « Lancer automatiquement des programmes sur les nouveaux périphériques et médias ». Ensuite placer un simple script sur votre clé, la synchronisation s'exécutera lors de l'insertion de votre périphérique USB.

Synchroniser des dossiers distants

La synchronisation entre plusieurs dossiers distants est très facile avec Unison, il suffit de comprendre qu'il faut un Unison par machine, contrairement au cas "local".

Requis :

  • Un Unison par machine (Linux, Mac ou Windows);
  • Un service d'échange actif (ssh, rsh, sockets);
  • La même version d'Unison sur toutes les machines.

Le fait d'avoir un Unison par machine ne veut pas dire de tous les lancer en même temps ;) Il suffit d'en configurer un qui s'occupera de dialoguer avec l'autre, Il n'y a pas vraiment de notion client/serveur.

Synchroniser à travers ssh

La méthode est simple, installer Unison sur chaque machine.

Paquet apt://unison pour Ubuntu et http://alan.petitepomme.net/unison/index.html pour Windows(TM).

Je rappelle qu'il faut avoir la même version, et c'est le point délicat, en effet entre deux Ubuntu, pas de problèmes, par contre, lorsque vous utilisez plusieurs OS alors cela se complique.

Au 07/2009, la dernière version stable et commune est la 2.27.57.

La machine distante doit permettre un accès SSH. Pour cela, installez par exemple le paquet openssh-server.

Le chemin vers la machine distante (à définir dans le profil) sera sous la forme :

root=ssh://login@ma.machine//chemin/absolu/vers/dossier/
Dans le cas où le port de communication avec ssh n'est pas le port 22 par défaut, il convient de l'indiquer à Unison. Cela se fait à travers le paramètre sshargs à ajouter au profil. Exemple :
sshargs = -p 12345 -C

L'argument -C permet de compresser les données échangées pour faciliter l'échange, cet argument fiabilise le transfert mais accroît le temps de traitement (calcul de la compression).

Un autre exemple de profil

Voici un autre exemple de profil (réalisable aussi avec l'interface graphique) utilisant SSH :

#j'indique le premier répertoire à synchro
root = /home/moncompte/Documents
#j'indique le chemin du dossier distant
root = ssh://user@192.168.0.10//Docs

# Options pour booster Windows
fastcheck = true

# Options du journal
log = true
logfile = /home/simtris/.unison/logunison

#zap les permissions
perms = 0

#synchro des dates
times = true

Exemple de script si l'IP change souvent

Si l'adresse IP de vos ordinateurs change souvent, il est peut être pratique de faire un petit script demandant l'adresse IP de l'autre ordinateur et générant un profil automatiquement.

FILE="/home/ms/.unison/auto.prf"
echo "Entrez l'IP ou 0 pour utiliser la précédente"
echo -n ">"
read IP
if [ ! $IP = "0" ]
then
	echo "root=/home/ms/Documents/" > $FILE
	echo "root=ssh://ms@$IP//home/ms/Documents/" >> $FILE
	echo "path=prog" >> $FILE
	echo "path=unifr/semestre_5" >> $FILE
	echo "silent=true" >> $FILE
	echo "times=true" >> $FILE
	echo "auto=true" >> $FILE
fi
unison auto
echo ""
echo "Done"

Monter un partage au démarrage

Editer /etc/fstab afin de monter automatiquement un dossier partagé (ex: samba, Nfs) au démarrage :

sudo gedit /etc/fstab

Ajouter :

//ADRESSE_RESEAU/REPERTOIRE1 /media/REPERTOIRE2 smbfs password=LEPASSE,username=LUTILISATEUR 0 0

ou si vous avez des problèmes d'éncodage ou de droit :

//ADRESSE_RESEAU/REPERTOIRE1 /media/REPERTOIRE2 smbfs password=LEPASSE,username=LUTILISATEUR,iocharset=utf8,codepage=cp850,uid=1000 0 0

Remplacer :

  • ADRESSE_RESEAU par l'adresse réseau
  • REPERTOIRE1 par le répertoire sur le serveur
  • REPERTOIRE1 par le répertoire local
  • LEPASSE distant
  • LUTILISATEUR distant

Vous pouvez si vous le désirez changer /media par /mnt .

Problèmes avec l'option perms 0 depuis la 2.32.52-1

Avec la version 2.32.52-1 il peut s'avérer qu'il existe un problème lors du chown d'un répertoire distant en smb, même avec l'option perms 0, alors que ce problème n'apparaissait pas dans les options précédentes.

Pour résoudre ce conflit il faut ajouter au fichier de profil :

dontchmod=true

Que faire lorsque l'on a des versions différentes d'Unison

On peut avoir deux machines avec des versions d'Unison installées différentes (après un upgrade d'une machine par exemple). Disons la 2.48.4 sur la machine spirou, et la 2.53.2 sur la machine fantasio. On peut alors installer la 2.48.4 sur fantasio, éventuellement dans le compte utilisateur (en allant chercher ici la version que vous voulez, sous forme de source ou déjà compilée pour Ubuntu. Une fois qu'on a mis par exemple l'exécutable unison-2.48.4-linux-i386-text-static dans le répertoire /home/moi/bin de la machine fantasio, on peut lancer la commande depuis spirou en donnant explicitement le chemin vers l'exécutable sur fantasio.

unison chemin1 chemin2 -servercmd /home/moi/bin/unison-2.48.4-linux-i386-text-static 

ou dans le fichier de profil sur spirou, on met la ligne

servercmd = /home/moi/bin/unison-2.48.4-linux-i386-text-static

Éditez le fichier /etc/crontab, remplir les champs, et dans commande ajouter :

/usr/bin/unison -batch NOMDUPROFIL
  • unison.txt
  • Dernière modification: Le 04/10/2023, 22:08
  • par MarcBoyer