Synchroniser 2 dossiers à l'identique : le vieil unison
Introduction
unison est un logiciel très ancien (mais toujours fonctionnel), de synchronisation parfaite entre 2 répertoires.
Il est également possible de le faire fonctionner entre 2 serveurs distants via SSH.
Cependant, à la différence de rsync dont le fonctionnement ne laisse pas trop de doutes, le concept, pourtant simple, d'unison est beaucoup plus traître.
Au risque de me répéter, ce logiciel synchronise 2 dossiers, de façon bi-directionnelle (dans les 2 sens).
Ce qui signifie que toute modification de l'un des 2 dossiers, provoquera la modification des 2 dossiers une fois la commande exécutée (unison n'est pas un démon, il faut exécuter une commande, tout comme rsync).
Vous allez comprendre.
Premier exemple
Soient 2 dossiers 'A' et 'B'
'A' contient une foule de fichiers et dossiers.
'B' est vide.
unison n'a encore jamais été utilisé entre ces 2 dossiers.
Ce que nous voulons : Synchroniser le contenu de A et B. (en gros, copier le contenu de A vers B).
Rien de plus simple :
unison /chemin/vers/A /chemin/vers/B
ça produit l'équivalent d'une copie simple, du contenu de A vers B. (cp -r /chemin/vers/A/* /chemin/vers/B/).
Les données dans A sont copiées dans B.
unison mémorise alors l'index de ce qui a été copié (un peu comme rsync).
A partir de là, si vous effectuez une modification dans A ou dans B et que vous exécutez la commande à nouveau, unison tentera alors de recréer 'l'unison' entre A et B, en ne s'occupant pas de restaurer quoique ce soit (et oui, attention à ce point !! Il est fondamental).
Si une fois l'unison obtenu entre les 2 répertoire, vous décidez de supprimer un fichier dans B, unison vous demandera si vous souhaitez également le supprimer dans A. Vous pourrez alors choisir de supprimer ou non le fichier dans A, mais pas de restaurer le fichier dans A à partir de la copie dans B !!! Il faut bien comprendre ça !!!
Il n'y a pas de possibilité simple de 'restaurer' avec unison. On ne peut qu'ignorer la suppression ou la copie d'un fichier.
Deuxième exemple
Soient 2 dossiers 'A' et 'B'
Leur contenu est identique.
unison a déjà été utilisé (soit pour copier les données de 'A' vers 'B', avec un B initialement vide, soit simplement pour créer l'index et vérifier que les 2 dossiers sont bien identiques par la même occasion. Cette première exécution peut d'ailleurs prendre beaucoup de temps si vos dossiers sont lourds).
Si vous ajoutez 2 nouveaux fichiers à A ou à B et lancez la même commande unison entre les 2 dossiers, alors unison vous demandera, fichier par fichier, si vous souhaitez également le copier dans l'autre répertoire. Vous aurez alors le choix de répondre oui ('f') ou de ne pas copier le fichier ('n').
Lorsqu'il n'y aura plus de décision à prendre, unison vous proposera d'appliquer ces décisions ('Proceed with propagating updates? []').
Si vous souhaitez alors appliquer les décisions, c'est 'y', si vous ne souhaitez pas, c'est 'q'. Si vous tapez 'n' alors le processus de décision repart à 0 pour tous les fichiers et vous devrez choisir à nouveau pour chacun d'eux... ça c'est vraiment con comme syntaxe !!!
L'automatisation !
Il est bien entendu possible d'automatiser la prise de décision et d'empêcher unison de poser interactivement la question pour tous les fichiers. Ainsi, ce sont des décisions par défaut qui seront appliquées.
unison -batch -auto /chemin/vers/A /chemin/vers/B
Je rappelle donc ce que va produire cette commande très dangereuse :
- tout nouveau fichier (ajouté, donc, depuis la dernière exécution d'unison) copié dans A ou B sera automatiquement copié dans l'autre répertoire lors de la prochaine exécution d'unison.
- tout fichier déjà existant lors d'une précédente synchro, qui est ensuite supprimé de A ou B, sera également automatiquement supprimé dans l'autre dossier lors de la prochaine exécution de commande.
Troisième exemple
Soient 2 dossiers 'A' et 'B'
Leur contenu est presque identique.
En gros, vous avez déjà une base commune mais vous avez en plus ajouté des fichiers à A mais pas à B, et ajouté des fichiers à B mais pas à A.
1er cas de figure : unison n'a jamais été utilisé
Rappelez-vous, cette première exécution peut prendre beaucoup de temps si vos répertoires A et B sont très chargés en données car unison compare tout, scrupuleusement.
Lorsque vous exécuterez la commande avec les options automatiques, les 2 dossiers se mettront à l'unison.
Les fichiers présents dans A mais pas dans B se copieront dans B.
Les fichiers présents dans B, mais pas dans A se copieront dans A.
Tout va bien dans le meilleur des mondes !
2nd cas de figure : unison a déjà été utilisé
Vous avez depuis ajouté des fichiers à A mais pas à B et également ajouté des fichiers à B mais pas à A.
Lorsque vous exécuterez la commande avec les options automatiques, les 2 dossiers se mettront à l'unison.
Les fichiers présents dans A mais pas dans B se copieront dans B.
Les fichiers présents dans B, mais pas dans A se copieront dans A.
Là aussi, tout va bien dans le meilleur des mondes !
Conclusion
Il ne s'agît pas d'une synchronisation unidirectionnelle entre A et B comme avec rsync, mais d'une synchronisation bidirectionnelle.
Autrement dit, toute altération de l'un ou l'autre des dossiers (A ou B) sera reproduite dans l'autre dossier.
C'est particulièrement dangereux dans le cas où A et B seraient sur 2 supports de stockage différents et que l'un d'eux se mettrait à défaillir avant l'exécution de la commande. Vous pourriez potentiellement perdre beaucoup de données en une seule commande !
Et c'est l'une des raisons pour laquelle unison n'est plus beaucoup utilisé (sans parler du fait que des systèmes de fichiers comme ZFS font ce travail en 50 fois moins de temps aujourd'hui avec les options send/receive).
Pour éviter cette situation, il faut vérifier l'état des disques AVANT l'exécution de la commande.
Ou plus simple, utiliser rsync (unidirectionnel) pour éviter de foutre la pagaille partout en même temps.
unison est très performant et rapide... mais attention, vous êtes prévenus des risques !
↑ Haut de page