Aller au contenu
Administration Linux medium

Maîtriser Rsync : Synchronisation Linux efficace

12 min de lecture

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

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

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 récemment
find /data -mtime -1 -type f -exec rsync -av {} backup:/ \;
# rsync + ssh personnalisé : port non standard
rsync -avz -e "ssh -p 2222" source/ user@server:/dest/

🧠 Modèle mental — Comment fonctionne rsync

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

Modèle mental rsync : Source → Filtres → Destination (ne transfère que les différences)

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 (priorité sur exclude)
--partial
Conserver les fichiers partiellement transférés
--append
Reprendre un transfert interrompu
--bwlimit
Limiter la bande passante (Ko/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
--ignore-errors
Continuer malgré les erreurs
-P
Équivalent à --partial --progress

L’algorithme delta : rsync divise les fichiers en blocs, calcule des checksums, et ne transfère que les blocs modifiés. Sur un fichier de 1 Go modifié à 1%, seuls ~10 Mo transitent.

Fenêtre de terminal
rsync [OPTIONS] SOURCE DESTINATION
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 :

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/
# ✅ Résultat : /backup/src/... (contenu directement)
rsync -av ~/projet/ /backup/
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/

Deux méthodes pour ignorer certains fichiers :

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 :

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.

⚠️ DANGER : sans test, vous pouvez perdre des données !

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 :

OptionComportement
--deleteSupprime avant le transfert
--delete-afterSupprime après le transfert (plus sûr)
--delete-excludedSupprime aussi les fichiers exclus

SSH est le transport par défaut pour les transferts distants :

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

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 connexions instables :

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 Ko/s)
rsync -avz --bwlimit=1000 source/ user@serveur:/dest/
# Reprendre un transfert coupé
rsync -avP --append source/ dest/

--link-dest crée des sauvegardes qui semblent complètes mais n’utilisent de l’espace que pour les fichiers modifiés :

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 :

#!/bin/bash
BACKUP_DIR="/backup"
SOURCE="/home/user/data"
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 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 : si vous avez 100 Go de données et 1% change par jour, une semaine de sauvegardes n’utilise que ~107 Go au lieu de 700 Go.

Exemple de sauvegarde quotidienne :

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 :

#!/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 && \
mv day.6 day.7 && mv day.5 day.6 && mv day.4 day.5 && \
mv day.3 day.4 && mv day.2 day.3 && mv day.1 day.2 && \
cp -al current day.1'
echo "=== Backup completed: $(date) ===" >> $LOG

Maintenant que vous maîtrisez les bases, voici des patterns prêts à l’emploi pour les cas d’usage fréquents.

Ces recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.

Synchronisation locale basique Base

Copier/mettre à jour un dossier vers un autre en local.

rsync -av ~/Documents/ /media/backup/Documents/
Formule rsync -av <source>/ <destination>/
Exemple
rsync -av ~/Documents/ /media/backup/Documents/
Paramètres
  • -a — Mode archive : récursif + préserve tout
  • -v — Verbose : affiche les fichiers traités
Envoi vers serveur distant Base

Transférer des fichiers vers un serveur via SSH.

rsync -avz ~/projet/ deployer@prod:/var/www/app/
Formule rsync -avz <source>/ user@serveur:<destination>/
Exemple
rsync -avz ~/projet/ deployer@prod:/var/www/app/
Paramètres
  • -z — Compression pendant le transfert
  • user@serveur: — Connexion SSH
Récupération depuis serveur distant Base

Télécharger des fichiers depuis un serveur.

rsync -avz root@backup:/var/backups/ ~/local-backups/
Formule rsync -avz user@serveur:<source>/ <destination>/
Exemple
rsync -avz root@backup:/var/backups/ ~/local-backups/
Paramètres
  • user@serveur: — Source distante
  • <destination>/ — Destination locale
Miroir exact avec suppression Inter.

Rendre la destination identique à la source (y compris suppressions).

rsync -av --delete ~/master/ /media/usb/mirror/
Formule rsync -av --delete <source>/ <destination>/
Exemple
rsync -av --delete ~/master/ /media/usb/mirror/
Paramètres
  • --delete — Supprime les fichiers absents de la source
Éviter si : TOUJOURS tester avec --dry-run d'abord
Exclusion de fichiers/dossiers Inter.

Ignorer certains fichiers pendant la synchronisation.

rsync -av --exclude "*.log" --exclude ".git/" src/ backup/
Formule rsync -av --exclude "pattern" <source>/ <destination>/
Exemple
rsync -av --exclude "*.log" --exclude ".git/" src/ backup/
Paramètres
  • --exclude — Pattern glob à exclure
  • --exclude-from — Fichier contenant les exclusions
Exclusions depuis un fichier Inter.

Gérer de nombreuses exclusions via un fichier dédié.

