Synchronisation fichiers · 10 min read · Feb 09, 2026

Configuration de la synchronisation de fichiers Unison entre deux serveurs sur Debian 8 (Jessie)

Ce tutoriel montre comment configurer la synchronisation de fichiers entre deux serveurs Debian 8 avec Unison. Unison est un outil de synchronisation de fichiers similaire à rsync, la grande différence étant qu’il suit/synchronise les changements dans les deux sens, c’est-à-dire que les fichiers modifiés sur server1 seront répliqués sur server2 et vice versa.

1 Remarque préliminaire

Dans ce tutoriel, j’utiliserai les deux serveurs Debian suivants :

  • server1.example.com avec l’adresse IP 192.168.1.101
  • server2.example.com avec l’adresse IP 192.168.1.102

Je souhaite synchroniser le répertoire /var/www entre les deux serveurs. Je vais exécuter Unison en tant qu’utilisateur root dans ce tutoriel afin qu’Unison dispose des autorisations suffisantes pour synchroniser les autorisations des utilisateurs et des groupes.

Toutes les commandes de ce tutoriel sont exécutées en tant qu’utilisateur root. Connectez-vous aux deux serveurs dans le shell en tant que root et commencez par l’étape 2 “ Installation d’Unison “.

2 Installation d’Unison

server1/server2 :

Unison doit être installé sur server1 et server2 ; comme nous nous connectons de server1 à server2 via SSH, nous avons également besoin des paquets SSH et j’installerai l’éditeur nano pour l’édition de fichiers dans le shell. Cela peut être réalisé comme suit :

apt-get -y install unison openssh-server ssh nano

3 Création d’une paire de clés privée/publique sur server1

server1 :

Nous allons maintenant créer une paire de clés privée/publique sur server1.example.com :

ssh-keygen -t dsa

root@server1:~# ssh-keygen -t dsa
Génération de la paire de clés dsa publique/privée.
Entrez le fichier dans lequel enregistrer la clé (/root/.ssh/id_dsa) : <– ENTRER
Répertoire créé ‘/root/.ssh’.
Entrez la phrase secrète (vide pour aucune phrase secrète) : <– ENTRER
Entrez à nouveau la même phrase secrète : <– ENTRER
Votre identification a été enregistrée dans /root/.ssh/id_dsa.
Votre clé publique a été enregistrée dans /root/.ssh/id_dsa.pub.
L’empreinte de la clé est :
ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 root@server1
L’image randomart de la clé est :
+—[DSA 1024]—-+
| |
| |
| . |
| . E |
|+ * . S |
|.Ooo o |
|ooo+. + |
|oo=… o |
|.. oo.. |
+—————–+
root@server1:~#

Il est important de ne pas entrer de phrase secrète sinon le miroir ne fonctionnera pas sans interaction humaine, donc appuyez simplement sur ENTRER !

