Synchronisation de fichiers · 10 min read · Dec 06, 2025
Configuration de la synchronisation de fichiers Unison entre deux serveurs sur Debian 10 (Buster)

Ce tutoriel montre comment configurer la synchronisation de fichiers entre deux serveurs Debian 10 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.0.100
- server2.example.com avec l’adresse IP 192.168.0.101
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 ait suffisamment de permissions pour synchroniser les permissions utilisateur et groupe.
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 en utilisant 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 :
Maintenant, nous créons 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 la même phrase secrète à nouveau : <– 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.0.101)' ne peut pas être établie.
L'empreinte de la clé ECDSA est 2b:3c:35:ad:3d:e2: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 à installer -- si vous êtes maintenant invité, 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 pour vous assurer 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.0.101//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.0.101//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
parce que c'est la première fois que vous synchronisez ces racines,
ou parce que vous avez mis à jour 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 'dernier synchronisé' 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 comme 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 dû au fait que l'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.48.4 a commencé à propager des changements à 13:24:01.10 le 05 mai 2020
[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.48.4 a terminé de propager des changements à 13:24:01.98 le 05 mai 2020
Enregistrement de l'état du synchroniseur
Synchronisation terminée à 13:24:01 (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.0.101//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 défini sur vrai, 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 à la prochaine conflit.)
auto=true
# Lorsque cela est défini sur vrai, l'interface utilisateur ne posera aucune
# question. Les changements non conflictuels seront propagés ;
# les conflits seront ignorés.
batch=true
# !Lorsque cela est défini sur vrai, 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.) Consultez également la préférence de point de montage.
confirmbigdel=true
# Lorsque cette préférence est définie sur vrai, 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 de propager 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 faux,
# si vous craignez qu'Unison ait pu négliger 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 des raisons de compatibilité
# ascendante, oui, non et par défaut peuvent être utilisés à la place de
# vrai, faux et auto. Voir la section "Vérification rapide" pour plus
# d'informations.
fastcheck=true
# Lorsque ce drapeau est défini sur vrai, 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 vrai, 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
# L'inclusion de 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 vrai, l'interface utilisateur
# texte n'imprimera rien du tout, sauf en cas d'erreurs.
# Définir silent sur vrai définit automatiquement la préférence batch
# sur vrai.
silent=true
# Lorsque ce drapeau est défini sur vrai, les temps de modification des fichiers
# (mais pas les modtimes 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 tout le 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 racine (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 de 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 de 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 :

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.