Comment utiliser Rsync pour synchroniser les répertoires locaux et distants
Introduction
Rsync, qui signifie remote sync, est un outil de synchronisation de fichiers distant et local. Il utilise un algorithme pour minimiser la quantité de données copiées en ne déplaçant que les portions de fichiers qui ont été modifiées.
Dans ce didacticiel, nous définirons Rsync, examinerons la syntaxe lors de l'utilisation de rsync
, expliquerons comment utiliser Rsync pour synchroniser avec un système distant et d'autres options à votre disposition.
Conditions préalables
Afin de pratiquer l'utilisation de rsync
pour synchroniser des fichiers entre un système local et distant, vous aurez besoin de deux machines pour agir respectivement comme votre ordinateur local et votre machine distante. Ces deux machines peuvent être des serveurs privés virtuels, des machines virtuelles, des conteneurs ou des ordinateurs personnels tant qu'ils ont été correctement configurés.
Si vous envisagez de suivre ce guide en utilisant des serveurs, il serait prudent de les configurer avec des utilisateurs administratifs et de configurer un pare-feu sur chacun d'eux. Pour configurer ces serveurs, suivez notre Guide de configuration initiale du serveur.
Quels que soient les types de machines que vous utilisez pour suivre ce tutoriel, vous devrez avoir créé des clés SSH sur les deux. Ensuite, copiez la clé publique de chaque serveur dans le fichier authorized_keys
de l'autre serveur comme indiqué dans Étape 2 de ce guide.
Ce guide a été validé sur des machines exécutant Ubuntu 20.04, bien qu'il devrait généralement fonctionner avec tous les ordinateurs exécutant un système d'exploitation basé sur Linux sur lequel rsync
est installé.
Définir Rsync
Rsync est un outil de synchronisation réseau très flexible. En raison de son omniprésence sur les systèmes Linux et de type Unix et de sa popularité en tant qu'outil pour les scripts système, il est inclus par défaut dans la plupart des distributions Linux.
Comprendre la syntaxe Rsync
La syntaxe de rsync
fonctionne de manière similaire à d'autres outils, tels que ssh
, scp
et cp
.
Tout d'abord, accédez à votre répertoire personnel en exécutant la commande suivante :
cd ~
Créez ensuite un répertoire de test :
mkdir dir1
Créez un autre répertoire de test :
mkdir dir2
Ajoutez maintenant quelques fichiers de test :
touch dir1/file{1..100}
Il y a maintenant un répertoire appelé dir1
avec 100 fichiers vides. Confirmez en listant les fichiers :
ls dir1
Outputfile1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Vous avez également un répertoire vide appelé dir2
. Pour synchroniser le contenu de dir1
avec dir2
sur le même système, vous exécuterez rsync
et utiliserez le drapeau -r
, qui signifie « récursif » et est nécessaire pour la synchronisation des répertoires :
rsync -r dir1/ dir2
Une autre option consiste à utiliser le drapeau -a
, qui est un drapeau combiné et signifie « archive ». Cet indicateur se synchronise de manière récursive et préserve les liens symboliques, les fichiers spéciaux et de périphérique, les heures de modification, les groupes, les propriétaires et les autorisations. Il est plus couramment utilisé que -r
et est l'indicateur recommandé à utiliser. Exécutez la même commande que dans l'exemple précédent, cette fois en utilisant le drapeau -a
:
rsync -a dir1/ dir2
Veuillez noter qu'il y a une barre oblique finale (/
) à la fin du premier argument dans la syntaxe des deux commandes précédentes et mis en évidence ici :
rsync -a dir1/ dir2
Cette barre oblique signifie le contenu de dir1
. Sans la barre oblique finale, dir1
, y compris le répertoire, serait placé dans dir2
. Le résultat créerait une hiérarchie comme celle-ci :
~/dir2/dir1/[files]
Une autre astuce consiste à revérifier vos arguments avant d'exécuter une commande rsync
. Rsync fournit une méthode pour ce faire en passant les options -n
ou --dry-run
. Le drapeau -v
, qui signifie "verbeux", est également nécessaire pour obtenir la sortie appropriée. Vous combinerez les indicateurs a
, n
et v
dans la commande suivante :
rsync -anv dir1/ dir2
Outputsending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .
Comparez maintenant cette sortie à celle que vous recevez lorsque vous supprimez la barre oblique finale, comme dans ce qui suit :
rsync -anv dir1 dir2
Outputsending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . .
Cette sortie montre maintenant que le répertoire lui-même a été transféré, plutôt que seulement les fichiers dans le répertoire.
Utilisation de Rsync pour synchroniser avec un système distant
Pour utiliser rsync
pour synchroniser avec un système distant, vous n'avez besoin que d'un accès SSH configuré entre vos machines locales et distantes, ainsi que rsync
installé sur les deux systèmes. Une fois que vous avez vérifié l'accès SSH entre les deux machines, vous pouvez synchroniser le dossier dir1
de la section précédente sur une machine distante en utilisant la syntaxe suivante. Veuillez noter que dans ce cas, vous souhaitez transférer le répertoire réel, vous omettez donc la barre oblique finale :
rsync -a ~/dir1 [email protected]_host:destination_directory
Ce processus est appelé une opération push car il "pousse" un répertoire du système local vers un système distant. L'opération opposée est pull, et est utilisée pour synchroniser un répertoire distant avec le système local. Si le répertoire dir1
se trouvait sur le système distant au lieu de votre système local, la syntaxe serait la suivante :
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
Comme cp
et des outils similaires, la source est toujours le premier argument et la destination est toujours le second.
- Utilisation d'autres options Rsync
Rsync fournit de nombreuses options pour modifier le comportement par défaut de l'utilitaire, telles que les options d'indicateur que vous avez apprises dans la section précédente.
Si vous transférez des fichiers qui n'ont pas encore été compressés, comme des fichiers texte, vous pouvez réduire le transfert réseau en ajoutant une compression avec l'option -z
:
rsync -az source destination
Le drapeau -P
est également utile. Il combine les drapeaux --progress
et --partial
. Ce premier indicateur fournit une barre de progression des transferts, et le second indicateur permet de reprendre les transferts interrompus :
rsync -azP source destination
Outputsending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .
Si vous exécutez à nouveau la commande, vous recevrez une sortie raccourcie car aucune modification n'a été apportée. Cela illustre la capacité de Rsync à utiliser les heures de modification pour déterminer si des modifications ont été apportées :
rsync -azP source destination
Outputsending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00
Supposons que vous deviez mettre à jour l'heure de modification de certains fichiers avec une commande comme celle-ci :
touch dir1/file{1..10}
Ensuite, si vous deviez exécuter à nouveau rsync
avec -azP
, vous remarquerez dans la sortie comment Rsync recopie intelligemment uniquement les fichiers modifiés :
rsync -azP source destination
Outputsending incremental file list file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101) file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101) . . .
Afin de garder deux répertoires vraiment synchronisés, il est nécessaire de supprimer les fichiers du répertoire de destination s'ils sont supprimés de la source. Par défaut, rsync
ne supprime rien du répertoire de destination.
Vous pouvez modifier ce comportement avec l'option --delete
. Avant d'utiliser cette option, vous pouvez utiliser -n
, l'option --dry-run
, pour effectuer un test afin d'éviter toute perte de données indésirable :
rsync -an --delete source destination
Si vous préférez exclure certains fichiers ou répertoires situés dans un répertoire que vous synchronisez, vous pouvez le faire en les spécifiant dans une liste séparée par des virgules en suivant l'option --exclude=
:
rsync -a --exclude=pattern_to_exclude source destination
Si vous avez un modèle spécifié à exclure, vous pouvez remplacer cette exclusion pour les fichiers qui correspondent à un modèle différent en utilisant l'option --include=
:
rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
Enfin, l'option --backup
de Rsync peut être utilisée pour stocker des sauvegardes de fichiers importants. Il est utilisé conjointement avec l'option --backup-dir
, qui spécifie le répertoire dans lequel les fichiers de sauvegarde doivent être stockés :
rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
Conclusion
Rsync peut rationaliser les transferts de fichiers via des connexions en réseau et ajouter de la robustesse à la synchronisation des répertoires locaux. La flexibilité de Rsync en fait une bonne option pour de nombreuses opérations différentes au niveau des fichiers.
Une maîtrise de Rsync vous permet de concevoir des opérations de sauvegarde complexes et d'obtenir un contrôle précis sur comment et ce qui est transféré.