Unison

De Wiki de la communauté Mandriva.

Sommaire

Les bases - Synchroniser deux répertoires

Introduction

Unison est un outil qui permet la synchronisation et la sauvegarde de répertoires.

Nous aborderons dans cette section l'utilisation d'Unison comme outil de synchronisation.

La sauvegarde sera abordée dans une prochaine section.

Même si vous vous intéressez plutôt à la sauvegarde, n'y filez pas immédiatement : nous vous conseillons de lire une première fois les différentes sections à la file, chaque section présupposant l'assimilation des sections précédentes...

Les profils

Si vous voulez définir une tâche répétitive sous Unison, créez un profil.

Un profil est un fichier texte dont l'extension est .prf.

Vous y définirez une tâche qu'Unison pourra effectuer régulièrement : une fois créé, le profil pourra être exploité pendant des années, mais il pourra aussi être modifié à n'importe quel moment, si nécessaire, avec tout le degré de finesse voulu.

Les fichiers de profil concernant des tâches que vous lancerez sous votre identité d'utilisateur sont à placer dans votre répertoire personnel de configuration pour Unison, qui par défaut sera le répertoire :

/home/toto/.unison

(je suppose que votre nom d'utilisateur est toto, le point initial devant le nom du répertoire en fait un répertoire caché)

Nous commencerons par des exemples de profils très simples.

Synchroniser deux répertoires via un disque externe ou une clé USB

Le problème

Vous travaillez régulièrement à la maison, sous Linux, sur un répertoire, disons /home/toto/Documents/Cours. Au bureau, vous ne disposez, hélas, que d'une machine sous Windows et vous travaillez sur un répertoire homologue :

C:\Documents and Settings\toto\Mes Documents\Cours.

Vous souhaitez reporter régulièrement les changements effectués dans chacun de ces répertoires sur l'autre : autrement dit, vous souhaitez pouvoir synchroniser ces deux répertoires (en arrivant le matin au bureau ou en rentrant chez vous le soir, c'est la première chose que vous faites...).

Nous supposerons que vous passerez par l'entremise d'un support mobile léger : clé USB ou disque dur externe.

Un profil simple sur machine Linux

Vous allez donc créer un profil pour cette tâche, disons le fichier texte : /home/toto/.unison/cours.prf (rappelez-vous que l'extension .prf est indispensable pour un fichier de profil).

Nous devons d'abord définir les répertoires à synchroniser.

Sur la machine Linux, ce sera donc :

- le répertoire existant du disque dur interne : /home/toto/Documents/Cours

- le fichier intermédiaire situé sur une partition du disque dur externe, que nous supposerons montée en /mnt/SauvDD.

Dans le jargon d'Unison les répertoires à synchroniser sont appelés des répliques (replica dans la documentation en anglais d'Unison).

Les premières lignes du fichier de profil pourront alors être ceci :

# cours.prf - sur machine Linux

# Les répliques à synchroniser
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

Dans les fichiers de profil les lignes de commentaire sont précédées par un dièse : #, c'est le cas ici des deux premières lignes non vides du fichier.

Les répliques sont ensuite définies par des lignes de la forme root = chemin_d_une_replique, qui définissent la racine (root) de chaque réplique.

La première réplique du profil sera affichée à gauche dans l'interface graphique et la seconde à droite.

Ces quelques lignes peuvent à elles seules constituer un fichier de profil valide, c'est le cas le plus simple.

Bien entendu, si vous lancez Unison en tant que toto, il sera nécessaire que toto possède des droits d'écriture et de lecture sur /mnt/SauvDD.

Si vous voulez lancer un profil sous root, le répertoire .unison de root (/root/.unison) devra contenir ce profil ou un lien symbolique vers ce profil.

Lancer Unison

Le lancement d'Unison se fait comme pour toute application :