rsync -av --exclude-from=.rsyncignore ~/projet/ /backup/
Formule rsync -av --exclude-from=<fichier> <source>/ <destination>/
Exemple
rsync -av --exclude-from=.rsyncignore ~/projet/ /backup/
Paramètres
  • --exclude-from — Chemin vers le fichier d'exclusions
Sauvegarde incrémentielle Avancé

Créer des sauvegardes qui économisent l'espace avec des liens durs.

rsync -av --link-dest=/backup/2024-01-01 ~/data/ /backup/2024-01-02/
Formule rsync -av --link-dest=<backup-précédent> <source>/ <backup-nouveau>/
Exemple
rsync -av --link-dest=/backup/2024-01-01 ~/data/ /backup/2024-01-02/
Paramètres
  • --link-dest — Référence pour les liens durs
Reprise de transfert interrompu Inter.

Continuer un transfert qui a été coupé.

rsync -avP grosfichier.iso user@serveur:/data/
Formule rsync -avP <source>/ <destination>/
Exemple
rsync -avP grosfichier.iso user@serveur:/data/
Paramètres
  • -P — Équivalent à --partial --progress
  • --partial — Conserver les fichiers partiels
Limitation de bande passante Inter.

Ne pas saturer la connexion réseau.

rsync -avz --bwlimit=1000 ~/data/ backup-server:/data/
Formule rsync -avz --bwlimit=<KBPS> <source>/ <destination>/
Exemple
rsync -avz --bwlimit=1000 ~/data/ backup-server:/data/
Paramètres
  • --bwlimit — Limite en Ko/s
SSH personnalisé (port, clé) Avancé

Utiliser un port SSH différent ou une clé spécifique.

rsync -avz -e "ssh -p 2222 -i ~/.ssh/backup_key" ~/data/ backup@srv:/data/
Formule rsync -avz -e "ssh -p <port> -i <clé>" <source>/ user@serveur:<dest>/
Exemple
rsync -avz -e "ssh -p 2222 -i ~/.ssh/backup_key" ~/data/ backup@srv:/data/
Paramètres
  • -e — Commande de shell distant
  • -p — Port SSH
  • -i — Fichier de clé privée

Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.

--delete sans test préalable

rsync -av --delete source/ dest/ exécuté directement

Danger
Le piège : rsync -av --delete source/ dest/ exécuté directement
Symptôme : Fichiers importants supprimés sur la destination
Cause : --delete supprime tout ce qui n'est pas dans source
Correction : TOUJOURS tester avec --dry-run d'abord
rsync -av --delete --dry-run source/ dest/  # puis sans --dry-run
Inversion source/destination

rsync -av --delete backup/ source/ (inverse !)

Danger
Le piège : rsync -av --delete backup/ source/ (inverse !)
Symptôme : Écrasement des fichiers source par une vieille sauvegarde
Cause : Confusion entre source et destination
Correction : Toujours vérifier l'ordre : ce qui est à GAUCHE sera copié vers la DROITE
rsync -av source/ backup/
Le piège du slash final

rsync -av /source /destination vs rsync -av /source/ /destination

Attention
Le piège : rsync -av /source /destination vs rsync -av /source/ /destination
Symptôme : Un dossier source/ inattendu apparaît dans destination/
Cause : Sans slash : copie le dossier lui-même. Avec slash : copie le contenu.
Correction : Ajouter un slash à la source pour copier le contenu uniquement
rsync -av /source/ /destination/
Ordre des --include/--exclude

--exclude "*" --include "*.txt" n'inclut rien

Attention
Le piège : --exclude "*" --include "*.txt" n'inclut rien
Symptôme : Aucun fichier n'est copié malgré --include
Cause : rsync traite les règles dans l'ordre : exclude * matche tout avant include
Correction : Mettre --include AVANT --exclude
rsync -av --include "*.txt" --exclude "*" source/ dest/
Erreurs de permissions sur destination

rsync -av ~/files/ /backup/ en tant qu'utilisateur normal

Info
Le piège : rsync -av ~/files/ /backup/ en tant qu'utilisateur normal
Symptôme : Erreur "Permission denied" ou attributs non préservés
Cause : L'utilisateur n'a pas les droits d'écriture ou de chown sur la destination
Correction : Utiliser sudo ou --no-owner --no-group si les permissions importent peu
rsync -av --no-owner --no-group source/ dest/
Espaces dans les chemins distants

rsync -av user@srv:/path/with spaces/ local/

Info
Le piège : rsync -av user@srv:/path/with spaces/ local/
Symptôme : Erreur ou fichiers inattendus
Cause : Le shell interprète l'espace comme séparateur d'arguments
Correction : Échapper les espaces ou utiliser des guillemets
rsync -av "user@srv:/path/with\ spaces/" local/

🔧 Quand ça ne marche pas

Méthodes de debug

