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 nano3 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 dsaroot@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 server2Nombre de clé(s) ajoutée(s) : 1Essayez 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_keysroot@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@server14 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/wwwLa 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/unisonAppuyez sur retour pour continuer.[] <-- Appuyez sur Entrée En attente de changements du serveur
Réconciliation des changementsserveur local2
dir ----> example.com [f] <-- Appuyez sur Entrée
dir ----> example.de [f] <-- Appuyez sur EntréeProcé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=trueLes 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 unisonMaintenant 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 :
unison5 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/nullCela 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 unisonpour 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.txtAttendez 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.txtpour afficher le contenu du fichier test.txt à l’écran. La sortie devrait être similaire à cette capture d’écran.

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.txtEt attendez au moins 5 minutes. Ensuite, exécutez la commande cat sur server1 :
Server1
cat /var/www/test.txtLa sortie devrait être comme indiqué sur la capture d’écran.

7 Liens
- Unison : http://www.cis.upenn.edu/~bcpierce/unison/
- Debian : http://www.debian.org/
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.