Sauvegardes Linux automatisées avec rsync et crontab

Rsync sous Linux : synchroniser vos fichiers et automatiser vos sauvegardes

User avatar placeholder
Écrit par Vincent

Mis à jour le 2 octobre 2026

rsync est la commande Linux de référence pour copier et synchroniser des fichiers : elle compare la source et la destination, puis ne transfère que ce qui a changé, en local comme vers un serveur par SSH. Après la syntaxe et le piège du slash final, vous construirez une sauvegarde automatique avec cron, des instantanés datés et une restauration testée.

Toutes les commandes utilisent l’utilisateur alice, la source /home/alice/Documents/ et le point de montage /mnt/sauvegarde. Remplacez-les par vos propres chemins absolus.

L’essentiel
Commande clé : rsync -a --dry-run source/ destination/ — toujours simuler avant d’écrire.
Version actuelle : rsync 3.5.1 (21 septembre 2026). Les distributions stables livrent souvent une version plus ancienne, corrigée par leurs mises à jour de sécurité.
Prérequis : rsync installé des deux côtés pour une copie distante, cron pour l’automatisation, un support de destination monté.
Distributions couvertes : Ubuntu, Debian, Fedora, Arch Linux, openSUSE et Alpine.
Vérifié le 2 octobre 2026 avec rsync 3.5.1 et 3.2.7 (Ubuntu 24.04) : voir la dernière section.

Table des matières

Qu’est-ce que rsync et quand le préférer à cp ou scp ?

rsync copie des fichiers comme cp, mais commence par comparer la source et la destination. Par défaut, il considère qu’un fichier est inchangé si sa taille et sa date de modification sont identiques des deux côtés, et il ne transmet sur le réseau que les différences des fichiers modifiés. C’est ce qui rend une deuxième sauvegarde presque instantanée, là où cp ou scp recopient tout.

Besoincpscprsync
Copier vers une autre machine par SSHNonOuiOui
Ne recopier que ce qui a changéPartiel (-u compare la date)NonOui
Simuler sans rien écrireNonNonOui (--dry-run)
Reprendre un gros fichier interrompuNonNonOui (--partial)
Supprimer à destination ce qui a disparu de la sourceNonNonOui (--delete)
Exclure des fichiers par motifNonNonOui (--exclude)

Pour une copie ponctuelle sur la même machine, cp suffit. Pour envoyer une fois un fichier sur un serveur, scp reste le plus direct. Dès que la copie se répète ou doit être planifiée, rsync est le bon outil.

Installer rsync et cron selon votre distribution

Installez rsync, ainsi que le service cron qui servira à l’automatisation, avec le gestionnaire de paquets de votre distribution.

Ubuntu et Debian

Commande de terminal — actualiser l’index des paquets :

sudo apt update

Commande de terminal — installer rsync et cron :

sudo apt install rsync cron

Commande de terminal — activer et démarrer cron :

sudo systemctl enable --now cron.service

Fedora

Commande de terminal — installer rsync et cronie :

sudo dnf install rsync cronie

Commande de terminal — activer et démarrer crond :

sudo systemctl enable --now crond.service

Arch Linux

Commande de terminal — installer rsync et cronie :

sudo pacman -Syu rsync cronie

Commande de terminal — activer et démarrer cronie :

sudo systemctl enable --now cronie.service

openSUSE

Commande de terminal — installer rsync et cron :

sudo zypper install rsync cron

Commande de terminal — activer et démarrer cron :

sudo systemctl enable --now cron.service

Alpine Linux

Alpine fournit crond via BusyBox et utilise OpenRC. Les scripts de ce guide ont besoin de bash, de findmnt et flock (paquet util-linux) et de la commande date de GNU (paquet coreutils). Exécutez ces commandes avec les droits administrateur.

Commande de terminal — installer rsync et les outils requis :

apk add rsync util-linux coreutils bash

Commande de terminal — ajouter crond au démarrage et le lancer :

rc-update add crond default && rc-service crond start

Si crontab -e répond ensuite must be suid to work properly, installez aussi le paquet busybox-suid.

Pages officielles du paquet rsync : Debian, Fedora, Arch Linux, openSUSE et Alpine.

Vérifier la version installée

Commande de terminal — afficher la version de rsync :

rsync --version

Exemple de sortie sur Ubuntu 24.04 (première ligne) :

rsync  version 3.2.7  protocol version 31

Le numéro de version seul ne dit pas si votre rsync est sûr. Les versions 3.4.0 (janvier 2025), 3.4.3 (mai 2026) et 3.5.0 (août 2026) ont corrigé des vulnérabilités, dont certaines exploitables par un serveur malveillant lors d’une simple récupération de fichiers.

Les distributions stables reportent ces correctifs dans leur propre version : sur Ubuntu 24.04, le paquet 3.2.7-1ubuntu1.5 intègre les correctifs de sécurité de rsync 3.4.0 et 3.4.3, d’après son journal de modifications, mais pas encore ceux de 3.5.0 au 2 octobre 2026.

Gardez donc votre système à jour, et vérifiez au besoin qu’un correctif précis figure dans le paquet installé.

Commande de terminal — Debian et Ubuntu : lister les CVE corrigées dans le paquet installé :

zgrep -oE 'CVE-[0-9]{4}-[0-9]+' /usr/share/doc/rsync/changelog.Debian.gz | sort -u

Syntaxe de rsync et options essentielles