- vous pouvez ouvrir une console (personnellement j'ai associé cette opération d'ouverture de console à un raccourci clavier et ça se fait donc en un tournemain), puis taper unison (ou mieux encore : unison & pour pouvoir continuer à utiliser la console pendant qu'Unison travaillera), suivi d'Entrée

- vous pouvez créer un item Unison dans le menu général des applications (Menu K sous KDE) et lancer ensuite le programme par ce moyen. L'entrée est automatiquement créée à partir du paquetage Unison ; sous Mandriva 2008 faire (Menu K > Applications Internet > Plus > unison).

- vous pouvez créer une icône sur la barre des tâches (Kicker) ou sur un bureau et cliquer sur l'icône pour lancer Unison.

L'interface graphique d'Unison

L'interface au lancement

Unison ouvre une fenêtre et propose les différents profils actuellement disponibles pour l'utilisateur qui a lancé Unison.

Dans notre cas nous verrons donc notamment quelque chose comme :

cours

Voici par exemple ce que cela peut donner :

Image:Unison1.png

Nous cliquerons alors sur la ligne cours pour lancer Unison avec le profil cours.prf.

Comment Unison vous demande votre avis

Unison se met alors en devoir de comparer les deux répliques afin de déterminer si des changements ont eu lieu depuis le dernier lancement du profil.

Après avoir effectué cet examen, Unison vous fera de simples propositions : ce sera à vous de les accepter ou de modifier ce qu'Unison vous aura proposé. Vous restez maître de la situation... Naturellement, vous pouvez aussi décider de faire confiance systématiquement à Unison et de tout accepter les yeux fermés...

Voici, par exemple, ce qu'Unison pourrait vous proposer :

Image:Unison2-2.png

Si un fichier a changé sur la réplique a mais pas sur la réplique b, Unison vous proposera de « propager » le changement de a vers b : ceci est représenté par une flèche verte allant de a vers b. Si vous ne faites rien, lorsque vous presserez l'icône Go, qui permet de lancer la propagation, Unison propagera ce changement.

Mais vous pouvez aussi inverser le sens de la flèche en pressant sur une icône représentant la flèche appropriée dans la barre de menu d'Unison : dans ce cas Unison propagera la version de b vers a lorsque vous presserez sur Go.

Vous pouvez aussi décider de demander à Unison de ne pas modifer ce fichier ; pour cela, presser l'icône Skip : les deux versions resteront alors intactes quand vous aurez pressé sur Go.

Lorsqu'un fichier aura été modifié sur les deux répliques, Unison considèrera par défaut qu'il y a conflit et représentera cela par un point d'interrogation rouge (voir la première ligne de l'image ci-dessus). Si vous ne faites rien, Unison ne modifiera le fichier sur aucune réplique. Mais, naturellement, vous pouvez aussi décider de propager le changement dans un sens ou dans un autre en cliquant sur l'icône de flèche appropriée.

Comment propager les changements à partir de l'interface graphique

Une fois que vous avez ainsi examiné les propositions d'Unison (ou décidé que vous lui faites confiance pour tout), vous lancez les changements en cliquant sur l'icône Go.

Un profil sur une machine Windows

