Linux

Rsync — Synchronisation & sauvegarde

Maîtriser rsync pour synchroniser des fichiers en local ou à distance, créer des sauvegardes incrémentales et automatiser les transferts.

← Retour aux tutoriels Linux
📚 C'est quoi rsync ? rsync est un outil de synchronisation de fichiers ultra-efficace. Il ne transfère que les différences entre la source et la destination (transfert incrémental), ce qui le rend beaucoup plus rapide que cp ou scp pour les mises à jour régulières. Il fonctionne en local et via SSH pour les transferts réseau.
ⓘ Prérequis rsync est pré-installé sur la plupart des distributions Linux. Pour les transferts distants, SSH doit être configuré (voir le tutoriel SSH).

Synchronisation locale de base

# Syntaxe de base : rsync [options] source/ destination/
# Le slash final sur la source est IMPORTANT !

# Copie le contenu de /home/user/docs/ vers /backup/docs/
rsync -av /home/user/docs/ /backup/docs/
# -a = archive (préserve permissions, dates, liens symboliques)
# -v = verbose (affiche les fichiers transférés)

# Avec le slash : copie le CONTENU du dossier
rsync -av /home/user/docs/ /backup/docs/
# Résultat : /backup/docs/fichier1.txt

# Sans le slash : copie le DOSSIER lui-même
rsync -av /home/user/docs /backup/
# Résultat : /backup/docs/fichier1.txt (crée le sous-dossier)
⚠ Attention au slash ! La différence entre source/ (avec slash) et source (sans slash) est cruciale. Testez toujours avec --dry-run d'abord.

Synchronisation distante via SSH

# Envoie des fichiers locaux vers un serveur distant
rsync -avz /home/user/projet/ user@serveur:/backup/projet/
# -z = compresse les données pendant le transfert (plus rapide sur réseau lent)

# Récupère des fichiers depuis un serveur distant
rsync -avz user@serveur:/var/www/html/ /home/user/backup-site/

# Spécifie un port SSH personnalisé
rsync -avz -e "ssh -p 2222" /home/user/data/ user@serveur:/backup/

# Avec une clé SSH spécifique (pas de mot de passe demandé)
rsync -avz -e "ssh -i ~/.ssh/id_backup" /data/ user@serveur:/backup/

# Limite la bande passante à 5 Mo/s (pour ne pas saturer le réseau)
rsync -avz --bwlimit=5000 /data/ user@serveur:/backup/

Exclure des fichiers et dossiers

# Exclut des fichiers ou dossiers spécifiques
rsync -av --exclude='*.log' --exclude='.git' /projet/ /backup/projet/

# Exclut depuis un fichier liste (un pattern par ligne)
cat > /home/user/rsync-exclude.txt <<EOF
*.log
*.tmp
.git/
node_modules/
__pycache__/
.env
EOF

rsync -av --exclude-from='/home/user/rsync-exclude.txt' /projet/ /backup/projet/

# Inclut uniquement certains fichiers (exclut tout le reste)
rsync -av --include='*.php' --include='*.html' --exclude='*' /site/ /backup/
💡 Dry-run Ajoutez --dry-run (ou -n) pour simuler le transfert sans rien modifier. Idéal pour vérifier les exclusions.

Sauvegarde incrémentale avec rotation

#!/bin/bash
# Script de sauvegarde incrémentale avec rsync
# Garde les 7 derniers jours de backup, chaque jour ne copie que les changements

SOURCE="/var/www/"
DEST="/backup/www"
DATE=$(date +%Y-%m-%d)
LATEST="$DEST/latest"

# Crée le dossier de destination
mkdir -p "$DEST/$DATE"

# Sauvegarde incrémentale avec hard links
# --link-dest pointe vers le dernier backup : les fichiers inchangés
# seront des hard links au lieu de copies (économise de l'espace)
rsync -av --delete \
    --link-dest="$LATEST" \
    "$SOURCE" "$DEST/$DATE/"

# Met à jour le lien symbolique "latest" vers le dernier backup
ln -snf "$DEST/$DATE" "$LATEST"

# Supprime les backups de plus de 7 jours
find "$DEST" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;

echo "Backup terminé : $DEST/$DATE"
ⓘ --link-dest expliqué Grâce aux hard links, chaque backup « complet » n'utilise en réalité que l'espace des fichiers modifiés. 7 jours de backups peuvent ne peser qu'1,2× la taille originale au lieu de 7×.

Automatiser avec cron

# Ouvre l'éditeur crontab
crontab -e

# Ajoute une sauvegarde quotidienne à 2h du matin
0 2 * * * /home/user/scripts/backup-rsync.sh >> /var/log/rsync-backup.log 2>&1

# Sauvegarde toutes les 6 heures
0 */6 * * * rsync -az /data/ user@backup-server:/backup/data/

# Vérifie que le cron est bien enregistré
crontab -l
💡 Astuce Utilisez --delete avec prudence : cette option supprime de la destination les fichiers qui n'existent plus dans la source. Parfait pour un miroir exact, mais dangereux si vous vous trompez de sens.
✔ Résultat Vous maîtrisez rsync pour les synchronisations locales et distantes, les sauvegardes incrémentales avec rotation, et l'automatisation via cron.