La forme générale est toujours la même : des options, une ou plusieurs sources, puis une destination. Une source ou une destination distante s’écrit utilisateur@serveur:chemin.

rsync [OPTIONS] SOURCE... DESTINATION
OptionEffet
-aMode archive : récursif, conserve droits, dates, liens symboliques et fichiers spéciaux, ainsi que les propriétaires lorsque rsync s’exécute en root du côté qui reçoit. Équivaut à -rlptgoD
-HConserve les liens physiques, que -a n’inclut pas
-vAffiche les fichiers traités
-n, --dry-runSimule : affiche ce qui serait fait sans rien écrire
-i, --itemize-changesDétaille la nature de chaque changement
-zCompresse pendant le transfert, utile sur une connexion lente
-hTailles lisibles, avec les suffixes K, M et G
-PRaccourci de --partial --progress : garde un fichier interrompu et affiche la progression
--deleteSupprime de la destination ce qui n’existe plus dans la source
--exclude=MOTIFIgnore les fichiers correspondant au motif
-e "ssh …"Choisit le shell distant et ses options
--link-dest=DIRCrée un lien physique vers DIR pour chaque fichier inchangé

-a ne conserve ni les ACL (-A) ni les attributs étendus (-X). Ajoutez ces options si vos fichiers en dépendent.

Le piège du slash final

C’est l’erreur la plus fréquente avec rsync. Un slash à la fin de la source signifie « le contenu de ce dossier ». Sans slash, rsync copie le dossier lui-même et crée un niveau supplémentaire dans la destination. Quand la source est un dossier, le slash final de la destination ne change rien.

Commande de terminal — avec slash : le contenu de Documents arrive directement dans copie-avec :

rsync -a Documents/ copie-avec/

Commande de terminal — sans slash : un dossier Documents est créé dans copie-sans :

rsync -a Documents copie-sans/

Fichiers obtenus, listés avec find copie-avec copie-sans -type f | sort :

copie-avec/projets/notes.txt
copie-avec/rapport.odt
copie-sans/Documents/projets/notes.txt
copie-sans/Documents/rapport.odt
Rsync avec et sans slash final : Documents/ copie le contenu du dossier, Documents crée un sous-dossier Documents dans la destination

Dans tous les exemples de ce guide, la source se termine par un slash.

Exemples rsync courants

Copier un dossier en local, en simulant d’abord

Commande de terminal — simulation sans aucune modification :

rsync -aHv --dry-run --itemize-changes "/home/alice/Documents/" "/mnt/sauvegarde/Documents/"

Exemple de sortie lors d’une première copie :

sending incremental file list
created directory /mnt/sauvegarde/Documents
cd+++++++++ ./
>f+++++++++ rapport.odt
cd+++++++++ projets/
>f+++++++++ projets/notes.txt

sent 154 bytes  received 77 bytes  462,00 bytes/sec
total size is 14  speedup is 0,06 (DRY RUN)

Chaque + signale un élément nouveau. Lors des passages suivants, une ligne comme >f.st...... indique un fichier dont la taille (s) et la date (t) ont changé. La mention (DRY RUN) sur la dernière ligne confirme que rien n’a été écrit. Une fois la liste vérifiée, lancez la copie réelle.

Commande de terminal — copie réelle :

rsync -aHv "/home/alice/Documents/" "/mnt/sauvegarde/Documents/"

Envoyer un dossier vers un serveur par SSH

rsync passe par SSH dès que la destination contient serveur:. rsync doit aussi être installé sur le serveur.

Commande de terminal — simulation de l’envoi :

rsync -aHv --dry-run "/home/alice/Documents/" alice@serveur.example.net:/home/alice/sauvegarde/

Commande de terminal — envoi réel, avec compression et progression :

rsync -aHzP "/home/alice/Documents/" alice@serveur.example.net:/home/alice/sauvegarde/

Récupérer un dossier depuis un serveur

Il suffit d’inverser la source et la destination.

Commande de terminal — rapatrier un dossier distant :

rsync -aHv alice@serveur.example.net:/home/alice/sauvegarde/ "/home/alice/restauration/"

Créer un miroir exact avec --delete

Attention : suppression de fichiers. --delete retire de la destination tout ce qui n’existe plus dans la source. Une suppression accidentelle dans la source est donc propagée à la sauvegarde au passage suivant. N’utilisez cette option que pour un miroir assumé, avec un historique séparé (voir les instantanés plus bas), et toujours après une simulation.

Commande de terminal — simulation obligatoire du miroir :

rsync -aHv --delete --dry-run --itemize-changes "/home/alice/Documents/" "/mnt/sauvegarde/Documents/"

Exemple de sortie :

sending incremental file list
*deleting   projets/notes.txt
>f.st...... rapport.odt
.d..t...... projets/

sent 124 bytes  received 47 bytes  342,00 bytes/sec
total size is 11  speedup is 0,06 (DRY RUN)

Chaque ligne *deleting correspond à un fichier qui serait supprimé de la sauvegarde. Ne lancez le miroir réel qu’après avoir relu cette liste.

Commande de terminal — miroir réel :

rsync -aHv --delete "/home/alice/Documents/" "/mnt/sauvegarde/Documents/"

Exclure proprement les caches et fichiers temporaires

Le bloc suivant répartit la commande sur plusieurs lignes : chaque ligne sauf la dernière se termine par un antislash.

Commande de terminal — simulation avec plusieurs exclusions :