Sur une machine Windows XP le fichier .unison devrait se trouver en C:\Documents and Settings\toto\.unison et le fichier de profil .prf pourrait être quelque chose comme ce qui suit (je suppose, à titre d'exemple, que le répertoire à synchroniser, sur la clé USB ou le disque dur externe, serait identifié sur cette machine comme F:\Documents\Cours) :

# cours.prf - sur machine Windows

# Les répliques à synchroniser
root = F:/Documents/Cours/
root = C:/Documents and Settings/toto/Mes Documents/Cours/

Non, non : ce n'est pas une erreur, dans un profil d'Unison, vous devez bel et bien indiquer les chemins des répliques sous Windows avec des barres obliques et non pas avec des barres obliques inverses...


Bien entendu, pour une synchronisation entre deux machines Linux, les choses sont encore plus simples et les deux profils tout à fait analogues.

vfat ou ext3 pour un disque intermédiaire Linux/Windows ?

Si vous synchronisez un répertoire entre une machine Windows et une machine Linux vous pourriez être tenté d'installer sur la partition du disque intermédiaire, clé USB ou disque dur externe, le système de fichiers vfat reconnaissable directement par les deux systèmes.


vfat ne reconnaît pas les permissions et ne distingue pas les majuscules des minuscules dans les noms de fichiers, aussi convient-il dans ce cas de désactiver la synchronisation des permissions et la distinction de casse. Vous obtiendrez cela en utilisant dans le profil les options ignorecase et perms, de la façon suivante :

# cours.prf - pour synchro ext3/vfat

# Les répliques à synchroniser
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Options pour vfat
ignorecase = true
perms = 0

Par ailleurs, vfat ne permettra pas de traiter correctement des noms de fichiers ou répertoires contenant des accents ou certains caractères particuliers (\, /, * etc.).


Mais il faut savoir qu'il est maintenant possible de rendre les machines Windows 2000, XP et Vista capables de reconnaître le format linuxien ext3 (ou ext2).

Il suffit pour cela d'installer sur la machine Windows EXT2IFS ou Ext2fsd (Ext2fsd v0.31a supporte Windows 2000, XP et Vista, 32 ou 64-bit !). Dans ce cas, il devient possible de gérer les permissions, majuscules/minuscules et l'Unicode (et donc inutile d'utiliser ignorecase et perms dans le profil situé sur la machine Linux).

Il est alors possible d'avoir aussi un système ext2 ou ext3 (article wikipedia) sur votre disque intermédiaire (clé USB ou partition de disque dur externe) : et cela fonctionnera plutôt mieux, bien sûr...

Attention : si vous utilisez EXT2IFS ou Ext2fsd sous Windows, évitez de monter les partitions racine (ou système ou sensibles) de votre OS Linux sous Windows de cette façon, afin d'éviter qu'elles ne soient à la merci des failles de Windows.

Accélérer les choses sur le versant Windows

Sur une machine Windows vous accélèrerez considérablement la vitesse de la synchronisation en activant dans le profil l'option fastcheck : les contenus des fichiers ne seront plus comparés, seule la date sera prise en compte pour déterminer la nécessité d'une mise à jour. Le gain de temps est spectaculaire sur une machine lente ou si les répertoires sont volumineux.

Pour les cas, sans doute peu fréquents, où des fichiers de même date auraient des contenus différents, vous pouvez, une fois de temps en temps, lancer Unison en commentant (en faisant précéder d'un dièse #), la ligne contenant cette option dans le profil.

On pourrait donc avoir sur une machine Windows quelque chose comme :

# cours.prf - sur machine Windows

# Les répliques à synchroniser
root = F:/Documents/Cours/
root = C:/Documents and Settings/toto/Mes Documents/Cours/

# Options pour Windows
fastcheck = true

Sous Linux cette option est activée par défaut.

Le journal d'Unison

Unison peut tenir un journal de toutes les actions effectuées et des messages d'erreur émis. Pour activer cette fonctionnalité, utiliser les options log et logfile (cette dernière option détermine l'emplacement du journal).

Cela peut donc donner :

# cours.prf - sur machine Linux

# Les répliques à synchroniser
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

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

Un journal sera désormais tenu, et ce sera le fichier /home/toto/.unison/unison.log.

Eventuellement, paramétrez logrotate (voir man logrotate) pour limiter sa croissance...

Sauvegarder un répertoire

Les deux répliques définies au début d'un profil Unison peuvent correspondre, comme nous l'avons vu à la section précédente, à deux répertoires que vous utilisez l'un et l'autre alternativement pour travailler, et qu'Unison va synchroniser.

Mais il peut se faire aussi que vous ne travailliez habituellement que sur l'un des deux répertoires correspondant aux répliques : vous souhaiterez alors qu'Unison crée et entretienne une sauvegarde ou une image-miroir de ce répertoire dans l'autre réplique.

La sauvegarde, par définition, n'aura jamais vocation à être modifiée directement. Elle abritera une copie des versions successives de l'autre réplique.

Bien qu'Unison soit souvent considéré avant tout comme un outil de synchronisation, il est très facile d'obtenir de lui un comportement de ce genre et de l'utiliser comme outil de sauvegarde : il faut pour cela utiliser l'option force.

Une ligne du profil de la forme force = chemin_de_la_replique à sauvegarder imposera ce comportement.

Pour reprendre l'exemple de la page précédente, si vous travaillez régulièrement sur le fichier /home/toto/Documents/Cours, pour le sauvegarder sur la partition SauvDD de votre disque dur externe, vous pourriez créer un profil comme le suivant :

# cours.prf

# Les deux répliques
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Le répertoire à sauvegarder
force = /home/toto/Documents/Cours

Toute modification survenue entre deux sauvegardes dans /home/toto/Documents/Cours sera répercutée dans /mnt/SauvDD/Documents/Cours (si du moins vous donnez votre accord, car Unison ne fait rien sans vous...), en revanche les modifications survenues dans /mnt/SauvDD/Documents/Cours ne seront pas prises en compte : ce qui est exactement ce qu'on souhaite, puisqu'une modification directe d'une sauvegarde entre les deux sessions Unison ne pourrait, par définition, être due qu'à une fausse manoeuvre ou à une corruption du support...

Les attributs de fichiers

Permissions

Par défaut, Unison propage les permissions (à la seule exception des bits setUID et setGID, pour d'évidentes raisons de sécurité). Si vous souhaitez que les permissions ne soient pas propagées (par exemple pour une propagation vers un disque vfat, qui ne reconnaît pas les permissions), vous pouvez ajouter cette ligne dans votre profil :

perms = 0

La grande flexibilité d'Unison lui permet aussi de ne synchroniser que partiellement les permissions ; vous pouvez également lui demander (à vos risques et périls) de propager les bits setUID et setGID. Pour plus de détails sur tout cela, voir le Manuel de l'Utilisateur.

Date

Par défaut, Unison ne synchronise pas la date (si un fichier de la réplique a est propagé sur la réplique b, il portera la date à laquelle la nouvelle version a été créée sur b et non la date qu'il possède sur a). Si vous voulez que les dates soient systématiquement propagées, écrivez dans votre profil une ligne :

times = true

Propriétaires

Par défaut, Unison ne synchronise pas les propriétaires et les groupes propriétaires (si un fichier de la réplique a possède un propriétaire et/ou un groupe propriétaire différent de celui de sa version présente sur la réplique b, en cas de propagation de a vers b les propriétaire et/ou groupe resteront différents). Si vous souhaitez que le propriétaire et le groupe soient systématiquement propagés, vous pouvez écrire les lignes suivantes dans votre profil :

owner = true
group = true

Synchronisation : toujours le plus récent... ou donner la prime au plus âgé...  ?

Signalons ici un autre usage de l'option force.

Cette option permet aussi, lorsqu'Unison s'aperçoit que depuis la dernière exécution du profil, un fichier a été modifié sur les deux répliques (autrement dit lorsqu'il y a « conflit »), de faire en sorte qu'Unison vous propose systématiquement de ne garder sur chaque réplique que la version la plus récente (la valeur de l'option est alors newer) ou au contraire la plus ancienne (la valeur de l'option est alors older).

Il vous suffira donc pour obtenir ce comportement d'introduire l'une ou l'autre des lignes suivantes dans le profil :

force = newer

ou

force = older

Attention : n'utilisez ces possibilités que si vous savez vraiment ce que vous faites...

L'utilisation de l'une ou l'autre de ces valeurs de la préférence force suppose d'activer aussi l'option times.


Comparer avec la commande cp et son option -u, voir Copie de fichiers ou de répertoires#Emploi de -u pour une synchronisation.


Sauvegarder ou synchroniser une partie d'un répertoire

Lorsque vous synchronisez ou sauvegardez, vous pouvez avoir envie de ne pas propager les modifications qui concernent certains fichiers ou certains sous-répertoires inclus dans l'une ou l'autre des répliques (parce qu'ils sont confidentiels, ou temporaires ou trop volumineux etc.).

Comment s'y prendre pour restreindre l'action d'Unison à une partie du contenu des répliques  ?

Unison met pour cela deux techniques à votre disposition. Vous pouvez :

- sauvegarder/synchroniser la totalité du contenu des répliques, à l'exception de certains répertoires ou fichiers (qui devront être passés en argument à l'option ignore)

- sauvegarder/synchroniser uniquement les parties de répliques explicitement mentionnées (qui devront être passées en arguments à l'option path).

Tout sauf ça !

Il est possible d'exempter certains éléments de toute duplication ou de toute mise à jour en utilisant dans le profil l'option ignore.

On peut donner à cette option un nom de fichier ou de répertoire en argument, dans ce cas le nom doit être précédé du mot Name : tout fichier ou répertoire doté de ce nom sera ignoré, il ne sera donc jamais propagé d'une réplique à l'autre, quelle que soit la position de ce (ou de ces) fichier(s) ou répertoire(s) à l'intérieur des répliques.

Par exemple le profil suivant :

# cours.prf

# Les deux répliques
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Ne pas mettre à jour
ignore = Name Personnel
ignore = Name Notes

ne propagerait pas les changements concernant tout répertoire ou tout fichier dont le nom serait Personnel ou Notes.

Attention, dans ce cas, à ne pas oublier l'existence de tel fichier ou répertoire enfoui au fin fond de l'arborescence qui pourrait se trouver concerné par l'option sans que vous l'ayez souhaité (il peut arriver que plus d'un fichier possède le même nom !)...

Et si justement, c'était le cas ? Ou si, par exemple, vous souhaitiez exempter de duplication le fichier /home/toto/Documents/Cours/Licence/Notes tout en sauvegardant/synchronisant le répertoire homonyme /home/toto/Documents/Cours/Notes ? Que faire ?

Dans ce cas vous donneriez un chemin en argument à l'option ignore. Ce chemin devrait être précédé du mot Path.

Ce qui donnerait ceci :

# cours.prf

# Les deux répliques
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Ne pas mettre à jour
ignore = Path Licence/Notes


Si, à l'inverse, vous aviez voulu ignorer uniquement un répertoire (ou un fichier) /home/toto/Documents/Cours/Notes, vous auriez écrit :


# cours.prf

# Les deux répliques
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Ne pas mettre à jour
ignore = Path Notes

Notez bien que les chemins qui suivent le mot Path sont relatifs à la racine de la réplique... ce ne sont pas des chemins absolus (autrement dit, dans le premier profil, on n'a pas écrit, et on ne devait pas écrire : ignore = /home/toto/Documents/Cours/Licence/Notes).

Tant avec Name qu'avec Path seront ignorés des éléments figurant sur l'une ou l'autre des deux répliques.

Il est bien sûr possible de donner dans le même profil des arguments de type Path et de type Name à l'option ignore.

Pour pouvoir utiliser plus souplement l'option ignore, vous pourriez lire cette section qui vous en dira davantage sur la syntaxe des spécifications par nom et par chemin.



Précautions... précautions...

Le manuel officiel d'Unison attire l'attention sur la nécessité d'une certaine vigilance lorsque vous renommez des répertoires qui contiennent des fichiers « ignorés » (par emploi de l'option ignore).

Voici (traduit en français et légèrement modifié par nos soins) ce que dit le manuel à ce propos :

Supposons, par exemple, que vous synchronisiez le répertoire A entre deux machines [Note du Trad. : ou entre deux disques connectés à la même machine] que nous appellerons machine « locale » et machine « distante »; supposons aussi que le répertoire A contienne un sous-répertoire D ; supposons enfin que D sur la machine locale contienne un fichier ou un sous-répertoire P qui tombe sous le coup d'une directive ignore du profil utilisé pour la synchronisation. Le chemin A/D/P existe donc sur la machine locale mais pas sur la machine distante.

Si D est renommé en D' sur la machine distante et si ce changement est propagé à la machine locale, alors tous les fichiers ou sous-répertoire du type de P seront effacés sur la machine locale. Il en est ainsi parce qu'Unison considère que renommer, c'est effacer et créer indépendamment de l'effacement : Unison efface donc sur le disque local l'ancien répertoire D (y compris les fichiers ignorés qu'il contient) et crée un nouveau répertoire D' (qui ne contiendra pas les fichiers ignorés puisque ceux-ci sont complètement invisibles pour lui et absents du disque distant).

[tiré du Manuel d'Unison, section 4.7]


Pas plus que ça !

Il pourrait arriver que vous ayez envie de ne propager des changements, à l'intérieur de vos répliques, que pour un nombre relativement limité de répertoires et de fichiers. Dans ce cas, ce qui serait à ignorer pourrait être considérable et si vous deviez énumérez tout ce dont Unison ne doit pas tenir compte, vous risqueriez d'en oublier une partie...

Plutôt donc que de dire à Unison, comme au paragraphe précédent, « apparie-moi ces deux répliques, sauf ce machin-ci et ce truc-là », il serait beaucoup plus économique de lui dire alors : « dans ces deux répliques, apparie-moi donc seulement ce bidule-ci et cette chose-là ».... si vous voyez ce que je veux dire...

Eh bien, vous pouvez définir un profil de cette façon à l'aide de l'option path (à ne pas confondre avec le mot Path de la sous-section précédente... attention !).

Dans ce cas, seuls seront pris en compte par Unison les répertoires ou fichiers dont les chemins figureront en position d'argument de l'option path.

Ainsi avec ce profil :

# cours.prf

# Les deux répliques
root = /home/toto/Documents/Cours/
root = /mnt/SauvDD/Documents/Cours/

# Ne synchroniser que ce qui suit
path = Licence
path = Master1/Notes
path = important.txt

Unison proposerait seulement de tenir compte des changements intervenus dans les trois chemins indiqués après path = et ignorerait tout le reste.

Comment gérer des parties de répertoire avec aisance et souplesse

Introduction

Nous avons vu plus haut comment demander à Unison d'ignorer des parties de répertoire, en les passant en argument à l'option ignore, à l'aide des mots-clé Name et Path.

Notez cependant que lorsqu'on a affaire à des répertoires volumineux et que l'on a de nombreux noms de fichiers ou de chemins à mentionner ainsi, s'en tenir aux techniques utilisées précédemment pourrait vite devenir laborieux et aboutir à des profils très chargés et peu lisibles.

Nous donnerons donc ici quelques techniques qui vous permettront de jongler plus librement avec les indications introduites par Name et Path.


Ces techniques vous seront d'autant plus utiles que des fragments de répertoire peuvent être donnés en argument de la même façon à d'autres options d'Unison dont nous n'avons pas encore parlé (par exemple : immutable, backup, ignorenot, merge, follow etc.). Il est donc particulièrement rentable de bien maîtriser la syntaxe appropriée.

Comment représenter de façon plus compacte noms et chemin

Unison utilise des techniques qui pourraient être familières à certains d'entre vous, dans la mesure où elles sont très proches de techniques utilisées par le shell, que ce soit en ligne de commande ou dans les scripts shell (voir L'expansion des noms de fichiers).


Cela dit, même si vous n'êtes pas très familiarisés avec le shell, pas d'inquiétude : c'est vraiment simple à utiliser, ne vous enfuyez pas immédiatement !!


Remplacer plusieurs lignes par une seule à l'aide des accolades

Si vous voulez sauvegarder l'ensemble de votre disque dur, vous pourriez utiliser un profil du type suivant, où vous auriez évidemment choisi d'ignorer des répertoires qui n'ont pas à être sauvegardés, tels que /dev, /proc, /sys etc. et où vous auriez aussi décidé de ne pas sauvegarder les fichiers ou répertoires ayant pour nom Mes_images ou Images.

# tout.prf - Sauvegarde de l'ensemble du disque dur interne

root = /
root = /mnt/SauvDD

force = /

ignore = Path dev
ignore = Path mnt
ignore = Path proc
ignore = Path sys
ignore = Path sbin
ignore = Path tmp

ignore = Name Mes_images
ignore = Name Images

tout cela peut être remplacé par un profil plus simple, avec des accolades contenant différents noms ou chemins séparés par une virgule :

# tout.prf - Sauvegarde de l'ensemble du disque dur interne

root = /
root = /mnt/SauvDD

force = /

ignore = Path {dev,mnt,proc,sys,sbin,tmp}
ignore = Name {Mes_images,Images}

Le joker ?

Ce symbole se met à la place de n'importe quel caractère (à l'exception de /)

Par exemple :

ignore Name perso.???

aboutira à ce qu'Unison ignore tout fichier (ou répertoire) ayant pour nom perso avec n'importe quelle extension à trois caractères (donc par exemple perso.txt, perso.odt, perso.jpg etc... mais pas perso.c ou perso.db).

Le joker *

Ce symbole se met à la place de n'importe quelle suite de caractères (éventuellement vide) ne contenant pas le caractère /.

ignore Name perso.*

aboutira à ce qu'Unison ignore tout fichier (ou répertoire) ayant pour nom perso suivi d'une extension ayant un nombre quelconque de caractères (donc par exemple perso.txt, perso.c, perso.db etc... et même un éventuel fichier dont le nom se terminerait bizarrement par un point : perso.).


L'étoile et les fichiers cachés...

Dans les noms introduits par le mot-clé Name, * ne reconnaît pas le point initial des noms de fichiers ou répertoires cachés. Cette restriction ne vaut pas pour les chemins, introduits par le mot-clé Path...

ignore = Name *rc

demandera à Unison d'ignorer, entre autres, un éventuel fichier xmodmaprc mais pas un fichier caché .xmodmaprc

ignore = Path *rc

ignorerait aussi bien xmodmaprc que le fichier caché .xmodmaprc, si ces fichiers sont situés à la racine d'une réplique. Pour ignorer tous les fichiers cachés, quelle que soit leur position, faire :

ignore = Name  .*

Des gammes de caractères entre crochets

On peut représenter entre crochets un caractère appartenant à un ensemble de caractères. Quelques exemples devraient suffire à clarifier cela.

ignore Name perso.[0-9][0-9][0-9]

ignorerait tout fichier dont le nom est formé de perso suivi d'une extension à trois caractères numériques (donc perso.234, perso.111 etc).

ignore Name perso.[03][0-9][0-9]

ignorerait tout fichier dont le nom est formé de perso suivi d'une extension à trois caractères numériques dont le premier est un zéro ou un 3 (donc perso.034, perso.311 etc mais pas perso.234).

On peut imposer aussi qu'un caractère n'appartienne pas à un certain ensemble, par exemple :

ignore Name perso.[^6]??

ignorerait tout fichier dont le nom est formé de perso suivi d'une extension à trois caractères dont le premier ne serait pas un 6.

On retrouve donc bien les diverses conventions utilisées par le shell pour L'expansion des noms de fichiers.

Pour les experts : les expressions régulières

Si vous jonglez avec les expressions régulières, vous pouvez les utiliser aussi pour fournir des fichiers ou répertoires en argument à l'option ignore, ainsi qu'à bien d'autres options d'Unison dont nous n'avons pas encore parlé.

Il suffit pour cela d'utiliser le mot-clé Regex au lieu de Name ou Path. Pour des exemples et plus de détails, voir le Manuel d'Unison.

Répertoires de fichiers « immuables » : l'option immutable

Nous envisagerons ici le cas d'un répertoire de votre disque local qui aurait vocation à contenir un ensemble de fichiers que vous considèreriez comme « définitifs » au sens où vous seriez certain que le contenu de ces fichiers ne devrait jamais être modifié.

L'option immutable est exactement ce qui convient dans ce cas : une fois dupliqués sur le disque externe au cours d'une session Unison, les fichiers d'un répertoire traité de cette façon ne seront plus jamais modifiés par Unison. Même si, par erreur, par malignité, par corruption matérielle, l'un de ces fichiers venait à être modifié sur le disque local, Unison ne proposerait pas sa mise à jour sur le disque externe. Les fichiers une fois sauvegardés sont donc bien protégés contre toute modification non souhaitée.

A la différence de l'option ignore, l'option immutable vous permet cependant d'enrichir le répertoire par de nouveaux fichiers qui y seraient introduits au fil du temps : un nouveau fichier que vous auriez créé dans ce répertoire sur le disque local sera copié dans la sauvegarde et une fois copié ne sera jamais plus modifié.

Notez que, outre les avantages de sécurité qu'elle présente, cette option vous permet aussi d'abréger la durée de la procédure de sauvegarde : Unison ne comparera plus le contenu des fichiers présents dans ce répertoire sur les deux disques et si ces fichiers sont nombreux et/ou volumineux cela se traduira par un appréciable gain de temps.

Voici un exemple d'emploi de cette option :

# doc.prf

# Les répliques
root = /home/toto/Documents/
root = /mnt/CLE_USB-2/Documents/

# Les immuables
immutable = Path {Articles,Mes_images/Mexique}

Pour un tel profil, seraient traités comme « immuables » les répertoires /home/toto/Documents/Articles et /home/toto/Documents/Mes_images/Mexique.


Pour fournir des arguments à l'option immutable procéder comme indiqué pour l'option ignore >>ici<< et >>là<<.

Mise en facteur commun de bouts de profils : la directive include

Si vous mettez au point toute une série de profils afin de définir diverses tâches de sauvegarde ou de synchronisation, il se peut que certaines lignes se retrouvent dans tous les profils.

C'est alors une bonne idée de les regrouper dans un fichier texte à part qui sera invoqué dans chaque profil à l'aide de la directive include. Un tel fichier devra figurer dans le répertoire .unison, soit directement soit sous la forme d'un lien symbolique.


Attention : un tel fichier texte de préférences générales ne doit pas avoir l'extension .prf (afin de ne pas être traité par Unison comme un profil autonome).

Voici par exemple un fragment possible d'un tel fichier, qui définirait la taille de la fenêtre de l'interface graphique et l'emplacement du journal d'Unison.

# prefgen - fichier de préférences générales

# Hauteur de la fenêtre
height = 47

# Journal
log = true
logfile = /home/toto/unison.log

Pour invoquer ce fichier dans un profil, il suffira d'y mettre la ligne suivante, formée de la directive, include, suivie du nom du fichier à inclure :

include prefgen

Vous pouvez aussi définir un fichier de préférences pour un sous-ensemble de vos tâches Unison (par exemple, si vous avez l'idée de définir plusieurs tâches impliquant un disque local en ext3 et un disque externe en vfat, vous pourriez définir un fichier de préférences pour des tâches de ce genre etc.).

Conserver plusieurs versions d'un même fichier : l'option backup

Imaginez qu'un fichier important de votre disque local ait été corrompu ou modifié de façon non souhaitable : si vous n'avez qu'une seule version de sauvegarde/synchronisation de ce fichier, alors quand Unison l'aura propagé sur la sauvegarde, vous n'aurez plus qu'une version corrompue. C'est pour cela qu'il est toujours conseillé d'effectuer plus d'une sauvegarde.

Autre problème : vous effacez trop vite ou par erreur un fichier important et Unison propage l'effacement sur la sauvegarde : si vous ne disposez que d'une seule version de sauvegarde, la perte est irrémédiable.

Unison vous permet de vous prémunir contre ces deux dangers « en une seule opération ».

Unison vous permet en effet d'activer une option qui conservera dans un répertoire de votre choix des versions successives des fichiers sauvegardés.

Si vous avez de la place en suffisance, vous pourrez faire en sorte que tous les fichiers dont les modifications auront été « propagées » par Unison soient enregistrés de telle sorte que plusieurs versions successives des fichiers modifiés restent présentes sur votre disque local dans un répertoire que vous aurez vous-même défini (et bien entendu ce répertoire pourra lui-même être inclus dans la procédure de sauvegarde et dupliqué dans ce cas sur le disque externe).

Pour préserver ainsi un exemplaire de chaque fichier propagé, vous pourriez utiliser l'option backup de la façon suivante, à l'intérieur d'un fichier de profil .prf :

backup = Name *

Pour que les versions successives soient entreposées, par exemple, dans un sous-répertoire /home/toto/backup/doc il conviendrait d'ajouter aussi la ligne :

backupdir = /home/toto/backup/doc

(et vous devriez, créer ce répertoire à la main par un mkdir -p /home/toto/backup/doc en console). Enfin, pour ne permettre l'enregistrement que d'un maximum de, disons, 3 versions successives des fichiers, il faudrait ajouter :

maxbackups = 3

Unison sur des machines en réseau

Il existe deux méthodes pour synchoniser des répertoires et fichiers par Unison entre deux machines au travers d'un réseau :

- la méthode par connexion terminal sécurisé sur ssh ou (remote shell).

- la méthode sur "socket" non sécurisée.

Abordons la méthode ssh. Nous synchronisons d'une machine locale A à une machine distante B.

Pour cela, il faut que sur la machine distante B soit lancé le démon ssh : sshd. Il faut aussi que le port de ssh soit ouvert dans le parefeu de la machine distante B. Il faut enfin que les options permettant à un utilisateur "u" donné de se loguer soit configurées sur B.

En cas de doute, on peut vérifier que la même version d'Unison tourne sur B avec cette commande :

ssh B unison -version

La ligne de commande permettant une synchro de A à B est très simple à taper dans un terminal sur A :

unison mon_fichier_à_synchroniser ssh://B/mon_fichier_à_synchroniser

Cette synchro se fera par défaut dans le répertoire de l'utilisateur u sur B.

Pour faire la synchro avec un utilisateur "v" :

unison mon_fichier_à_synchroniser ssh://v@B/mon_fichier_à_synchroniser

Dans le cas d'un serveur SSH sur un autre port que le port 22 (par exemple le 666), on utilise la syntaxe suivante :

unison mon_fichier_à_synchroniser ssh://v@B:666/mon_fichier_à_synchroniser

Mais, comme on synchronise souvent les mêmes fichiers, il est plus simple d'avoir un profil prédéfini, comme on peut le faire pour les synchronisations locales.

Exemple de fichier de profil simple pour synchroniser un répertoire entre 2 machines (notez que les répertoires se terminent logiquement par un "slash" ; unison "comprend" les espaces sans problème) :

# Unison preferences file
#
# Repertoires a synchroniser
root = /home/moi/chemin avec des espaces/
root = ssh://moi@portable:666//home/user/chemin avec des espaces/

Voici un exemple de fichier de profil permettant de synchroniser certaines informations essentielles de Kontact sous KDE :

# Unison preferences file
merge = Name * -> kdiff3 CURRENT1 CURRENT2 -o NEW

# Roots of the synchronization
root = /home/christophe
root = ssh://192.168.1.3//home/christophe

path = .kde/share/config/akregatorrc
path = .kde/share/config/akregator.eventsrc
path = .kde/share/apps/akregator
path = .kde/share/config/kab2kabcrc
path = .kde/share/config/kaddressbookrc
path = .kde/share/config/kaddressbook_addrconfig
path = .kde/share/apps/kab
path = .kde/share/apps/kabc
path = .kde/share/config/kmailrc
path = .kde/share/config/kmail.eventsrc
path = .kde/share/apps/kmail
path = .kde/share/config/kontactrc
path = .kde/share/config/kontact_summaryrc
path = .kde/share/apps/kontact
path = .spamassassin

ignore = Name lock

times = true

Sur la préférence merge, voir le Manuel de l'Utilisateur.

NB : ce profil suppose l'installation de kdiff3 qui permet une bonne édition et fusion des différences entre deux fichiers.

Trucs et astuces

Que faire lorsque des fichiers mis à jour ne sont pas propagés par Unison ?

Vous venez d'exécuter un profil Unison et vous voyez, sur l'interface graphique, une petite croix rouge en regard de certains fichiers, au lieu de la coche verte qui indiquerait que l'opération de propagation s'est déroulée avec succès...

Il peut s'agir simplement de fichiers qui ont été modifiés pendant qu'Unison était en train de propager les modifications : parce que vous étiez en train de travailler vous-même sur ces fichiers à ce moment-là ou parce qu'il s'agit de fichiers de journaux qui ont enregistré quelqu'activité du système, ou encore parce que ces fichiers ont été modifiés par des opérations planifiées exécutées à ce moment etc.

Si vous pensez que ces fichiers doivent être propagés, surtout ne quittez pas Unison (il faudrait alors recommencer toute la vérification), ouvrez plutôt le menu Synchronization et choisissez la commande Recheck unsynchronized items : Unison tentera alors à nouveau de propager les quelques fichiers qui ne l'ont pas encore été. Dans quelques cas, il faudra recommencer une ou deux fois l'opération pour obtenir un traitement complet de tous les fichiers en instance de traitement.

Parfois, cependant, vous aurez beau refaire la manoeuvre indiquée autant de fois que votre patience vous le permettra : il restera encore un ou deux fichiers dotés de la petite croix rouge ! Il s'agira probablement alors de « fichiers spéciaux » (tubes nommés, sockets...) : de tels fichiers ne sont jamais propagés par Unison, inutile donc d'insister ! Pour faire disparaître, lors des prochaines exécutions d'Unison, l'affichage parasite qui les concerne, utilisez l'option ignore.

L'option merge ou comment fusionner des fichiers

Lorsqu'un fichier a été modifié sur deux répliques par des utilisateurs différents, vous pouvez souhaiter créer un nouveau fichier qui contienne les modifications introduites par les deux utilisateurs, plutôt que de remplacer une version par l'autre. Il existe de nombreux logiciels qui sont capables d'effectuer un tel travail.

Unison, avec son habituelle souplesse, vous permet d'appeler pour cela un logiciel externe de votre choix...

Pour les détails de l'option merge, voir le Manuel de l'utilisateur. Pour un exemple de profil qui en fait usage, voir plus haut.

Comment découper un profil Unison en petits morceaux

Vous avez créé un profil qui sauvegarde/synchronise un gros répertoire... et parfois, après avoir travaillé sur quelques fichiers très importants, vous voudriez, par prudence, protéger immédiatement le résultat de votre travail en lançant ce profil... mais l'idée de lancer cette énorme et interminable opération vous fait reculer... et finalement vous renoncez et, de ce fait, vous prenez un risque...

Que faire, que faire ??

Nous vous proposons ici une solution, inspirée du [Wiki en anglais d'Unison], qui fait crucialement usage de :

- la directive include

- l'option path.

Pour rendre les chose concrètes, supposons que vous ayez un profil tout.prf qui sauvegarde tout votre disque dur et dont les premières lignes pourraient être quelque chose comme :

# tout.prf


# Les deux répliques
root = /
root = /mnt/SauvDD/


force = /


# Section include
include prefgen
include preferences_ext_ext


# Les immuables
immutable = Path {home/toto/Documents/Theses,home/toto/Documents/Enseignements_?[^6]*}
immutable = Path {home/toto/Encours}

# Répertoires et fichiers à ne pas synchroniser
ignore = Name {cache,Cache,.sauvliens,socket,unison.log,.unison,clamd.socket,distro}

ignore = Path {dev,mnt,proc,sys,tmp,sbin}

L'idée est alors que vous allez faire de ce fichier, non plus un profil, mais un fichier de préférences, à inclure dans divers profils. Ce sont désormais ces profils qui permettront de lancer l'opération sur tout ou partie des répliques, à l'aide d'une utilisation judicieuse de l'option path.

Vous renommez donc ce fichier tout.prf en general - sans extension (afin qu'Unison ne le considère plus comme un profil). Vous pouvez, bien sûr, choisir tout autre nom qui vous irait mieux.

Un premier profil (qui pourra garder l'ancien nom de tout.prf, par exemple) lancera simplement la totalité des opérations, exactement comme le faisait le précédent profil :

#nouveau tout.prf
include general

Ensuite, ce sera à vous de voir ce dont vous avez besoin. Si vous voulez un profil qui traite uniquement le répertoire Documents, voilà ce qu'il contiendrait :

# doc.prf

path = home/toto/Documents
include general

Un profil qui sauvegarderait uniquement votre répertoire de mails de Thunderbird pourrait être ceci :

# mail.prf

path = home/toto/.thunderbird
include general

etc. etc.

Ainsi donc, si vous avez modifié quelques fichiers très importants du répertoire Documents, vous n'avez qu'à lancer Unison avec le profil doc.prf (via la console ou l'interface graphique) et vous les sauvegarderez ainsi beaucoup plus rapidement que précédemment, tout en conservant exactement le même ensemble de paramétrages et d'options diverses qu'avant...

Autres sources d'information sur Unison

Le site officiel d'Unison (en)

Les listes de diffusion (en)

Le Manuel de l'utilisateur - version 2.13.16 (en)

Le Manuel de l'utilisateur - version 2.13.16 - Traduction en français (fr)

Le Manuel de l'utilisateur - version 2.17.1 (en)

Le Manuel de l'utilisateur - version 2.17.1 - Traduction en français (fr)

Le Wiki d'Unison pour l'instant en anglais, mais une zone pour d'autres langues existe.

Le fil du forum Mandriva consacré à Unison (fr)

Autres logiciels de sauvegarde/synchronisation

Fullsync

Keep

rsync

Récupérée de « http://wiki.mandriva.com/fr/Unison »