Ensuite, nous copions notre clé publique sur server2.example.com :

ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]
L'authenticité de l'hôte '192.168.1.102 (192.168.1.102)' ne peut pas être établie.  
L'empreinte de la clé ECDSA est 51:7f:b4:ed:bd:e3:fc:16:2f:55:5c:e1:2c:d7:3d:a9.  
Êtes-vous sûr de vouloir continuer à vous connecter (oui/non) ? <-- oui (vous ne verrez cela que si c'est la première fois que vous vous connectez à server2)  
/usr/bin/ssh-copy-id : INFO : tentative de connexion avec la nouvelle clé(s), pour filtrer celles qui sont déjà installées  
/usr/bin/ssh-copy-id : INFO : 1 clé(s) reste(nt) à installer -- si vous êtes invité maintenant, c'est pour installer les nouvelles clés  
Mot de passe de '[email protected]' : <-- mot de passe root de server2
Nombre de clé(s) ajoutée(s) : 1
Essayez maintenant de vous connecter à la machine, avec : "ssh '[email protected]'"  
et vérifiez que seules les clé(s) que vous vouliez ont été ajoutées.

Vérifiez maintenant sur server2 si la clé publique de server1 a été correctement transférée :

server2 :

cat $HOME/.ssh/authorized_keys
root@server2:/home/administrator# cat $HOME/.ssh/authorized_keys  
ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= root@server1

4 Exécution d’Unison

server1 :

Nous pouvons maintenant exécuter Unison pour la première fois afin de synchroniser le répertoire /var/www sur les deux serveurs. Sur server1, exécutez :

unison /var/www ssh://192.168.1.102//var/www

La sortie sera similaire à celle-ci - vous devrez peut-être répondre à quelques questions car c’est la première fois qu’Unison est exécuté :

root@server1:/var/www# unison /var/www ssh://192.168.1.102//var/www  
Contactant le serveur...  
Connecté [//server1//var/www -> //server2//var/www]  
Recherche de changements  
Avertissement : Aucun fichier d'archive n'a été trouvé pour ces racines, dont les noms canoniques sont :  
 /var/www  
 //server2//var/www  
Cela peut se produire soit  
pour la première fois que vous avez synchronisé ces racines,  
ou parce que vous avez mis à niveau Unison vers une nouvelle version avec un format d'archive différent.
La détection des mises à jour peut prendre un certain temps lors de cette exécution si les répliques sont  
grandes.
Unison supposera que l'état 'dernière synchronisation' des deux répliques  
était complètement vide. Cela signifie que tous les fichiers qui sont différents  
seront signalés comme des conflits, et tous les fichiers qui n'existent que sur une  
réplique seront jugés nouveaux et propagés à l'autre réplique.  
Si les deux répliques sont identiques, alors aucun changement ne sera signalé.
Si vous voyez ce message de manière répétée, cela peut être parce qu'une de vos machines  
obtient son adresse via DHCP, ce qui fait que son nom d'hôte change  
entre les synchronisations. Consultez la documentation pour la variable d'environnement UNISONLOCALHOSTNAME  
pour des conseils sur la façon de corriger cela.
Les dons au projet Unison sont acceptés avec gratitude :  
http://www.cis.upenn.edu/~bcpierce/unison
Appuyez sur retour pour continuer.[] <-- Appuyez sur Entrée
En attente de changements du serveur  
Réconciliation des changements
serveur local2  
dir ----> example.com [f] <-- Appuyez sur Entrée  
dir ----> example.de [f] <-- Appuyez sur Entrée
Procéder à la propagation des mises à jour ? [] <-- Entrez "y"  
Propagation des mises à jour

UNISON 2.40.102 a commencé à propager les changements à 10:17:17.94 le 25 sept. 2015  
[BGN] Copie de example.com de /var/www à //server2//var/www  
[BGN] Copie de example.de de /var/www à //server2//var/www  
Raccourci : copié /var/www/example.de/web/index.html depuis le fichier local /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html  
[END] Copie de example.de  
[END] Copie de example.com  
UNISON 2.40.102 a terminé la propagation des changements à 10:17:17.94 le 25 sept. 2015

Enregistrement de l'état du synchroniseur  
La synchronisation est terminée à 10:17:17 (2 éléments transférés, 0 ignorés, 0 échoués)

Vérifiez maintenant le répertoire /var/www sur server1 et server2, et vous devriez constater qu’ils sont maintenant synchronisés.

Bien sûr, nous ne voulons pas exécuter Unison de manière interactive, c’est pourquoi nous pouvons créer un fichier de préférences (/root/.unison/default.prf) qui contient tous les paramètres que nous devrions autrement spécifier sur la ligne de commande :

nano /root/.unison/default.prf
# Racines de la synchronisation
root = /var/www
root = ssh://192.168.1.102//var/www

# Chemins à synchroniser
#path = current
#path = common
#path = .netscape/bookmarks.html

# Quelques regexps spécifiant les noms et chemins à ignorer
#ignore = Path stats    ## ignore /var/www/stats
#ignore = Path stats/*  ## ignore /var/www/stats/*
#ignore = Path */stats  ## ignore /var/www/somedir/stats, mais pas /var/www/a/b/c/stats
#ignore = Name *stats   ## ignore tous les fichiers/répertoires qui se terminent par "stats"
#ignore = Name stats*   ## ignore tous les fichiers/répertoires qui commencent par "stats"
#ignore = Name *.tmp    ## ignore tous les fichiers avec l'extension .tmp

#          Lorsque ce paramètre est défini sur true, ce drapeau fait en sorte que l'interface utilisateur saute
#          la demande de confirmations sur les changements non conflictuels. (Plus
#          précisément, lorsque l'interface utilisateur a terminé de définir la
#          direction de propagation pour une entrée et est sur le point de passer à la
#          suivante, elle sautera toutes les entrées non conflictuelles et ira
#          directement au prochain conflit.)
auto=true

#          Lorsque ce paramètre est défini sur true, l'interface utilisateur ne posera aucune
#          question. Les changements non conflictuels seront propagés ;
#          les conflits seront ignorés.
batch=true

#          !Lorsque ce paramètre est défini sur true, Unison demandera une confirmation supplémentaire
#          s'il semble que l'ensemble de la réplique a été supprimé, avant de propager le changement. Si le drapeau batch est
#          également défini, la synchronisation sera annulée. Lorsque la préférence de chemin
#          est utilisée, la même confirmation sera demandée pour les chemins de premier niveau. (Pour le moment, ce drapeau n'affecte que
#          l'interface utilisateur texte.) Voir aussi la préférence de point de montage.
confirmbigdel=true

#          Lorsque cette préférence est définie sur true, Unison utilisera le
#          temps de modification et la longueur d'un fichier comme un `pseudo numéro d'inode`
#          lors de la recherche de mises à jour dans les répliques, au lieu de lire
#          le contenu complet de chaque fichier. Sous Windows, cela peut amener
#          Unison à manquer la propagation d'une mise à jour si le temps de modification
#          et la longueur du fichier sont tous deux inchangés par la mise à jour.
#          Cependant, Unison ne remplacera jamais une telle mise à jour par un
#          changement de l'autre réplique, car il effectue toujours une vérification
#          sécurisée des mises à jour juste avant de propager un changement. Ainsi, il est
#          raisonnable d'utiliser ce commutateur sous Windows la plupart du temps
#          et de faire occasionnellement fonctionner Unison une fois avec fastcheck défini sur false,
#          si vous craignez qu'Unison ait négligé une mise à jour.
#          La valeur par défaut de la préférence est auto, ce qui fait
#          qu'Unison utilise une vérification rapide sur les répliques Unix (où c'est sûr)
#          et une vérification lente sur les répliques Windows. Pour la compatibilité
#          ascendante, yes, no et default peuvent être utilisés à la place de
#          true, false et auto. Voir la section "Vérification rapide" pour plus
#          d'informations.
fastcheck=true

#          Lorsque ce drapeau est défini sur true, les attributs de groupe des
#          fichiers sont synchronisés. Que les noms de groupe ou les identifiants de groupe soient synchronisés
#          dépend de la préférence numerids.
group=true

#          Lorsque ce drapeau est défini sur true, les attributs de propriétaire des
#          fichiers sont synchronisés. Que les noms de propriétaire ou les identifiants de propriétaire soient synchronisés
#          dépend de la préférence extttnumerids.
owner=true

#          Inclure la préférence -prefer root fait en sorte qu'Unison résolve toujours
#          les conflits en faveur de root, plutôt que de demander des conseils à
#          l'utilisateur. (La syntaxe de root est la même que pour
#          la préférence root, plus les valeurs spéciales newer et older.)
#          Cette préférence est remplacée par la préférence preferpartial.
#          Cette préférence ne doit être utilisée que si vous êtes sûr de savoir
#          ce que vous faites !
prefer=newer

#          Lorsque cette préférence est définie sur true, l'interface utilisateur
#          texte n'imprimera rien du tout, sauf en cas d'erreurs.
#          Définir silent sur true définit automatiquement la préférence batch
#          sur true.
silent=true

#          Lorsque ce drapeau est défini sur true, les temps de modification des fichiers (mais pas
#          les temps de modification des répertoires) sont propagés.
times=true

Les commentaires devraient rendre le fichier explicatif, sauf pour les directives de chemin. Si vous ne spécifiez aucune directive de chemin, alors les répertoires dans les directives racines seront synchronisés. Si vous spécifiez des directives de chemin, alors les chemins sont relatifs au chemin racine (par exemple, root = /var/www et path = current se traduit par /var/www/current), et seuls ces sous-répertoires seront synchronisés, pas l’ensemble du répertoire spécifié dans la directive racine.

Vous pouvez en savoir plus sur les options disponibles en consultant la page de manuel d’Unison :

man unison

Maintenant que nous avons mis tous les paramètres dans un fichier de préférences (en particulier les directives racines (et éventuellement le chemin)), nous pouvons exécuter Unison sans aucun argument :

unison

5 Création d’un job Cron pour Unison

server1 :

Nous voulons automatiser la synchronisation, c’est pourquoi nous créons un job cron pour cela sur server1.example.com :

crontab -e
*/5 * * * * /usr/bin/unison &> /dev/null

Cela exécuterait Unison toutes les 5 minutes ; ajustez-le selon vos besoins (voir

man 5 crontab

). J’utilise le chemin complet vers unison ici (/usr/bin/unison) juste pour être sûr que cron sait où trouver unison. Votre emplacement d’unison peut différer. Exécutez

which unison

pour découvrir où se trouve le vôtre.

6 Tester Unison

Maintenant, je vais tester la synchronisation bidirectionnelle d’Unison pour voir si la configuration fonctionne entièrement.

Exécutez la commande suivante sur server1 pour créer un fichier test avec le contenu “Test 1” :

Server1

echo "Test 1" > /var/www/test.txt

Attendez maintenant au moins 5 minutes (car nous avons créé un job cron qui s’exécute toutes les 5 minutes). Ensuite, exécutez sur server2 :

cat /var/www/test.txt

pour afficher le contenu du fichier test.txt à l’écran. La sortie devrait être similaire à cette capture d’écran.

Sortie de la commande cat sur le serveur 2.

Maintenant, exécutez cette commande sur server2 qui met à jour le contenu de notre fichier test à “Test 2” :

Server2

echo "Test 2" > /var/www/test.txt

Et attendez au moins 5 minutes. Ensuite, exécutez la commande cat sur server1 :

Server1

cat /var/www/test.txt

La sortie devrait être comme indiqué sur la capture d’écran.

Sortie de la commande cat sur le serveur 1.

7 Liens

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.