Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

rsync : synchroniser et sauvegarder des fichiers

Par mis à jour le

Améliorer cette page

Quand on sauvegarde des serveurs, déploie des applications ou synchronise des dossiers entre machines, rsync est l'outil de référence. Contrairement à cp ou scp, rsync ne transfère que les différences : si 1% d'un fichier a changé, seul ce 1% traverse le réseau. Résultat : des sauvegardes rapides, reprises possibles si coupure, et un contrôle fin sur ce qui est copié.

  • Synchroniser des dossiers en local avec -av, et à distance avec -avz
  • Transférer vers/depuis un serveur distant via SSH
  • Exclure des fichiers avec --exclude et --exclude-from
  • Utiliser --delete pour un miroir exact (avec précautions)
  • Créer des sauvegardes incrémentielles avec --link-dest

rsync fait partie des outils de transfert et de sauvegarde sous Linux. Chaque outil a sa spécialité, et le premier tableau les place côte à côte. Le second répond à la question pratique : pour cette situation, quel outil prendre ? rsync l'emporte dès que le transfert se répète, parce que chaque passage ne renvoie que ce qui a changé.

CommandeSpécialitéQuand l'utiliser
rsyncSynchronisation intelligente (delta)Sauvegardes, déploiements, gros fichiers
cpCopie locale simpleFichiers ponctuels, scripts simples
scpCopie distante via SSHTransfert rapide one-shot
sftpSession de transfert interactive via SSHExplorer un serveur, plusieurs fichiers en une session
tarArchivage avec compressionCréer des archives, backups complets
ddCopie bit-à-bitImages disques, clonage bas niveau

Quand utiliser rsync plutôt que les autres :

SituationMeilleur outilPourquoi
Sauvegarde quotidiennersyncNe transfère que les changements
Copie d'un fichier vers serveurscp ou rsyncscp plus simple, rsync reprend si coupé
Synchronisation bi-directionnelleunisonrsync est unidirectionnel
Cloner un disqueddCopie bit-à-bit exacte
Archive compressée à envoyertar + sshUn seul fichier à transférer

Combinaisons fréquentes :

rsync se combine avec trois outils du quotidien : cron pour planifier, find pour choisir les fichiers, ssh pour le transport. La deuxième forme passe la liste de find à --files-from, qui conserve l'arborescence : un -exec rsync {} fichier par fichier déposerait tout à plat à la racine de la destination.

Fenêtre de terminal
# rsync + cron : sauvegarde automatique quotidienne
0 2 * * * rsync -avz --delete /data/ backup-srv:/backups/
# rsync + find : sauvegarder uniquement les fichiers modifiés depuis 24 h
find /data -mtime -1 -type f -printf '%P\n' | rsync -av --files-from=- /data/ backup:/data/
# rsync + ssh personnalisé : port non standard
rsync -avz -e "ssh -p 2222" source/ user@server:/dest/

Le modèle ci-dessous résume la commande : une source, des filtres qui décident de ce qui passe, une comparaison avec la destination, puis l'envoi des seules différences. Gardez l'ordre en tête, il est le même pour une copie locale et pour un transfert via SSH.

🧠 Modèle mental : Comment fonctionne rsync

rsync = Source → [Filtres] → Destination (ne transfère que les différences)

rsync lit la source, applique les filtres dans l'ordre, puis compare chaque fichier à la destination : taille et date identiques, le fichier est ignoré ; sinon seuls les blocs modifiés sont envoyés vers la destination.ouinonrsyncSOURCEdata/ · admin@web-01:/var/www/FILTRES--exclude · --include, dans l'ordretaille et dateidentiques ?fichier ignoréenvoi des blocsmodifiés seulementDESTINATION/backup/ · backup-srv:/backups/
Source · SVG
Échap pour fermer, + et − pour zoomer, défilement pour se déplacer. 100 %

Points clés

  • rsync compare les fichiers par taille et date (ou checksum avec -c)
  • Seuls les blocs modifiés sont transférés (algorithme delta)
  • Le slash final sur la source change tout : /source/ ≠ /source
  • Mode archive (-a) préserve permissions, dates, liens symboliques
  • Toujours tester avec --dry-run avant --delete
  • SSH est le transport par défaut pour les transferts distants

Règles d'or

1
Toujours tester avec --dry-run avant d'exécuter Surtout avec --delete qui supprime des fichiers sur la destination.
2
Attention au slash final sur la source /source/ copie le contenu, /source copie le dossier lui-même.

Vocabulaire essentiel