rsync -aHv --dry-run --itemize-changes \
  --exclude='.cache/' \
  --exclude='node_modules/' \
  --exclude='*.tmp' \
  "/home/alice/Documents/" \
  "/mnt/sauvegarde/Documents/"

Utiliser un fichier d’exclusions

Au-delà de quelques motifs, un fichier dédié reste plus lisible et sert aussi au script automatique.

Commande de terminal — créer le répertoire de configuration :

install -d -m 700 "/home/alice/.config/rsync"

Fichier de configuration — contenu de /home/alice/.config/rsync/excludes.txt :

.cache/
node_modules/
*.tmp
*.log

Commande de terminal — tester le fichier d’exclusions :

rsync -aHv --dry-run --itemize-changes --exclude-from="/home/alice/.config/rsync/excludes.txt" "/home/alice/Documents/" "/mnt/sauvegarde/Documents/"

Vérifier que le support de sauvegarde est réellement monté

Tester l’existence de /mnt/sauvegarde ne suffit pas. Si le disque est débranché, ce dossier existe toujours sur la partition système et reçoit la sauvegarde au mauvais endroit, jusqu’à la remplir. findmnt confirme que le point exact est monté.

Commande de terminal — afficher le montage exact :

findmnt --mountpoint "/mnt/sauvegarde"

Exemple de sortie avec un disque ext4 :

TARGET          SOURCE     FSTYPE OPTIONS
/mnt/sauvegarde /dev/loop0 ext4   rw,relatime

Sur votre machine, SOURCE affiche le périphérique réel, par exemple /dev/sdb1.

Aucune sortie signifie que rien n’est monté à cet endroit.

Donner le support à votre utilisateur

Un disque formaté en ext4 appartient à root : sans réglage, alice ne peut rien y écrire et rsync s’arrête sur mkdir "/mnt/sauvegarde/Documents" failed: Permission denied (13). Donnez la racine du disque à votre utilisateur, une seule fois après le premier montage : ce réglage est enregistré sur le disque lui-même.

Commande de terminal — attribuer le support à alice :

sudo chown alice: "/mnt/sauvegarde"

Sur un disque en FAT, exFAT ou NTFS, chown ne s’applique pas : le propriétaire se règle dans les options de montage, et ces systèmes de fichiers ne conservent pas les droits Linux. Préférez ext4 pour une sauvegarde.

Un disque de sauvegarde quitte souvent les lieux ou finit revendu : s’il contient des données sensibles, pensez à chiffrer votre disque de sauvegarde avec LUKS avant d’y écrire.

Créer un script de sauvegarde rsync robuste

Le script ci-dessous utilise des chemins absolus, refuse de continuer si la source manque ou si le support n’est pas monté, teste l’écriture sur le disque, journalise chaque exécution et bloque les exécutions simultanées avec flock. Il n’emploie pas --delete. En simulation (--dry-run), il n’écrit rien sur le support : il vérifie le montage et liste ce qui serait copié.

Commande de terminal — créer les dossiers privés :

install -d -m 700 "/home/alice/.local/bin" "/home/alice/.local/state/sauvegarde-rsync" "/home/alice/.cache" "/home/alice/.config/rsync"

Fichier de script — contenu de /home/alice/.local/bin/sauvegarde-rsync.sh :

#!/usr/bin/env bash
set -Eeuo pipefail
IFS=$'\n\t'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

SOURCE="/home/alice/Documents/"
MOUNT_POINT="/mnt/sauvegarde"
DESTINATION="${MOUNT_POINT}/Documents/"
LOG_DIR="/home/alice/.local/state/sauvegarde-rsync"
LOG_FILE="${LOG_DIR}/sauvegarde.log"
LOCK_FILE="/home/alice/.cache/sauvegarde-rsync.lock"
EXCLUDE_FILE="/home/alice/.config/rsync/excludes.txt"

DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
  DRY_RUN=true