Simuler avec --dry-run

Voir ce qui serait fait sans rien modifier.

rsync -av --dry-run source/ dest/

Mode très verbose

Afficher tous les détails de la synchronisation.

rsync -avvv source/ dest/

Tester la connexion SSH

Vérifier que SSH fonctionne avant rsync.

ssh -v user@serveur "ls /chemin/"

Afficher les stats

Voir les statistiques de transfert.

rsync -av --stats source/ dest/

Erreurs fréquentes

rsync: mkstemp ... failed: Permission denied
Causes possibles
  • Pas de droits d'écriture sur le dossier destination
  • SELinux ou AppArmor bloque l'écriture
Diagnostic
  1. Vérifier les permissions : ls -la /destination
  2. Vérifier le contexte SELinux : ls -Z
✅ Solution

Utiliser sudo ou ajuster les permissions du dossier destination

Vérifier avec :
sudo rsync -av source/ dest/
rsync: failed to connect to serveur: Connection refused
Causes possibles
  • Le serveur SSH n'est pas démarré
  • Le pare-feu bloque le port SSH
  • Mauvais port SSH
Diagnostic
  1. Tester SSH : ssh user@serveur
  2. Vérifier le port : nc -zv serveur 22
✅ Solution

Démarrer sshd, ouvrir le pare-feu, ou spécifier le bon port

Vérifier avec :
rsync -avz -e "ssh -p 22" source/ user@serveur:/dest/
Host key verification failed
Causes possibles
  • Première connexion au serveur
  • Le serveur a été réinstallé (clé changée)
Diagnostic
  1. Se connecter en SSH pour accepter la clé
  2. Vérifier ~/.ssh/known_hosts
✅ Solution

ssh user@serveur une première fois pour accepter la clé

Vérifier avec :
ssh-keygen -R serveur && ssh user@serveur
rsync: write failed: No space left on device
Causes possibles
  • Disque destination plein
  • Quota utilisateur atteint
Diagnostic
  1. Vérifier l'espace : df -h
  2. Vérifier les quotas : quota -v
✅ Solution

Libérer de l'espace ou augmenter le quota

Vérifier avec :
df -h /destination

📋 Cheatsheet rsync

📝 Syntaxe :

rsync [OPTIONS] SOURCE DEST Format général de la commande
rsync ... user@host:path Transfert distant via SSH
source/ Copie le CONTENU de source
source Copie le DOSSIER source

🚀 Commandes types :

Synchronisation locale basique Copier/mettre à jour un dossier vers un autre en local.
rsync -av ~/Documents/ /media/backup/Documents/
Envoi vers serveur distant Transférer des fichiers vers un serveur via SSH.
rsync -avz ~/projet/ deployer@prod:/var/www/app/
Récupération depuis serveur distant Télécharger des fichiers depuis un serveur.
rsync -avz root@backup:/var/backups/ ~/local-backups/

⚙️ Options

-a (archive) Récursif + préserve tout rsync -a source/ dest/
-v (verbose) Affiche les fichiers traités rsync -av source/ dest/
-z (compress) Compresse pendant transfert rsync -avz source/ dest/
-n (dry-run) Simule sans modifier rsync -avn --delete source/ dest/
-P --partial + --progress rsync -avP gros.iso dest/
--bwlimit=KBPS Limiter bande passante --bwlimit=1000
--compress-level=N Niveau compression (0-9) --compress-level=1
--partial Conserver fichiers partiels --partial
-e "ssh ..." Personnaliser SSH -e "ssh -p 2222"
-e "ssh -i key" Clé SSH spécifique -e "ssh -i ~/.ssh/backup"
-c (checksum) Comparer par checksum rsync -avc source/ dest/
--stats Afficher statistiques rsync -av --stats source/ dest/

🔍 Filtres

--exclude "pattern" Exclure des fichiers --exclude "*.log"
--exclude-from=FILE Exclusions depuis fichier --exclude-from=.rsyncignore
--include "pattern" Inclure (avant exclude) --include "*.txt" --exclude "*"

⚡ Actions

--delete Supprime fichiers absents de source rsync -av --delete source/ dest/
--delete-after Supprime après le transfert rsync -av --delete-after source/ dest/
--update Ignore fichiers plus récents sur dest rsync -av --update source/ dest/

🔗 Composition

--link-dest=DIR Liens durs (incrémentiel) --link-dest=/backup/prev

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

5 questions
5 min.
80% 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

rsync est l’outil incontournable pour les sauvegardes et synchronisations sous Linux. Son algorithme delta le rend bien plus efficace que cp ou scp pour les mises à jour régulières, et son intégration native avec SSH en fait un choix idéal pour les transferts distants sécurisés. Maîtriser rsync, c’est disposer d’un outil fiable pour protéger vos données et automatiser vos déploiements.

Points clés à retenir :

  • -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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.