-a (archive)
Préserve permissions, dates, liens, récursif
-v (verbose)
Affiche les fichiers traités
-z (compress)
Compresse les données pendant le transfert
-n (dry-run)
Simule sans rien modifier
--delete
Supprime les fichiers absents de la source
--progress
Affiche la progression du transfert
📚 Pour aller plus loin : 12 options avancées
--exclude
Exclure des fichiers/dossiers par pattern
--exclude-from
Lire les exclusions depuis un fichier
--include
Inclure explicitement : la première règle qui correspond l'emporte, à placer avant --exclude
--partial
Conserver les fichiers partiellement transférés
--append
Ajouter à la fin d'un fichier qui ne fait que grossir (journaux), sans vérifier l'existant
--bwlimit
Limiter la bande passante (Kio/s)
--link-dest
Sauvegardes incrémentielles avec liens durs
-e ssh
Spécifier la commande SSH (port, clé...)
--inplace
Modifier les fichiers sur place (risqué)
-c (checksum)
Comparer par checksum au lieu de taille/date
--max-delete
Arrêter les suppressions au-delà de N fichiers (code de sortie 25)
-P
Équivalent à --partial --progress

L'algorithme delta : rsync divise les fichiers en blocs, calcule des sommes de contrôle, et ne transfère que les blocs modifiés. Sur un fichier de 1 Go modifié à 1 %, seuls ~10 Mo de données transitent, plus les sommes de contrôle. Cet algorithme ne sert qu'à travers le réseau : entre deux chemins locaux, le manuel indique que --whole-file est le comportement par défaut, car relire les deux fichiers coûterait plus cher que de recopier.

Deux règles gouvernent cette syntaxe. La source est toujours à gauche, la destination à droite : inverser les deux écrase les données de travail par une sauvegarde périmée. Et une seule des deux extrémités peut être distante : un transfert de serveur à serveur est refusé avec The source and destination cannot both be remote. et le code de sortie 1. Retenez aussi que le slash final sur la source change le résultat, point détaillé plus bas.

Fenêtre de terminal
rsync [OPTIONS] SOURCE DESTINATION

Le passage du local au distant ne change rien à la syntaxe : on ajoute simplement user@serveur: devant le chemin. rsync détecte le deux-points et bascule automatiquement sur SSH comme transport, sans option supplémentaire. C'est aussi ce qui explique une erreur courante : un chemin local contenant un deux-points est interprété comme une destination distante. rsync -av a:b/ /tmp/y/ tente ainsi une connexion vers une machine a et répond ssh: Could not resolve hostname a. Préfixez le chemin par ./ pour lever l'ambiguïté.

ScénarioSyntaxeExemple
Local → Localrsync source/ dest/rsync -av ~/docs/ /backup/docs/
Local → Distantrsync source/ user@srv:dest/rsync -avz ~/data/ admin@srv:/backup/
Distant → Localrsync user@srv:source/ dest/rsync -avz srv:/logs/ ~/local-logs/

C'est la source d'erreur n°1 avec rsync, parce qu'elle ne produit aucun message : la commande réussit, mais l'arborescence arrive décalée d'un niveau. Le tableau et le bloc ci-dessous montrent les deux résultats côte à côte.

CommandeRésultat
rsync -av source dest/Crée dest/source/... (copie le dossier)
rsync -av source/ dest/Copie le contenu dans dest/...

Règle simple : slash sur source = copie le contenu. Pas de slash = copie le dossier.

/backup/projet/src/...
rsync -av ~/projet /backup/
# Avec slash, résultat : /backup/src/... (contenu directement)
rsync -av ~/projet/ /backup/

Ces six options couvrent la quasi-totalité des usages, et l'ordre du tableau reflète leur fréquence réelle. Deux d'entre elles méritent une attention particulière. -a n'est pas une simple abréviation de « récursif » : il préserve permissions, propriétaires, horodatages et liens symboliques, ce qui est indispensable pour une sauvegarde restaurable. -n est le garde-fou : lancé une fois avant chaque commande destructrice, il coûte quelques secondes et évite les pertes irréversibles.

OptionSignificationUsage
-aArchiveMode standard : récursif + préserve permissions, dates, liens
-vVerboseAffiche les fichiers traités
-zCompressCompresse pendant le transfert (utile en réseau)
-nDry-runSimule sans modifier (indispensable avant --delete)
-PProgress + PartialAffiche progression + conserve fichiers partiels
--deleteSupprimerSupprime de dest ce qui n'existe plus dans source

La combo standard :

Fenêtre de terminal
# Sauvegarde locale basique
rsync -av ~/Documents/ /media/backup/Documents/
# Transfert distant avec compression
rsync -avz ~/projet/ deployer@prod:/var/www/app/
# Test avant suppression
rsync -avn --delete ~/master/ /backup/mirror/

L'atout de rsync sur un simple cp ou scp : il ne transfère que les différences. La première synchronisation copie tout, les suivantes ne touchent que ce qui a changé. Démonstration sur trois fichiers, sortie relevée sur Debian 13 (rsync 3.5.0) :