elif [[ $# -gt 0 ]]; then
  printf 'Usage : %s [--dry-run]\n' "$0" >&2
  exit 64
fi

for command_name in rsync findmnt flock; do
  if ! command -v "$command_name" >/dev/null 2>&1; then
    printf 'Commande requise absente : %s\n' "$command_name" >&2
    exit 69
  fi
done

mkdir -p "$LOG_DIR" "$(dirname "$LOCK_FILE")"
exec 9>"$LOCK_FILE"

if ! flock -n 9; then
  printf '[%s] Une sauvegarde est déjà en cours.\n' \
    "$(date --iso-8601=seconds)" | tee -a "$LOG_FILE" >&2
  exit 75
fi

touch "$LOG_FILE"
chmod 600 "$LOG_FILE"
exec >>"$LOG_FILE" 2>&1

timestamp() {
  date --iso-8601=seconds
}

on_error() {
  local status=$?
  printf '[%s] ÉCHEC ligne %s, code %s\n' \
    "$(timestamp)" "${BASH_LINENO[0]:-inconnue}" "$status" >&2
  exit "$status"
}
trap on_error ERR

MODE_LABEL=""
if [[ "$DRY_RUN" == true ]]; then
  MODE_LABEL=" (simulation)"
fi

printf '\n[%s] Début de la sauvegarde%s\n' \
  "$(timestamp)" "$MODE_LABEL"

if [[ ! -d "$SOURCE" ]]; then
  printf 'Source introuvable : %s\n' "$SOURCE" >&2
  exit 66
fi

MOUNT_TARGET="$(findmnt -rn -o TARGET -M "$MOUNT_POINT" || true)"
if [[ "$MOUNT_TARGET" != "$MOUNT_POINT" ]]; then
  printf 'Support non monté sur %s\n' "$MOUNT_POINT" >&2
  exit 72
fi
MOUNT_SOURCE="$(findmnt -rn -o SOURCE -M "$MOUNT_POINT")"

if [[ ! -w "$MOUNT_POINT" ]]; then
  printf 'Support non accessible en écriture : %s\n' "$MOUNT_POINT" >&2
  exit 73
fi

if [[ "$DRY_RUN" == false ]]; then
  mkdir -p "$DESTINATION"
  WRITE_TEST="${MOUNT_POINT}/.sauvegarde-rsync-test.$$"
  : >"$WRITE_TEST"
  rm -f -- "$WRITE_TEST"
fi

RSYNC_ARGS=(
  -aH
  --numeric-ids
  --human-readable
  --itemize-changes
)

if [[ -r "$EXCLUDE_FILE" ]]; then
  RSYNC_ARGS+=(--exclude-from="$EXCLUDE_FILE")
fi

if [[ "$DRY_RUN" == true ]]; then
  RSYNC_ARGS+=(--dry-run)
fi

printf '[%s] Support : %s monté sur %s\n' \
  "$(timestamp)" "$MOUNT_SOURCE" "$MOUNT_TARGET"

rsync "${RSYNC_ARGS[@]}" "$SOURCE" "$DESTINATION"

printf '[%s] Sauvegarde terminée avec succès\n' "$(timestamp)"

Le mode 700 réserve la lecture, l’écriture et l’exécution au seul propriétaire.

Commande de terminal — rendre le script exécutable :

chmod 700 "/home/alice/.local/bin/sauvegarde-rsync.sh"

Commande de terminal — première exécution obligatoire en simulation :

/home/alice/.local/bin/sauvegarde-rsync.sh --dry-run

Commande de terminal — lire le journal :

tail -n 20 "/home/alice/.local/state/sauvegarde-rsync/sauvegarde.log"

Lorsque le journal confirme la bonne source, le bon support et les fichiers attendus, lancez une première copie réelle.

Commande de terminal — première exécution réelle :

/home/alice/.local/bin/sauvegarde-rsync.sh

Si le disque n’est pas branché, le script s’arrête avec le code 72 et écrit Support non monté sur /mnt/sauvegarde dans le journal, sans rien copier. Si une exécution précédente tourne encore, la seconde s’arrête aussitôt avec le code 75.

Planifier la sauvegarde avec crontab

Cron démarre les tâches avec un environnement minimal, différent de celui de votre terminal : indiquez le script par son chemin absolu. Si la syntaxe des cinq champs ne vous est pas familière, notre guide de la syntaxe crontab et du diagnostic cron détaille les opérateurs et les raccourcis @.

Commande de terminal — ouvrir la crontab de l’utilisateur :

crontab -e

Fichier de configuration — sauvegarde quotidienne à 2 h :

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""

0 2 * * * /home/alice/.local/bin/sauvegarde-rsync.sh

D’autres fréquences s’obtiennent en changeant les champs de l’horaire : 0 * * * * toutes les heures, 0 3 * * 1 chaque lundi à 3 h, 0 8,20 * * * à 8 h et à 20 h.

Commande de terminal — contrôler la crontab enregistrée :

crontab -l

Le lendemain, relisez le journal : une ligne Début de la sauvegarde horodatée à 2 h prouve que cron a lancé le script, et la ligne Sauvegarde terminée avec succès qui suit, qu’il a abouti.

Sécuriser une sauvegarde rsync automatisée par SSH

Une tâche cron ne peut pas saisir de mot de passe : il lui faut une clé SSH sans phrase de passe. Une telle clé ne doit servir qu’à cela et être bridée côté serveur. Si OpenSSH n’est pas encore en place sur la machine distante, commencez par installer et durcir OpenSSH sur le serveur.

Créer une clé dédiée à la sauvegarde

Commande de terminal — préparer le dossier SSH :

install -d -m 700 "/home/alice/.ssh"

Commande de terminal — créer la clé dédiée, sans phrase de passe :

ssh-keygen -t ed25519 -a 100 -N '' -f "/home/alice/.ssh/id_ed25519_rsync" -C "rsync-cron@poste"

Cette clé n’est acceptable que parce que le serveur va la limiter à une seule action. Ne réutilisez jamais votre clé personnelle pour cet usage.

Vérifier la clé d’hôte du serveur

Commande de terminal — récupérer la clé d’hôte :

ssh-keyscan -t ed25519 backup.example.net > "/home/alice/.ssh/backup.example.net.hostkey"

Commande de terminal — afficher son empreinte :

ssh-keygen -lf "/home/alice/.ssh/backup.example.net.hostkey"

Comparez cette empreinte avec celle que l’administrateur du serveur vous communique par un autre canal. Ajoutez-la seulement si elles concordent.

Commande de terminal — enregistrer la clé d’hôte vérifiée :

cat "/home/alice/.ssh/backup.example.net.hostkey" >> "/home/alice/.ssh/known_hosts"

Restreindre la clé côté serveur avec rrsync

Sur le serveur, la clé sera rattachée à un compte dédié, sauvegarde, et enfermée par le script rrsync dans le seul répertoire /srv/sauvegardes/alice. Les commandes suivantes s’exécutent sur le serveur.

Commande de terminal — créer le compte dédié, avec /bin/sh comme shell :

sudo useradd -m -s /bin/sh sauvegarde

La documentation de rrsync déconseille bash comme shell de ce compte, car bash peut exécuter des fichiers de démarrage avant la commande forcée. Sur Debian et Ubuntu, /bin/sh est dash. Ailleurs, vérifiez avec readlink -f /bin/sh : si la réponse est bash, comme sur Fedora ou Arch Linux, installez le paquet dash et remplacez /bin/sh par /usr/bin/dash dans la commande.

Commande de terminal — autoriser la connexion par clé sans donner de mot de passe au compte :

sudo usermod -p '*' sauvegarde

useradd crée un compte verrouillé ; certains serveurs SSH configurés sans PAM refusent alors toute connexion, même par clé. L’étoile laisse le compte sans mot de passe utilisable, mais déverrouillé.

Commande de terminal — créer le répertoire de sauvegarde et le dossier SSH du compte :

sudo install -d -o sauvegarde -g sauvegarde -m 700 /srv/sauvegardes/alice /home/sauvegarde/.ssh

Commande de terminal — vérifier le chemin de rrsync :

command -v rrsync

Debian, Ubuntu et Arch Linux installent rrsync avec rsync ; Alpine le fournit dans un paquet séparé nommé rrsync. Si la commande n’affiche rien, cherchez le script dans la documentation du paquet rsync de votre distribution. rrsync est écrit en Python : python3 doit être présent sur le serveur.

Fichier de configuration — ligne à ajouter dans /home/sauvegarde/.ssh/authorized_keys sur le serveur :

command="/usr/bin/rrsync -wo -munge -no-del /srv/sauvegardes/alice",from="203.0.113.10",restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... rsync-cron@poste

Remplacez le chemin de rrsync par celui affiché, l’adresse IP par celle du poste et la clé publique par le contenu de id_ed25519_rsync.pub. Chaque élément ferme une porte :

  • restrict interdit le terminal interactif et toutes les redirections ;
  • from= n’accepte la clé que depuis l’adresse du poste ;
  • -wo n’autorise que l’écriture : une clé volée ne permet pas de télécharger vos sauvegardes ;
  • -munge rend inutilisables, côté serveur, les liens symboliques reçus, qui pourraient sinon pointer hors du répertoire autorisé ;
  • -no-del refuse --delete et les options --remove… : la clé ne permet pas de supprimer des fichiers.

-no-del n’empêche pas d’écraser un fichier existant, par exemple par une version vide : quelqu’un qui volerait la clé pourrait abîmer la copie distante. Contre ce risque, seuls des instantanés pris sur le serveur, hors de portée de cette clé, protègent l’historique. La contrepartie de -wo : la restauration ne passe pas par cette clé, mais par un accès administrateur au serveur. Restaurez alors avec rsync et l’option --munge-links, qui rétablit la cible d’origine des liens symboliques ; une copie avec cp les laisserait inutilisables.

Commande de terminal — sur le serveur, restaurer en rétablissant les liens symboliques :

sudo rsync -a --munge-links /srv/sauvegardes/alice/Documents/ /srv/restauration-alice/

Commande de terminal — protéger le fichier des clés autorisées :

sudo chown sauvegarde: /home/sauvegarde/.ssh/authorized_keys && sudo chmod 600 /home/sauvegarde/.ssh/authorized_keys

Mise à jour de sécurité. rsync 3.5.0 a corrigé une possibilité de sortir du répertoire imposé par rrsync (CVE-2026-53783). Au 2 octobre 2026, le paquet d’Ubuntu 24.04 n’intègre pas encore ce correctif d’après son journal de modifications. Sur Debian et Ubuntu, vérifiez sa présence avec la commande suivante, qui n’affiche rien tant qu’il manque, et appliquez les mises à jour dès leur publication.

Commande de terminal — vérifier la présence du correctif sur le serveur :

zgrep -m1 'CVE-2026-53783' /usr/share/doc/rsync/changelog.Debian.gz

Configurer le client SSH et tester

Fichier de configuration — bloc à ajouter à /home/alice/.ssh/config (créez le fichier s’il n’existe pas) :

Host sauvegarde-rsync
    HostName backup.example.net
    User sauvegarde
    IdentityFile /home/alice/.ssh/id_ed25519_rsync
    IdentitiesOnly yes
    BatchMode yes
    StrictHostKeyChecking yes
    ConnectTimeout 15

Commande de terminal — protéger la configuration :

chmod 600 "/home/alice/.ssh/config"

Commande de terminal — tester l’envoi distant sans écrire :

rsync -aH --dry-run --itemize-changes --exclude-from="/home/alice/.config/rsync/excludes.txt" "/home/alice/Documents/" "sauvegarde-rsync:Documents/"

Avec rrsync, le chemin distant est relatif au répertoire autorisé : Documents/ désigne /srv/sauvegardes/alice/Documents/ sur le serveur.

Commande de terminal — envoi réel après validation :

rsync -aH --exclude-from="/home/alice/.config/rsync/excludes.txt" "/home/alice/Documents/" "sauvegarde-rsync:Documents/"

Pour planifier cet envoi chaque nuit à 3 h, ajoutez cette ligne à la crontab présentée plus haut, sous les variables SHELL et PATH. La sortie de rsync, erreurs comprises, est ajoutée à un journal dédié.

Fichier de configuration — ligne de crontab pour l’envoi distant :

0 3 * * * rsync -aH --exclude-from="/home/alice/.config/rsync/excludes.txt" "/home/alice/Documents/" "sauvegarde-rsync:Documents/" >>"/home/alice/.local/state/sauvegarde-rsync/distant.log" 2>&1

Conserver un historique avec des instantanés --link-dest

Une sauvegarde unique ne protège pas d’un fichier abîmé il y a trois jours : la copie suivante écrase la bonne version. Les instantanés gardent un dossier complet par date, sans multiplier l’espace occupé : grâce à --link-dest, chaque fichier inchangé n’est qu’un lien physique vers l’instantané précédent. C’est une sauvegarde incrémentale dont chaque instantané se restaure seul.

Cette approche conserve vos fichiers. Pour le système lui-même (paquets, configuration, noyau), créer des points de restauration système avec Timeshift répond à un autre besoin.

Créer un instantané de façon atomique

Le script copie d’abord dans un dossier temporaire .partial-…, ne le renomme qu’en cas de succès, puis fait pointer le lien latest vers lui. Une copie interrompue ne peut donc jamais servir de base à la suivante.

Fichier de script — contenu de /home/alice/.local/bin/sauvegarde-snapshot.sh :

#!/usr/bin/env bash
set -Eeuo pipefail
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

SOURCE="/home/alice/Documents/"
MOUNT_POINT="/mnt/sauvegarde"
SNAPSHOT_ROOT="${MOUNT_POINT}/snapshots"
STAMP="$(date '+%Y-%m-%dT%H%M%S')"
FINAL="${SNAPSHOT_ROOT}/${STAMP}"
PARTIAL="${SNAPSHOT_ROOT}/.partial-${STAMP}"
LATEST="${SNAPSHOT_ROOT}/latest"
EXCLUDE_FILE="/home/alice/.config/rsync/excludes.txt"

if [[ "$(findmnt -rn -o TARGET -M "$MOUNT_POINT" || true)" != "$MOUNT_POINT" ]]; then
  printf 'Support non monté sur %s\n' "$MOUNT_POINT" >&2
  exit 72
fi

if [[ -e "$FINAL" ]]; then
  printf 'Un instantané porte déjà ce nom : %s\n' "$FINAL" >&2
  exit 73
fi

mkdir -p "$SNAPSHOT_ROOT"
mkdir "$PARTIAL"

cleanup_partial() {
  if [[ -d "$PARTIAL" ]]; then
    find "$PARTIAL" -xdev -type d ! -perm -u+w -exec chmod u+w {} +
    find "$PARTIAL" -xdev -depth -delete
  fi
}
trap cleanup_partial EXIT INT TERM

RSYNC_ARGS=(-aH --numeric-ids)
if [[ -r "$EXCLUDE_FILE" ]]; then
  RSYNC_ARGS+=(--exclude-from="$EXCLUDE_FILE")
fi

if [[ -L "$LATEST" ]]; then
  PREVIOUS="$(readlink -f "$LATEST")"
  case "$PREVIOUS" in
    "$SNAPSHOT_ROOT"/20??-??-??T??????)
      RSYNC_ARGS+=(--link-dest="$PREVIOUS")
      ;;
    *)
      printf 'Lien latest inattendu : %s\n' "$PREVIOUS" >&2
      exit 65
      ;;
  esac
