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 nano

3 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 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 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 server2
Nombre de clé(s) ajoutée(s) : 1
Essayez 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_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.0.101//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.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/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.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=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 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 unison

Maintenant 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 :

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 de 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.

Copie de fichiers entre serveurs via SSH avec unison sur Debian

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.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 :

Fichier synchronisé

7 Liens

Share: X/Twitter LinkedIn

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

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