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 :

  1. L’émetteur liste les fichiers et calcule des checksums glissants de petits blocs.
  2. Le récepteur vérifie quels blocs il possède déjà.
  3. Seuls les blocs manquants ou modifiés sont transmis.
  4. 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èleSignification
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/
FlagEffet
-aArchive : récursif + préserve permissions, propriétaire, horodatages, symlinks, périphériques
-vVerbose : affiche chaque fichier transféré
-zCompresse les données pendant le transfert (utile sur liens lents ; inutile sur LAN rapide)
-PAffiche la progression par fichier + conserve les fichiers partiels (--progress --partial combinés)
--deleteSupprime côté destination les fichiers absents de la source — crée un miroir exact
-n / --dry-runSimule le transfert sans effectuer de modifications
--exclude=MOTIFIgnore les fichiers correspondant au motif
--include=MOTIFForce l’inclusion même si un exclude plus large les ignorerait
-e sshUtilise SSH comme transport (par défaut dans rsync moderne ; ajoutez des options avec -e 'ssh -p 2222')
--checksumCompare le contenu des fichiers (pas seulement taille+mtime) ; plus lent mais détecte la corruption silencieuse
--bwlimit=KBPSLimite 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é
--statsAffiche 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-flagPréserve
-rRécursion
-lLiens symboliques comme liens symboliques
-pPermissions (bits chmod)
-tHorodatages de modification
-gPropriétaire du groupe
-oPropriétaire de l’utilisateur (nécessite root)
-DFichiers de périphérique et fichiers spéciaux

Pour les ACL et les attributs étendus :

rsync -aAX /source/ /destination/
Flag supplémentairePréserve
-AACL POSIX
-XAttributs étendus (xattrs)

--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érsyncscpsftpBorgBackuprclone
Transfert deltaOuiNonNonOui (dédup)Partiel
Reprendre les partielsOui (-P)NonOuiOuiOui
ChiffrementVia SSHSSHSSHAES-256 natifVia SSH/API
DéduplicationNonNonNonOuiNon
Snapshots incrémentielsOui (--link-dest)NonNonOuiNon
Backends cloudNonNonNonSSH seulementS3, GCS, beaucoup
Meilleur pourMiroir, sauvegardesCopie ponctuelleFichiers interactifsSauvegarde efficaceSync 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 -aAXz pour préserver toutes les métadonnées y compris les ACL et xattrs ; ajoutez -P pour les transferts reprennables.
  • Effectuez toujours un dry-run avec -n avant d’ajouter --delete à une nouvelle destination.
  • --link-dest cré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_keys avec 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.

Articles Connexes