fi

rsync "${RSYNC_ARGS[@]}" "$SOURCE" "$PARTIAL/"
mv -- "$PARTIAL" "$FINAL"
ln -sfn "$STAMP" "$LATEST"

trap - EXIT INT TERM
printf 'Instantané créé : %s\n' "$FINAL"

Commande de terminal — rendre le script exécutable :

chmod 700 "/home/alice/.local/bin/sauvegarde-snapshot.sh"

Commande de terminal — lancer un instantané :

/home/alice/.local/bin/sauvegarde-snapshot.sh

Pour vérifier que --link-dest fonctionne, comparez le nombre de liens d’un fichier inchangé : à partir du deuxième instantané, stat -c %h affiche 2 ou plus.

Commande de terminal — contrôler les liens physiques d’un fichier :

stat -c '%h %n' /mnt/sauvegarde/snapshots/20*/rapport.odt

Supprimer les instantanés de plus de 30 jours

La date d’un instantané se lit dans son nom, pas dans sa date de modification : rsync recopie la date du dossier source, si bien qu’un instantané créé aujourd’hui peut porter une date vieille de plusieurs mois.

Une sélection par find -mtime +30 supprimerait donc des instantanés récents. Le script suivant compare les noms à une date limite, épargne toujours l’instantané pointé par latest et propose un mode simulation.