Fenêtre de terminal
# 1. Première synchro : tout est copié
$ rsync -av src/ dst/
sending incremental file list
created directory dst
./
app.conf
data.txt
logs/
logs/app.log
sent 320 bytes received 114 bytes 868.00 bytes/sec
total size is 24 speedup is 0.06
# 2. Rien n'a changé : aucun fichier n'est transféré
$ rsync -av src/ dst/
sending incremental file list
sent 149 bytes received 13 bytes 324.00 bytes/sec
total size is 24 speedup is 0.15
# 3. Un seul fichier modifié : seul lui repart
$ echo "listen 8443 ssl" > src/app.conf
$ rsync -av src/ dst/
sending incremental file list
app.conf
sent 220 bytes received 36 bytes 512.00 bytes/sec
total size is 28 speedup is 0.11

C'est ce qui rend rsync rapide et économe sur les gros volumes : sur une sauvegarde de plusieurs Go à travers le réseau, seuls les blocs modifiés circulent, pas les fichiers entiers. L'absence de nom de fichier à l'étape 2 prouve que rien n'a été retransféré.

Pour décider qu'un fichier a changé, rsync ne lit pas son contenu : il compare la taille et la date de modification. Un fichier réécrit avec le même nombre d'octets et la même date, à la seconde près, est donc ignoré en silence, ce que la mesure reproduit en recopiant la date avec touch -r. L'option -c force la comparaison par somme de contrôle et rattrape ce cas, au prix d'une relecture complète des deux côtés.

Deux méthodes permettent d'ignorer certains fichiers : des options --exclude sur la ligne de commande pour deux ou trois motifs, un fichier d'exclusions dès que la liste s'allonge ou se partage entre plusieurs scripts. Les motifs suivent la syntaxe glob, et c'est rsync qui les interprète, pas le shell.

Méthode 1 : options --exclude

Fenêtre de terminal
rsync -av --exclude '*.log' --exclude 'cache/' source/ dest/

Méthode 2 : fichier d'exclusions

Fenêtre de terminal
# Créer un fichier .rsyncignore
cat > .rsyncignore << 'EOF'
*.log
*.tmp
cache/
.git/
node_modules/
EOF
# Utiliser le fichier
rsync -av --exclude-from=.rsyncignore source/ dest/

Ordre des règles : --include doit venir avant --exclude, car rsync applique la première règle qui correspond. Mesuré sur les trois distributions : la forme incorrecte ne copie aucun fichier et ne signale rien.

Fenêtre de terminal
# Incorrect : exclude * matche tout avant include
rsync -av --exclude '*' --include '*.txt' source/ dest/
# Correct : include d'abord
rsync -av --include '*.txt' --exclude '*' source/ dest/

L'option --delete rend la destination identique à la source en supprimant les fichiers qui n'existent plus côté source. Le danger est réel : une erreur de chemin transforme la synchronisation en effacement, sans confirmation. D'où la règle en deux étapes, toujours dans cet ordre : prévisualiser avec -n, puis exécuter.

Fenêtre de terminal
# Étape 1 : TOUJOURS prévisualiser
rsync -avn --delete ~/source/ /backup/mirror/
# Vérifier la liste des fichiers qui seraient supprimés
# Étape 2 : exécuter seulement si la liste est correcte
rsync -av --delete ~/source/ /backup/mirror/

Variantes de --delete :

Depuis rsync 3.0.0, --delete seul équivaut à --delete-during : les suppressions ont lieu pendant le transfert, répertoire par répertoire, et non avant. --delete-before existe toujours mais force l'ancien algorithme de parcours non incrémental, plus gourmand en mémoire. Le vrai filet de sécurité n'est d'ailleurs aucune de ces variantes mais --max-delete=N, qui arrête les suppressions au-delà de N fichiers : rsync affiche Deletions stopped due to --max-delete limit (2 skipped) et sort avec le code 25.

OptionComportement
--deleteSupprime pendant le transfert, répertoire par répertoire (équivaut à --delete-during depuis rsync 3.0.0)
--delete-beforeSupprime avant le début du transfert, au prix de l'ancien parcours non incrémental
--delete-afterSupprime une fois le transfert terminé
--delete-excludedSupprime aussi les fichiers exclus du transfert
--max-delete=NArrête les suppressions au-delà de N fichiers, code de sortie 25

SSH est le transport par défaut pour les transferts distants : rsync lance ssh vers la machine désignée, puis démarre un second rsync à l'autre bout. rsync doit donc être installé des deux côtés, et tout ce que sait faire votre client SSH (clés, ~/.ssh/config, rebond) s'applique sans option supplémentaire.

Fenêtre de terminal
# Syntaxe de base
rsync -avz source/ user@serveur:/chemin/dest/
# Récupérer depuis un serveur
rsync -avz user@serveur:/var/log/ ~/logs-serveur/

SSH personnalisé (port différent, clé spécifique) : l'option -e remplace la commande de transport, ce qui permet de lui passer n'importe quelle option de ssh.

Fenêtre de terminal
# Port SSH non standard
rsync -avz -e "ssh -p 2222" source/ user@srv:/dest/
# Clé SSH spécifique
rsync -avz -e "ssh -i ~/.ssh/backup_key" source/ backup@srv:/data/
# Combiné
rsync -avz -e "ssh -p 2222 -i ~/.ssh/backup_key" source/ user@srv:/dest/

