TL;DR — Résumé Rapide
Guide rsync : algorithme delta, flags essentiels, sauvegardes SSH distantes, snapshots --link-dest, automatisation cron et mode daemon sous Linux.
rsync est l’outil standard Linux pour la copie efficace de fichiers et les sauvegardes distantes. Son algorithme de transfert delta calcule des checksums des deux côtés et n’envoie que les octets qui diffèrent — le rendant bien plus rapide que scp pour des transferts répétés d’arborescences volumineuses. Ce guide couvre tout, des flags de base aux scripts de sauvegarde incrémentielle en production avec rotation --link-dest.
Prérequis
- Système Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+ ou toute distro moderne).
- rsync installé sur les machines source et destination (
sudo apt install rsync/sudo dnf install rsync). - Authentification SSH par clé configurée pour les transferts distants.
- Accès root ou sudo pour les sauvegardes au niveau système.
Comment fonctionne rsync
rsync utilise l’algorithme de transfert delta pour minimiser les données envoyées sur le réseau :
- L’émetteur liste les fichiers et calcule des checksums glissants de petits blocs.
- Le récepteur vérifie quels blocs il possède déjà.
- Seuls les blocs manquants ou modifiés sont transmis.
- Les métadonnées (permissions, horodatages, propriétaire) sont synchronisées séparément.
Pour un grand répertoire qui ne change qu’à 1% par jour, rsync transfère typiquement moins de 1% du total lors des exécutions suivantes. Le premier transfert est toujours une copie complète ; chaque exécution suivante est incrémentielle par défaut.
Propriétés clés :
- Basé sur les checksums — détecte les modifications même si l’horodatage de modification n’a pas été mis à jour.
- Transfert atomique — les fichiers sont écrits sous un nom temporaire et renommés à la fin.
- Multiplateforme — fonctionne sur Linux, macOS et Windows (via WSL ou Cygwin).
- Version de protocole négociée — client et serveur s’accordent sur la version la plus haute supportée à la connexion.
Syntaxe de Base
rsync [OPTIONS] SOURCE DESTINATION
| Modèle | Signification |
|---|---|
rsync -a /src/ /dst/ | Copie le contenu de /src/ dans /dst/ |
rsync -a /src /dst/ | Copie le répertoire /src lui-même dans /dst/ |
rsync -a utilisateur@host:/distant/ /local/ | Récupère du distant vers le local |
rsync -a /local/ utilisateur@host:/distant/ | Envoie du local vers le distant |
Le slash final sur la source est important. /src/ signifie « copier le contenu de src » ; /src signifie « copier le répertoire src lui-même dans la destination ».
Flags Essentiels
rsync -avzP --delete \
--exclude='*.tmp' \
--exclude='.cache/' \
/home/utilisateur/ utilisateur@serveurbackup:/backups/home/
| Flag | Effet |
|---|---|
-a | Archive : récursif + préserve permissions, propriétaire, horodatages, symlinks, périphériques |
-v | Verbose : affiche chaque fichier transféré |
-z | Compresse les données pendant le transfert (utile sur liens lents ; inutile sur LAN rapide) |
-P | Affiche la progression par fichier + conserve les fichiers partiels (--progress --partial combinés) |
--delete | Supprime côté destination les fichiers absents de la source — crée un miroir exact |
-n / --dry-run | Simule le transfert sans effectuer de modifications |
--exclude=MOTIF | Ignore les fichiers correspondant au motif |
--include=MOTIF | Force l’inclusion même si un exclude plus large les ignorerait |
-e ssh | Utilise SSH comme transport (par défaut dans rsync moderne ; ajoutez des options avec -e 'ssh -p 2222') |
--checksum | Compare le contenu des fichiers (pas seulement taille+mtime) ; plus lent mais détecte la corruption silencieuse |
--bwlimit=KBPS | Limite l’utilisation de bande passante (ex. --bwlimit=10000 pour 10 Mo/s) |
--log-file=CHEMIN | Écrit un journal de transfert dans le fichier spécifié |
--stats | Affiche des statistiques récapitulatives à la fin du transfert |
Effectuez toujours un dry-run d’abord
rsync -avzn --delete /important/ utilisateur@host:/backup/important/
Examinez la sortie, puis relancez sans -n pour appliquer les modifications.
Synchronisation Distante via SSH
Envoyer (local → distant)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
/var/www/html/ \
backupuser@192.168.1.50:/backups/webroot/
Récupérer (distant → local)
rsync -avz -e "ssh -i ~/.ssh/backup_ed25519" \
backupuser@192.168.1.50:/backups/webroot/ \
/var/www/html/
Port SSH personnalisé
rsync -avz -e "ssh -p 2222" /src/ utilisateur@host:/dst/
Restreindre la clé SSH de sauvegarde
Dans ~/.ssh/authorized_keys sur le serveur de sauvegarde, préfixez la clé publique avec une commande forcée :
command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...clé...
Limitation de Bande Passante
# Limiter à 5 Mo/s
rsync -avz --bwlimit=5000 /source/ utilisateur@host:/dest/
# Limiter à 1 Mo/s pour les sauvegardes en arrière-plan
rsync -avz --bwlimit=1000 --delete /home/ utilisateur@host:/backups/home/
Pour une limitation plus dynamique :
nice -n 19 ionice -c 3 rsync -avz --bwlimit=2000 /source/ utilisateur@host:/dest/
Préserver les Permissions, le Propriétaire et les Attributs Étendus
Le flag -a est un raccourci pour -rlptgoD :
| Sous-flag | Préserve |
|---|---|
-r | Récursion |
-l | Liens symboliques comme liens symboliques |
-p | Permissions (bits chmod) |
-t | Horodatages de modification |
-g | Propriétaire du groupe |
-o | Propriétaire de l’utilisateur (nécessite root) |
-D | Fichiers de périphérique et fichiers spéciaux |
Pour les ACL et les attributs étendus :
rsync -aAX /source/ /destination/
| Flag supplémentaire | Préserve |
|---|---|
-A | ACL POSIX |
-X | Attributs étendus (xattrs) |
Sauvegardes Incrémentielles avec —link-dest
--link-dest permet des snapshots basés sur des liens durs — chaque répertoire quotidien ressemble à une copie complète mais seuls les fichiers nouveaux ou modifiés occupent de l’espace supplémentaire.
Concept
/backups/
2026-03-20/ ← données complètes, 50 Go
2026-03-21/ ← fichiers inchangés en lien dur + seulement les fichiers modifiés ; ~200 Mo extra
2026-03-22/ ← lié en dur depuis 2026-03-21 + modifications du jour ; ~150 Mo extra
Script
#!/bin/bash
set -euo pipefail
SOURCE="/home/"
DEST="backupuser@192.168.1.50:/backups"
AUJOURD_HUI=$(date +%Y-%m-%d)
HIER=$(date -d "yesterday" +%Y-%m-%d)
SSH_KEY="/root/.ssh/backup_ed25519"
rsync -avz \
-e "ssh -i $SSH_KEY" \
--link-dest="$DEST/daily/$HIER" \
--delete \
"$SOURCE" \
"$DEST/daily/$AUJOURD_HUI/"
echo "Sauvegarde terminée : $AUJOURD_HUI"
Rotation : quotidienne / hebdomadaire / mensuelle
#!/bin/bash
SOURCE="/home/"
BASE="/backups"
AUJOURD_HUI=$(date +%Y-%m-%d)
DOW=$(date +%u)
DOM=$(date +%d)
DEST_JOUR="$BASE/daily/$AUJOURD_HUI"
LIEN_DERNIER="$BASE/daily/latest"
rsync -a --delete \
--link-dest="$LIEN_DERNIER" \
"$SOURCE" "$DEST_JOUR/"
ln -sfn "$DEST_JOUR" "$LIEN_DERNIER"
[ "$DOW" -eq 7 ] && cp -al "$DEST_JOUR" "$BASE/weekly/$(date +%Y-W%V)"
[ "$DOM" -eq 01 ] && cp -al "$DEST_JOUR" "$BASE/monthly/$(date +%Y-%m)"
find "$BASE/daily" -maxdepth 1 -type d | sort | head -n -7 | xargs rm -rf
find "$BASE/weekly" -maxdepth 1 -type d | sort | head -n -4 | xargs rm -rf
find "$BASE/monthly" -maxdepth 1 -type d | sort | head -n -12 | xargs rm -rf
Automatisation avec cron et les Timers systemd
cron
crontab -e
# Ajouter :
0 2 * * * /usr/local/bin/rsync-backup.sh >> /var/log/rsync-backup.log 2>&1
Service + timer systemd
/etc/systemd/system/rsync-backup.service :
[Unit]
Description=Sauvegarde quotidienne rsync
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/rsync-backup.sh
StandardOutput=journal
StandardError=journal
/etc/systemd/system/rsync-backup.timer :
[Unit]
Description=Timer de sauvegarde quotidienne rsync
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=10min
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now rsync-backup.timer
Mode Daemon de rsync
Pour les volumes élevés ou les pulls planifiés sans authentification SSH interactive :
/etc/rsyncd.conf
uid = nobody
gid = nogroup
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log
[backups]
path = /backups/shared
comment = Zone de sauvegarde partagée
read only = no
auth users = clientbackup
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
hosts deny = *
chmod 600 /etc/rsyncd.secrets
systemctl enable --now rsync
Utilisation côté client
rsync -avz clientbackup@serveurbackup::backups /local/restaurer/
Surveillance et Journalisation
rsync -avz --stats /source/ /dest/ 2>&1 | tee /var/log/rsync-$(date +%Y%m%d).log
Vérifier les échecs dans les scripts
rsync -avz /source/ /dest/
EXIT=$?
if [ $EXIT -ne 0 ] && [ $EXIT -ne 24 ]; then
echo "rsync a échoué avec le code $EXIT" | mail -s "Sauvegarde échouée sur $(hostname)" admin@exemple.com
fi
Le code de sortie 24 (fichiers disparus pendant le transfert) est normal pour les systèmes actifs.
rsync vs scp vs sftp vs Borg vs rclone
| Fonctionnalité | rsync | scp | sftp | BorgBackup | rclone |
|---|---|---|---|---|---|
| Transfert delta | Oui | Non | Non | Oui (dédup) | Partiel |
| Reprendre les partiels | Oui (-P) | Non | Oui | Oui | Oui |
| Chiffrement | Via SSH | SSH | SSH | AES-256 natif | Via SSH/API |
| Déduplication | Non | Non | Non | Oui | Non |
| Snapshots incrémentiels | Oui (--link-dest) | Non | Non | Oui | Non |
| Backends cloud | Non | Non | Non | SSH seulement | S3, GCS, beaucoup |
| Meilleur pour | Miroir, sauvegardes | Copie ponctuelle | Fichiers interactifs | Sauvegarde efficace | Sync cloud |
Récapitulatif
- rsync utilise le transfert delta — seuls les blocs de fichiers modifiés sont envoyés, rendant les sauvegardes répétées très rapides.
- Utilisez
-aAXzpour préserver toutes les métadonnées y compris les ACL et xattrs ; ajoutez-Ppour les transferts reprennables. - Effectuez toujours un dry-run avec
-navant d’ajouter--deleteà une nouvelle destination. --link-destcrée des snapshots en liens durs économes en espace — la base des schémas de rotation professionnels.- Restreignez les clés SSH de sauvegarde dans
authorized_keysavec une commande forcée pour limiter le rayon d’impact. - Préférez les timers systemd à cron pour les sauvegardes automatisées — meilleure journalisation et gestion des exécutions manquées.
- Le code de sortie 24 est normal sur les systèmes actifs ; traitez-le comme un succès dans les scripts.