Attention : suppression de fichiers. Ne planifiez jamais ce nettoyage avant d’avoir testé une restauration. Lancez-le d’abord avec --dry-run et relisez la liste.

Fichier de script — contenu de /home/alice/.local/bin/nettoyer-snapshots.sh :

#!/usr/bin/env bash
set -Eeuo pipefail
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

MOUNT_POINT="/mnt/sauvegarde"
SNAPSHOT_ROOT="${MOUNT_POINT}/snapshots"
KEEP_DAYS=30
DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
  DRY_RUN=true
elif [[ $# -gt 0 ]]; then
  printf 'Usage : %s [--dry-run]\n' "$0" >&2
  exit 64
fi

if [[ "$(findmnt -rn -o TARGET -M "$MOUNT_POINT" || true)" != "$MOUNT_POINT" ]]; then
  printf 'Support non monté sur %s\n' "$MOUNT_POINT" >&2
  exit 72
fi

CUTOFF="$(date -d "${KEEP_DAYS} days ago" '+%Y-%m-%dT%H%M%S')"
LATEST_TARGET="$(readlink -f "${SNAPSHOT_ROOT}/latest" || true)"

while IFS= read -r -d '' SNAPSHOT; do
  case "$SNAPSHOT" in
    "$SNAPSHOT_ROOT"/20??-??-??T??????) ;;
    *)
      printf 'Chemin refusé : %s\n' "$SNAPSHOT" >&2
      exit 65
      ;;
  esac
  NAME="${SNAPSHOT##*/}"
  if [[ "$NAME" < "$CUTOFF" && "$SNAPSHOT" != "$LATEST_TARGET" ]]; then
    if [[ "$DRY_RUN" == true ]]; then
      printf 'Serait supprimé : %s\n' "$SNAPSHOT"
    else
      printf 'Suppression : %s\n' "$SNAPSHOT"
      find "$SNAPSHOT" -xdev -type d ! -perm -u+w -exec chmod u+w {} +
      find "$SNAPSHOT" -xdev -depth -delete
    fi
  fi