Pour les gros fichiers ou les connexions instables, trois options changent la donne. -P conserve le fichier partiel et affiche la progression, --bwlimit plafonne le débit en Kio/s (unités de 1 024 octets selon le manuel), et --append a un usage bien plus étroit qu'il n'y paraît.

Fenêtre de terminal
# -P = --partial + --progress
# --partial conserve les fichiers partiellement transférés
rsync -avP grosfichier.iso user@serveur:/data/
# Limiter la bande passante (en Kio/s)
rsync -avz --bwlimit=1000 source/ user@serveur:/dest/
# --append : réservé aux fichiers qui ne font que grossir (journaux)
rsync -av --append /var/log/app/ user@serveur:/archives/logs/

-P suffit à reprendre un transfert coupé : le fichier partiel conservé sert de base à l'algorithme delta au passage suivant. --append n'est pas un mode de reprise générique : il ajoute des octets à la fin sans jamais vérifier le contenu déjà présent, et corrompt donc silencieusement tout fichier qui aurait été modifié ailleurs qu'à sa fin. Réservez-le aux fichiers strictement croissants, ou utilisez --append-verify qui contrôle la partie existante par somme de contrôle.

--link-dest crée des sauvegardes qui semblent complètes mais n'utilisent de l'espace que pour les fichiers modifiés : chaque fichier identique à celui du répertoire de référence devient un lien dur vers lui. Un chemin relatif est résolu depuis la destination, et le répertoire parent de la destination doit exister, sinon rsync répond mkdir "/backup/auj" failed: No such file or directory (2) avec le code 11.

Fenêtre de terminal
# Structure de sauvegardes
/backup/
├── 2024-01-01/ # Sauvegarde complète
├── 2024-01-02/ # Liens durs vers 2024-01-01 + nouveaux fichiers
└── 2024-01-03/ # Liens durs vers 2024-01-02 + nouveaux fichiers
# Commande
rsync -av --link-dest=/backup/2024-01-01 ~/data/ /backup/2024-01-02/

Script de sauvegarde incrémentielle :

Au premier lancement, la sauvegarde de la veille n'existe pas encore : rsync affiche --link-dest arg does not exist: /backup/2026-09-29, fait une copie complète et sort avec le code 0. Le script n'a donc pas besoin de traiter ce cas à part.

#!/bin/bash
BACKUP_DIR="/backup"
SOURCE="/home/user/data"
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mkdir -p "$BACKUP_DIR"
# Créer la sauvegarde en utilisant l'ancienne comme référence
rsync -av --link-dest="$BACKUP_DIR/$YESTERDAY" \
"$SOURCE/" "$BACKUP_DIR/$TODAY/"

Économie d'espace : avec 100 Go de données dont 1 % change par jour, sept sauvegardes quotidiennes occupent ~106 Go (une copie complète, puis six fois 1 Go) au lieu de 700 Go. Le calcul suppose que ce 1 % tient dans peu de fichiers : un lien dur porte sur un fichier entier, et un fichier modifié d'un seul octet est recopié en totalité.

cron lance la commande à heure fixe, sans terminal : tout ce que rsync affiche doit donc partir dans un journal, sans quoi un échec passe inaperçu. Dans une crontab, le caractère % a un sens particulier et doit être échappé en \%, d'où la forme de la date ci-dessous.

Fenêtre de terminal
# Éditer la crontab
crontab -e
# Ajouter (sauvegarde à 2h du matin)
0 2 * * * rsync -avz --delete /data/ backup-server:/backups/$(date +\%Y-\%m-\%d)/ >> /var/log/rsync-backup.log 2>&1

Script complet avec rotation :

La rotation décale chaque instantané d'un jour, puis fige l'état courant avec cp -al, qui crée des liens durs au lieu de copier. Chaque mv est conditionné à l'existence du répertoire : sans cette précaution, les six premières nuits échoueraient faute de day.6. Rejoué sur neuf nuits consécutives sous Debian 13 : sept instantanés, le plus récent dans day.1, et les fichiers inchangés partagés par liens durs.

#!/bin/bash
# backup.sh - Sauvegarde avec rotation sur 7 jours
REMOTE="backup@srv:/backups"
SOURCE="/home/user/data"
LOG="/var/log/rsync-backup.log"
echo "=== Backup started: $(date) ===" >> "$LOG"
# Sauvegarde
rsync -avz --delete "$SOURCE/" "$REMOTE/current/" >> "$LOG" 2>&1
# Rotation (garder 7 jours)
ssh backup@srv 'cd /backups && rm -rf day.7 &&
for i in 6 5 4 3 2 1; do
if [ -d "day.$i" ]; then mv "day.$i" "day.$((i + 1))"; fi
done &&
cp -al current day.1'
echo "=== Backup completed: $(date) ===" >> "$LOG"

Ces erreurs reviennent constamment avec rsync. Les connaître à l'avance vous évite des pertes de données et des heures de diagnostic.

Fenêtre de terminal
rsync -av /source /destination

Symptôme : un dossier source/ inattendu apparaît dans destination/.

Cause : sans slash final, rsync copie le dossier lui-même ; avec slash, il copie son contenu.

Fenêtre de terminal
rsync -av /source/ /destination/
Fenêtre de terminal
rsync -av --delete source/ dest/

Symptôme : des fichiers importants disparaissent de la destination.

Cause : --delete supprime tout ce qui n'est pas présent dans la source, une erreur de chemin devient destructrice.

Fenêtre de terminal
rsync -av --delete --dry-run source/ dest/ # vérifier, puis relancer sans --dry-run
Fenêtre de terminal
rsync -av --delete backup/ source/

Symptôme : les fichiers de travail sont écrasés par une vieille sauvegarde.

Cause : confusion entre source et destination, rsync copie toujours ce qui est à gauche vers ce qui est à droite.

Fenêtre de terminal
rsync -av source/ backup/
Fenêtre de terminal
rsync -av --exclude "*" --include "*.txt" source/ dest/

Symptôme : aucun fichier n'est copié malgré le --include.

Cause : rsync applique les règles dans l'ordre ; --exclude "*" capture tout avant que --include ne soit évalué.

Fenêtre de terminal
rsync -av --include "*.txt" --exclude "*" source/ dest/
Fenêtre de terminal
rsync -av ~/files/ /opt/

Symptôme : une ligne rsync: [receiver] mkstemp "/opt/.app.conf.ms5nIm" failed: Permission denied (13) par fichier, puis la sortie avec le code 23.

Cause : l'utilisateur courant n'a pas le droit d'écrire dans la destination. rsync crée chaque fichier sous un nom temporaire avant de le renommer, d'où ce nom en .app.conf.XXXXXX. À ne pas confondre avec le propriétaire : un compte non root ne peut pas le conserver, et -a attribue alors les fichiers au compte courant sans aucune erreur.

Fenêtre de terminal
rsync -av ~/files/ ~/sauvegarde/ # destination accessible
rsync -av --rsync-path="sudo rsync" ~/files/ admin@srv:/opt/ # côté distant, si sudo est prévu pour rsync
Fenêtre de terminal
rsync -av user@srv:/path/with spaces/ local/

Symptôme : fichiers inattendus, ou un chemin introuvable côté distant.

Cause : le shell local découpe l'argument sur l'espace avant même que rsync ne le voie.

Fenêtre de terminal
rsync -av "user@srv:/path/with spaces/" local/

Les simples guillemets suffisent : depuis la version 3.2.4, rsync échappe lui-même les caractères actifs, espaces compris, dans les arguments transmis au shell distant. Ajouter une contre-oblique à la main aboutit à un double échappement : mesuré sur rsync 3.2.7 et 3.5.0, la commande répond change_dir "/srv/avec\ espaces" failed: No such file or directory (2) et sort avec le code 23. Sur un serveur équipé d'un rsync antérieur, l'option --old-args rétablit l'ancien comportement.

Garder rsync à jour : le réflexe sécurité 2026

Section intitulée « Garder rsync à jour : le réflexe sécurité 2026 »