done < <(find "$SNAPSHOT_ROOT" -mindepth 1 -maxdepth 1 -xdev -type d \
  -name '20??-??-??T??????' -print0)

Commande de terminal — rendre le script exécutable :

chmod 700 "/home/alice/.local/bin/nettoyer-snapshots.sh"

Commande de terminal — prévisualiser les suppressions :

/home/alice/.local/bin/nettoyer-snapshots.sh --dry-run

Commande de terminal — appliquer la rétention après vérification :

/home/alice/.local/bin/nettoyer-snapshots.sh

Tester une restauration avant de faire confiance à la sauvegarde

Une tâche cron sans erreur prouve seulement que le script s’exécute. Seule une restauration vérifiée prouve que les données sont récupérables. Restaurez d’abord dans un dossier isolé, jamais directement par-dessus vos fichiers de travail.

Restaurer dans un dossier de test et comparer

Commande de terminal — créer un dossier de test vide :

install -d -m 700 "/home/alice/restauration-test"

Commande de terminal — restaurer la sauvegarde dans ce dossier :

rsync -aH "/mnt/sauvegarde/Documents/" "/home/alice/restauration-test/"

Comparez ensuite la restauration à vos fichiers d’origine, juste après une sauvegarde. Comparer avec la sauvegarde elle-même ne prouverait rien : un fichier jamais sauvegardé manquerait des deux côtés.

Commande de terminal — comparer la source et la restauration par sommes de contrôle, sans rien modifier :

rsync -aHnci --delete --exclude-from="/home/alice/.config/rsync/excludes.txt" "/home/alice/Documents/" "/home/alice/restauration-test/"

-c compare le contenu des fichiers, et pas seulement leur taille et leur date. Associé à -n, --delete signale les fichiers en trop sans en supprimer aucun. Une sortie vide signifie que la restauration est identique à la source. En cas d’écart, chaque fichier différent ou en trop apparaît. Ici, rapport.odt a été modifié dans la restauration et brouillon.txt y a été ajouté :

*deleting   brouillon.txt
.d..t...... ./
>fcst...... rapport.odt

Le script de sauvegarde n’utilisant pas --delete, la sauvegarde conserve aussi les fichiers que vous avez supprimés de vos documents depuis la première sauvegarde : ils apparaissent comme des lignes *deleting sans être un défaut. Seuls les fichiers que vous n’avez pas supprimés vous-même doivent vous alerter.

Restaurer un fichier précis

Commande de terminal — simuler la restauration d’un fichier :

rsync -aH --dry-run --itemize-changes "/mnt/sauvegarde/Documents/rapport.odt" "/home/alice/Documents/rapport.odt"

Commande de terminal — restaurer le fichier :

rsync -aH "/mnt/sauvegarde/Documents/rapport.odt" "/home/alice/Documents/rapport.odt"

Restaurer depuis un instantané

Commande de terminal — lister les instantanés disponibles :

ls -1 "/mnt/sauvegarde/snapshots/"

Commande de terminal — restaurer le dernier instantané dans le dossier de test :

rsync -aH "/mnt/sauvegarde/snapshots/latest/" "/home/alice/restauration-test/"

Pour revenir à une date plus ancienne, remplacez latest par le nom de l’instantané voulu.

Erreurs courantes avec rsync et cron

Permission denied (publickey)

sauvegarde@backup.example.net: Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(232) [sender=3.2.7]

Le serveur refuse la clé présentée. Vérifiez que la clé publique figure bien dans authorized_keys du compte visé, que l’option from= correspond à l’adresse réelle du poste, et que IdentityFile pointe vers la bonne clé privée. Le numéro de ligne io.c(…) et la version entre crochets varient selon votre rsync.

rsync: command not found

bash: line 1: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(232) [sender=3.2.7]

Si le compte distant utilise sh plutôt que bash, la première ligne devient sh: 1: rsync: not found. Dans les deux cas, rsync n’est pas installé sur le serveur. Installez-le de l’autre côté avec la commande de sa distribution : la machine qui reçoit doit aussi exécuter rsync.

some files/attrs were not transferred (code 23)

rsync: [sender] send_files failed to open "/home/alice/Documents/prive.txt": Permission denied (13)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1356) [sender=3.2.7]

Le reste de la copie a réussi, mais au moins un fichier était illisible pour l’utilisateur qui lance rsync. La ligne qui précède le code 23 nomme le fichier : corrigez ses droits, ou excluez-le s’il n’a pas à être sauvegardé. Dans le script, ce code fait échouer l’exécution et apparaît dans le journal.

La tâche cron ne se lance pas

Les causes habituelles sont un service cron arrêté, un chemin relatif, un script non exécutable ou un support non monté. Testez le script dans un environnement aussi pauvre que celui de cron.

Commande de terminal — reproduire l’environnement minimal de cron :

env -i HOME="/home/alice" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" /home/alice/.local/bin/sauvegarde-rsync.sh --dry-run

Commande de terminal — rechercher les échecs dans le journal :

grep -E 'ÉCHEC|introuvable|non monté|absente|déjà en cours' "/home/alice/.local/state/sauvegarde-rsync/sauvegarde.log"

Comment ces commandes ont été vérifiées

Les commandes de ce guide ont été exécutées le 2 octobre 2026 sur Ubuntu 24.04. Côté poste, rsync 3.5.1 était compilé depuis les sources officielles ; côté serveur, rsync et rrsync étaient ceux du paquet Ubuntu (3.2.7), avec OpenSSH 9.6 sur la même machine. Le support de sauvegarde était un disque ext4 créé dans un fichier image et monté par root sur /mnt/sauvegarde. Chaque bloc a été extrait de cet article, et non retapé.

Seules adaptations : les noms de serveur pointaient vers la machine locale, l’adresse from= était 127.0.0.1 et les tâches cron étaient planifiées chaque minute.

ÉlémentNiveauVérification
Slash final de la sourceTestéArborescences comparées avec find
Simulations --dry-run et --deleteTestéSorties reproduites ci-dessus, aucune écriture constatée
Exclusions, en local et à distanceTestéFichiers exclus absents ; présents sans exclusion
Droits du supportTestéÉchec avant chown (code 11), réussite après, réglage conservé au remontage
Script de sauvegardeTestéSimulation sans écriture, copie réelle, refus sans support monté (code 72), seconde exécution simultanée refusée et journalisée (code 75), argument inconnu refusé (code 64), fichier illisible signalé (code 23)
Envoi et récupération par SSHTestéCopie dans les deux sens vérifiée
Clé restreinte par rrsync -wo -munge -no-delTestéEnvoi accepté ; lecture, --delete, chemin en .. et connexion interactive refusés ; lien symbolique neutralisé puis rétabli par une restauration --munge-links ; écrasement d’un fichier toujours possible, comme indiqué
Instantanés --link-destTestéLiens physiques constatés avec stat ; deuxième instantané dans la même seconde refusé (code 73) ; copie interrompue nettoyée malgré un dossier en lecture seule ; exclusions appliquées
Rétention par le nomTestéInstantanés récents conservés malgré une date de modification ancienne ; ancien instantané supprimé ; latest épargné ; argument inconnu refusé
Restauration et comparaison -cTestéSortie vide après restauration, écart détecté après modification
Planification cron, locale et distanteTestéDéclenchement réel par cron, nouveau fichier constaté dans les deux sauvegardes ; env -i vérifié
Messages d’erreurTestéReproduits en situation réelle avec rsync 3.2.7
Installation des paquetsTesté sur Ubuntu 24.04Activation par systemctl et autres distributions non exécutées : conforme à la documentation

Questions fréquentes sur rsync

rsync écrase-t-il les fichiers existants dans la destination ?

Oui, rsync remplace un fichier de la destination dès que sa taille ou sa date diffère de la source. Sans --delete, les fichiers présents uniquement dans la destination restent en place. Pour garder les anciennes versions, utilisez des instantanés plutôt qu’une copie unique.

Peut-on utiliser rsync sous Windows ?

Windows ne fournit pas rsync. Le plus simple est de l’utiliser dans WSL, où il s’installe et s’emploie comme sous Ubuntu ou Debian, avec les disques Windows accessibles sous /mnt/c.

Puis-je sauvegarder vers un service cloud avec rsync ?

Seulement si le service accepte rsync : rsync dialogue avec un autre rsync, en local, par SSH ou avec un démon rsync. Pour un stockage accessible uniquement par API, comme S3 ou Google Drive, utilisez plutôt rclone, en gardant les mêmes principes : simulation, journal, verrou et restauration testée.

Quelle différence entre rsync et la commande sync ?

sync ne copie rien : elle force l’écriture sur disque des données encore en mémoire tampon. Avant de débrancher un disque après une copie, démontez-le plutôt, ce qui effectue cette écriture.

Conclusion

Pour sauvegarder un poste Linux, rsync suffit à condition de l’encadrer : simulation systématique, contrôle du montage, verrou, journal et clé SSH bridée par rrsync. Ajoutez les instantanés --link-dest dès que vous voulez revenir à une version antérieure, et appuyez leur rétention sur le nom plutôt que sur la date de modification. Enfin, planifiez une restauration de test à intervalle régulier : c’est le seul contrôle qui prouve que la sauvegarde fonctionne.

Pour des machines virtuelles plutôt que des fichiers, sauvegardez-les avec Proxmox Backup Server. Et si les copies ralentissent une machine déjà chargée, voyez comment alléger la charge disque et processeur sous Linux.

Sources officielles

Vincent

Vincent est le créateur de MémoLinux. Venu de Windows par curiosité, il est resté sur Linux pour sa logique et le plaisir de comprendre ce qui se passe sous le capot. Il documente ici les commandes et les procédures qu’il utilise lui-même, avec leurs sources officielles et leur date de vérification.

Laisser un commentaire