rsync est un outil mûr, mais 2026 a été une année chargée pour sa sécurité. La version 3.4.3 (20 mai 2026) corrige six CVE, dont CVE-2026-43618 (CVSS v3.1 8.1, dépassement d'entier dans le décodeur de jetons compressés, atteignable depuis un simple pull) et CVE-2026-29518 (CVSS v4.0 7.3, race condition TOCTOU en mode daemon sans chroot). La 3.5.0 (13 août 2026), présentée par ses mainteneurs comme une « major security release », corrige ensuite 33 failles issues d'un audit du traitement des chemins et du protocole daemon : la plupart exploitent un lien symbolique posé par un utilisateur local qu'un rsync lancé en root finit par suivre. La 3.5.1 (21 septembre 2026) corrige les régressions de la 3.5.0 (source : fichier NEWS du projet).

Le numéro de version ne suffit pas à juger d'une machine : les distributions rétroportent les correctifs sans changer de version amont. Mesuré le 2026-09-30 :

Distributionrsync --version
Ubuntu 24.043.2.7, protocole 31
Debian 133.5.0, protocole 32
AlmaLinux 103.5.0, protocole 32
Fenêtre de terminal
rsync --version | head -1
# rsync version 3.5.0 protocol version 32

Sur Ubuntu, c'est le suivi de sécurité de la distribution qui fait foi (apt changelog rsync), pas le 3.2.7 affiché. Deux réflexes en découlent. D'abord, mettre rsync à jour sur les machines qui l'exposent (serveurs de sauvegarde, relais de transfert). Ensuite, ne jamais exposer un daemon rsync nu : la plupart des usages passent par SSH (rsync -e ssh), qui chiffre et authentifie le transfert. Le mode daemon (rsync://) reste réservé à des réseaux de confiance, idéalement derrière un pare-feu et avec chroot.

Ce lab vous fait manipuler rsync sur une arborescence réelle, de la synchronisation basique à la sauvegarde incrémentielle. Comptez 15 minutes.

Le script suivant crée une arborescence de test avec des fichiers de tailles et de dates variées, plus deux cas pièges : des fichiers à exclure et un nom qui contient une espace.

Fenêtre de terminal
# Créer le lab
mkdir -p ~/rsync-lab/{source,backup,remote-sim}
cd ~/rsync-lab/source
# Créer des fichiers variés
echo "Configuration principale" > config.conf
echo "Application logs" > app.log
dd if=/dev/zero of=data.bin bs=1M count=5 2>/dev/null
mkdir -p docs
echo "Documentation" > docs/readme.md
echo "Notes" > docs/notes.txt
# Fichiers à exclure
echo "Temporaire" > temp.tmp
mkdir -p cache
echo "Cache data" > cache/data.cache
# Fichier avec espace dans le nom
echo "Rapport important" > "rapport 2024.pdf"
# Fichier ancien
touch -d "30 days ago" docs/old-doc.md
echo "Lab créé dans ~/rsync-lab"
ls -laR ~/rsync-lab/source

Pour tout nettoyer à la fin : rm -rf ~/rsync-lab.

Les étapes s'enchaînent sur la même arborescence et l'état obtenu à chaque étape sert à la suivante : ne les prenez pas dans le désordre. Après chacune, comparez les deux dossiers avec diff -r ~/rsync-lab/source ~/rsync-lab/backup pour constater l'effet réel de l'option employée plutôt que de vous fier au message affiché.

  1. Synchronisation basique, copiez le contenu de source/ vers backup/ en mode archive : rsync -av ~/rsync-lab/source/ ~/rsync-lab/backup/. Tous les fichiers sont copiés avec leurs attributs préservés.

  2. Test avec --dry-run, simulez une synchronisation avec --delete sans rien modifier : rsync -av --delete --dry-run ~/rsync-lab/source/ ~/rsync-lab/backup/. La sortie affiche ce qui serait fait, sans toucher aux fichiers.

  3. Exclure des fichiers, synchronisez en ignorant les .tmp et le dossier cache/ : rsync -av --exclude "*.tmp" --exclude "cache/" ~/rsync-lab/source/ ~/rsync-lab/backup/. temp.tmp et cache/ ne sont pas copiés.

  4. Miroir exact avec --delete, créez un fichier orphelin puis synchronisez : touch ~/rsync-lab/backup/fichier-orphelin.txt suivi de rsync -av --delete ~/rsync-lab/source/ ~/rsync-lab/backup/. Le fichier orphelin est supprimé car absent de la source.

  5. Transfert distant (simulé en local), utilisez la compression : rsync -avz ~/rsync-lab/source/ ~/rsync-lab/remote-sim/. Pour un vrai serveur, la destination serait user@serveur:/chemin/, et avec un port SSH personnalisé : rsync -avz -e "ssh -p 2222" source/ user@serveur:/backup/.

  6. Afficher la progression, synchronisez data.bin avec la barre de progression : rsync -av --progress ~/rsync-lab/source/data.bin ~/rsync-lab/backup/. Taille, vitesse et pourcentage s'affichent pendant le transfert.

  7. Limiter la bande passante, transférez data.bin à 500 Kio/s maximum : rsync -avz --bwlimit=500 ~/rsync-lab/source/data.bin ~/rsync-lab/backup/. Le transfert est plafonné, utile pour ne pas saturer le réseau.

  8. Sauvegarde incrémentielle, créez une sauvegarde avec liens durs vers la précédente : rsync -av --link-dest=../backup ~/rsync-lab/source/ ~/rsync-lab/backup-new/. Les fichiers inchangés deviennent des liens durs, ce qui économise l'espace disque.

Ces exercices vont du réflexe de base à la sauvegarde professionnelle. Lisez l'énoncé, cherchez la commande, puis dépliez la solution pour vérifier.

Les deux premiers exercices posent les deux réflexes qui évitent presque toutes les pertes : le mode archive avec le slash final, et la simulation avant toute suppression.

Exercice 1, Première synchronisation. Synchronisez le dossier ~/Documents vers /media/backup/Documents en préservant les attributs.

Indice : -a pour archive, -v pour voir ce qui se passe.

Voir la solution
Fenêtre de terminal
rsync -av ~/Documents/ /media/backup/Documents/

-a préserve tout (permissions, dates, liens). N'oubliez pas le slash final sur la source.

Exercice 2, Test avant exécution. Simulez une synchronisation avec --delete sans rien modifier.

Indice : --dry-run (ou -n) simule sans modifier.

Voir la solution
Fenêtre de terminal
rsync -av --delete --dry-run ~/source/ ~/backup/

--dry-run est essentiel avant toute commande --delete : il montre l'impact réel sans risque.

Ces trois exercices combinent le transfert avec un filtre, la compression ou un miroir exact.

Exercice 3, Exclusion de fichiers. Synchronisez en excluant tous les fichiers .log et le dossier cache/.

Indice : --exclude peut être utilisé plusieurs fois.

Voir la solution
Fenêtre de terminal
rsync -av --exclude "*.log" --exclude "cache/" ~/source/ ~/backup/

--exclude accepte des motifs glob et se répète autant de fois que nécessaire.

Exercice 4, Transfert vers serveur distant. Envoyez le dossier ~/projet vers user@serveur:/var/www/app avec compression.

Indice : -z active la compression, utile sur le réseau.

Voir la solution
Fenêtre de terminal
rsync -avz ~/projet/ user@serveur:/var/www/app/

-z compresse les données pendant le transfert. SSH est le transport par défaut.

Exercice 5, Miroir exact. Créez un miroir exact de ~/master vers /backup/mirror en supprimant les fichiers obsolètes.

Indice : --delete supprime ce qui n'existe plus dans la source.

Voir la solution
Fenêtre de terminal
rsync -av --delete ~/master/ /backup/mirror/

--delete rend la destination identique à la source. Testez toujours avec --dry-run d'abord.

Ici le transfert doit tenir dans un contexte réel : un port SSH non standard et une connexion instable.

Exercice 6, SSH avec port personnalisé. Synchronisez vers un serveur qui utilise le port SSH 2222.

Indice : -e permet de spécifier la commande SSH.

Voir la solution
Fenêtre de terminal
rsync -avz -e "ssh -p 2222" ~/data/ user@serveur:/backup/

-e "ssh -p 2222" change le port. La même syntaxe accepte -i pour une clé privée dédiée.

Exercice 7, Transfert avec reprise. Transférez un gros fichier avec possibilité de reprise si la connexion est coupée.

Indice : -P combine --partial et --progress.

Voir la solution
Fenêtre de terminal
rsync -avP grosfichier.iso user@serveur:/data/

-P conserve les fichiers partiels et affiche la progression : le transfert reprend où il s'était arrêté.

Le dernier exercice construit une sauvegarde incrémentielle, celle qui permet de revenir à un état antérieur sans multiplier l'espace disque.

Exercice 8, Sauvegarde incrémentielle. Créez une sauvegarde datée utilisant des liens durs vers la précédente.

Indice : --link-dest référence la sauvegarde précédente.

Voir la solution
Fenêtre de terminal
rsync -av --link-dest=/backup/2024-01-01 ~/data/ /backup/2024-01-02/

--link-dest économise énormément d'espace : seuls les fichiers modifiés sont réellement dupliqués.

Quand un transfert échoue ou se comporte mal, ces méthodes de diagnostic et ces erreurs fréquentes couvrent la grande majorité des cas. Commencez par la méthode, qui dit où chercher, puis confrontez le message et le code de sortie au tableau.

Ces quatre commandes répondent chacune à une question différente. --dry-run répond à « qu'est-ce que rsync va faire ? », -vvv à « pourquoi ce fichier est-il retransféré ? », le test SSH séparé à « le problème vient-il de rsync ou du transport ? », et --stats à « combien a réellement circulé ? ». Commencez toujours par isoler le transport : un ssh user@serveur "ls" qui échoue rend inutile tout diagnostic côté rsync.

Fenêtre de terminal
# Simuler sans rien modifier
rsync -av --dry-run source/ dest/
# Mode très verbeux : tous les détails
rsync -avvv source/ dest/
# Tester la connexion SSH avant rsync
ssh -v user@serveur "ls /chemin/"
# Afficher les statistiques de transfert
rsync -av --stats source/ dest/

Deux de ces cinq erreurs concernent le transport, pas la copie elle-même : c'est le réflexe à garder quand un transfert distant échoue. rsync renvoie un code de sortie distinct pour chaque famille de problème, visible avec echo $? juste après la commande et documenté dans la section EXIT VALUES du manuel : 1 pour une erreur de syntaxe, 10 pour une erreur de socket, 11 pour une erreur d'entrée-sortie sur un fichier, 12 pour une erreur du protocole, 23 pour un transfert partiel dû à des erreurs, 24 quand des fichiers source ont disparu en cours de route, 25 quand la limite --max-delete a stoppé les suppressions. Si la connexion SSH échoue, c'est 255 qui remonte. Tous les messages du tableau ont été relevés sur rsync 3.2.7 et 3.5.0.

ErreurCause probableSolution
mkstemp "..." failed: Permission denied (13), code 23Pas de droits d'écriture sur la destination, ou SELinux/AppArmor bloqueViser un dossier accessible, ou --rsync-path="sudo rsync" côté distant
ssh: connect to host srv port 22: Connection refused, code 255sshd arrêté, pare-feu, ou mauvais port SSHDémarrer sshd, ouvrir le pare-feu, ou préciser le bon port avec -e "ssh -p ..."
failed to connect to srv (...): Connection refused (111), code 10URL rsync:// alors qu'aucun daemon rsync n'écoutePasser par SSH (user@srv:/chemin) ou démarrer le daemon
Host key verification failedPremière connexion, ou serveur réinstallé (clé changée)ssh-keygen -R serveur puis ssh user@serveur pour accepter la clé
write failed on "...": No space left on device (28), code 11Disque destination plein ou quota atteintVérifier avec df -h, libérer de l'espace ou augmenter le quota

À garder sous la main : la syntaxe générale, les options de base et les filtres les plus utilisés au quotidien.

Les deux dernières lignes sont celles à relire avant chaque commande de sauvegarde. La différence entre source/ et source ne provoque aucune erreur, elle produit simplement une arborescence décalée d'un niveau, souvent découverte plusieurs sauvegardes plus tard. Le slash sur la destination n'a, lui, aucun effet.

SyntaxeSignificationExemple
rsync [OPTIONS] SOURCE DESTFormat général de la commandersync -av source/ dest/
rsync ... user@host:pathTransfert distant via SSHrsync -avz data/ user@srv:/backup/
source/Copie le contenu de sourcersync -av source/ dest/
sourceCopie le dossier sourcersync -av source dest/

Ces options se cumulent librement, à une exception près : -c force la comparaison par somme de contrôle de tous les fichiers et annule l'optimisation par taille et date, ce qui allonge considérablement le traitement sur de gros volumes. Ne l'activez que pour vérifier une sauvegarde suspecte, jamais dans une tâche planifiée quotidienne.

SyntaxeSignificationExemple
-a (archive)Récursif + préserve toutrsync -a source/ dest/
-v (verbose)Affiche les fichiers traitésrsync -av source/ dest/
-z (compress)Compresse pendant le transfertrsync -avz source/ dest/
-n (dry-run)Simule sans modifierrsync -avn --delete source/ dest/
-P--partial + --progressrsync -avP gros.iso dest/
--bwlimit=RATELimite la bande passante (Kio/s par défaut)--bwlimit=1000
-c (checksum)Compare par checksumrsync -avc source/ dest/
--statsAffiche les statistiquesrsync -av --stats source/ dest/
-e "ssh ..."Personnalise SSH (port, clé)-e "ssh -p 2222"

Les filtres sont évalués dans l'ordre où ils apparaissent sur la ligne de commande, et la première règle qui correspond l'emporte. C'est la cause de la totalité des surprises sur --include et --exclude. Le motif suit la syntaxe glob du shell, mais c'est rsync qui l'interprète, pas le shell : entourez toujours vos motifs de guillemets pour qu'ils lui parviennent intacts.

SyntaxeSignificationExemple
--deleteSupprime les fichiers absents de la sourcersync -av --delete source/ dest/
--delete-afterSupprime après le transfertrsync -av --delete-after source/ dest/
--updateIgnore les fichiers plus récents sur la destinationrsync -av --update source/ dest/
--exclude "pattern"Exclut des fichiers--exclude "*.log"
--exclude-from=FILEExclusions depuis un fichier--exclude-from=.rsyncignore
--include "pattern"Inclut (à placer avant --exclude)--include "*.txt" --exclude "*"
--link-dest=DIRLiens durs pour sauvegarde incrémentielle--link-dest=/backup/prev

Vous maîtrisez rsync quand vous pouvez cocher chacun de ces points sans hésiter. Un point que vous ne cochez pas vous renvoie à la section correspondante plus haut.

  • Je sais utiliser -a, -v, -z pour une synchronisation standard.
  • Je sais tester avec --dry-run avant d'exécuter.
  • Je sais exclure des fichiers avec --exclude.
  • Je sais transférer vers et depuis un serveur distant.
  • Je sais utiliser --delete pour un miroir exact.
  • Je sais personnaliser SSH (port, clé).
  • Je sais reprendre un transfert interrompu avec -P.
  • Je sais faire des sauvegardes incrémentielles avec --link-dest.
  • Je comprends l'importance du slash final sur la source.
  • Je sais diagnostiquer une erreur de connexion SSH.
  • -avz : la combinaison standard (archive + verbose + compression)
  • Slash final : /source/ copie le contenu, /source copie le dossier
  • --dry-run : TOUJOURS tester avant --delete
  • --link-dest : sauvegardes incrémentielles économes en espace
  • -P : reprise possible des transferts interrompus
  • Taille et date : un fichier modifié sans changer ni l'une ni l'autre est ignoré, sauf avec -c
  • Codes de sortie : 23 transfert partiel, 25 limite --max-delete, 255 échec SSH

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Les réponses ci-dessous reprennent, sous forme de questions, les points qui reviennent le plus souvent : la syntaxe, le slash final, les filtres, la suppression avec --delete et la bande passante. Chacune tient seule et renvoie aux mesures faites plus haut.

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn