logo rss

Comment utiliser rsync avec des exemples

logo rsync

rsync (remote synchronization) est un puissant outil en ligne de commande permettant de copier et de synchroniser des fichiers et des répertoires sur des systèmes aussi bien locaux que distants.

Il est idéal pour copier des données et sauvegarder des serveurs de fichiers. Toutefois, il n’est pas adapté aux fichiers en cours d’utilisation, comme les bases de données ou les machines virtuelles en fonctionnement, car cela entraîne généralement des copies corrompues ou inutilisables.

Installer rsync

rsync n'est généralement pas préinstallé dans les distributions, donc la première chose à faire et de lancer l'installation.

  • Debian/Ubuntu :
user@host:~$ sudo apt install rsync
  • Arch Linux :
[root@host ~]# pacman -S rsync

Exemples

Copier un fichier

Commençons de façon simple, nous allons ici utiliser rsync pour copier un fichier présent dans le dossier /home/std/ vers /tmp/.

Schéma illustrant la copie d’un fichier myfile_source vers myfile_dest au moyen de la commande rsync -av sous GNU/Linux.
Illustration du transfert d’un fichier à l’aide de la commande rsync -av.
  • Ligne de commande :
user@host:~$ rsync -av /home/std/myfile_source /tmp/myfile_dest
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux

Copier un dossier

On pourra aussi utiliser rsync pour récursivement copier un dossier. Ici on copiera le dossier /home/std vers /tmp/.

Schéma montrant la copie récursive du dossier /home/std vers /tmp/folder_dest à l’aide de la commande rsync -av sous GNU/Linux.
Illustration de la copie d’un répertoire complet à l’aide de la commande rsync -av.
  • Ligne de commande :
user@host:~$ rsync -av /home/std/ /tmp/folder_dest
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux

Copie à travers le réseau

Plus intéressant, nous pouvons utiliser rsync pour copier des fichiers ou dossiers à travers le réseau. Pour cela, rsync doit être installé sur les deux hôtes et un serveur ssh doit être fonctionnel sur l'hôte distant.

Schéma montrant le transfert des fichiers de /home/std sur un PC vers /data/std sur un NAS au moyen de la commande rsync -av -e 'ssh -p 22'.
Illustration du transfert de fichiers vers un NAS distant à l’aide de la commande rsync -av -e 'ssh -p 22'.
  • Ligne de commande :
user@host:~$ rsync -av -e 'ssh -p 22' /home/std user@192.168.1.100:/data/
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux
    • -e : Spécifie le shell distant à utiliser, permet aussi de préciser le port ssh (utile si le serveur distant écoute sur un port spécifique)

Autres

  • Copier les fichiers depuis l'hôte distant vers l'hôte local :
user@host:~$ rsync -av -e 'ssh -p 22' user@192.168.1.100:/data/std /home/

Les sauvegardes

Comme expliqué précédemment, rsync est particulièrement adapté à la sauvegarde des serveurs de fichiers. Nous allons voir ici comment réaliser une sauvegarde vers un disque USB, un hôte distant et également comment utiliser les sauvegardes incrémentales dans le but de réduire la consommation de l'espace disque de la destination.

Sauvegarder vers un disque USB

Nous allons ici réaliser une sauvegarde complète d'un système GNU/Linux. Nous exclurons de la sauvegarde les dossiers spéciaux ou inutiles (/dev, /mnt, /proc, /sys et /tmp). Le dossier de destination sur le disque USB sera automatiquement nommé avec la date du jour et aura le format suivant : back-YYYY-MM-dd.

Schéma montrant une sauvegarde complète du système vers un périphérique USB à l’aide de rsync, avec plusieurs répertoires exclus et la création d’un dossier de sauvegarde daté sur la clé USB.
Illustration d’une sauvegarde complète du système vers un périphérique USB à l’aide de la commande rsync -av avec des répertoires exclus.
  • Ligne de commande (la source est / et la destination /mnt/usb/) :
root@host:~# rsync -av --delete --delete-excluded --exclude=/tmp --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/mnt / /mnt/usb/back-$(date "+%Y-%m-%d")
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux
    • --exclude=MOTIF : exclut les fichiers correspondant au MOTIF.
    • --delete (optionnel ici) : efface les fichiers (sur la destination) qui n'existent pas chez l'émetteur
    • --delete-excluded (optionnel ici) : efface également les fichiers exclus côté réception (sur la destination)

Sauvegarde incrémentales

Une des fonctionnalités les plus intéressante de rsync est qu'il est capable de réaliser des sauvegardes incrémentales. Pour ce faire, il utilise les hardlinks. Pour chaque fichier à sauvegarder, rsync le comparera à celui de la dernière sauvegarde (le dossier pointé par le lien symbolique current sur le disque USB (cad la dernière sauvegarde)) : si le fichier est identique, il créera un hardlink et donc n'utilisera pas d'espace disque supplémentaire, dans le cas ou le fichier est nouveau ou est différent il créera un nouveau fichier.

Bien sûr le lien symbolique current devra initialement être créé manuellement et mis à jour après chaque sauvegarde dans le but de le faire pointer à chaque fois vers la dernière sauvegarde en date.

Comme on peut le voir sur le diagramme, la première sauvegarde fera office de complète et prendra le plus de place (10Go ici), puis les autres sauvegardes ne consommeront que la différence (1Go dans cet exemple).

Une dernière chose à savoir, dans le cas ou l'on souhaite libérer de la place sur le disque USB il faudra supprimer les sauvegardes de la plus ancienne à la plus récente (pour éviter de casser les hardlinks).

  • Les trois phases pour réaliser des sauvegardes rsync incrémentales :
    • PRE-BACKUP : le disque USB est monté sur /mnt/usb/
    • BACKUP : on lance la sauvegarde rsync, rsync utilise le lien symbolique current qui pointe sur la dernière sauvegarde qui est ici back-2025-11-28.
    • POST-BACKUP : une fois la sauvegarde rsync terminée, nous devons mettre à jour le lien symbolic current afin de le faire pointer vers notre dernière sauvegarde qui est ici back-2025-11-29.
Schéma montrant les trois phases d’un flux de sauvegarde incrémentielle rsync : préparation pré-sauvegarde, sauvegarde utilisant link-dest, et mise à jour post-sauvegarde du lien symbolique current sur le périphérique USB.
Illustration du processus de sauvegarde incrémentielle en trois phases utilisant rsync et --link-dest.

Sauvegarde vers un disque USB avec incrémentales

C'est l'application détaillée de ce que nous avons vu juste au-dessus.

Schéma montrant une sauvegarde incrémentielle rsync vers un périphérique USB à l’aide de link-dest, avec des répertoires système exclus et la création d’un dossier de sauvegarde daté.
Illustration d’une sauvegarde incrémentielle vers un périphérique USB à l’aide de rsync et de --link-dest.
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux
    • --exclude=MOTIF : exclut les fichiers correspondant au MOTIF.
    • --delete : efface les fichiers (sur la destination) qui n'existent pas chez l'émetteur
    • --delete-excluded : efface également les fichiers exclus côté réception (sur la destination)
  • La ligne de commande pour la sauvegarde (la source est / et la destination /mnt/usb/ :
user@host:~$ rsync -av --delete --delete-excluded --exclude=/tmp --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/mnt --exclude=/media --link-dest=/mnt/usb/current / /mnt/usb/back-$(date "+%Y-%m-%d")
  • Mettre à jour le lien symbolique current :
    • Supprimer le lien symbolique current :
user@host:~$ rm -f /mnt/usb/current
  • Recréer le lien symbolique current :
user@host:~$ ln -s /mnt/usb/back-$(date "+%Y-%m-%d") /mnt/usb/current
  • Vérifier l'espace occupé par les sauvegardes incrémentales :
user@host:~$ du -sh /mnt/usb/back-*
10G	back-2025-11-25
1G	back-2025-11-26
1G	back-2025-11-27
1G	back-2025-11-28

Sauvegarde à travers le réseau avec incrémentales

Identique à ci-dessus mise à part que la destination est ici un serveur de backup sous GNU/Linux donc la sauvegarde passera par le réseau.

Schéma montrant une sauvegarde incrémentielle rsync via SSH d’un PC vers un serveur Linux distant, stockant des dossiers de sauvegarde incrémentielle datés sous /backup et utilisant un lien symbolique current.
Illustration d’une sauvegarde incrémentielle distante via SSH à l’aide de rsync et de --link-dest.
  • Options :
    • -a ou --archive qui inclut :
      • -r : récursivité pour les répertoires
      • -l : copie les liens symboliques comme liens symboliques
      • -p : préserve les permissions
      • -t : préserve les dates
      • -g : préserve le groupe
      • -o : préserve le propriétaire (root uniquement)
      • -D (--devices)
    • -v : plus verbeux
    • --exclude=MOTIF : exclut les fichiers correspondant au MOTIF.
    • --delete : efface les fichiers (sur la destination) qui n'existent pas chez l'émetteur
    • --delete-excluded : efface également les fichiers exclus côté réception (sur la destination)
  • La ligne de commande pour la sauvegarde (la source est / et la destination /backup/ du serveur 192.168.1.100) :
user@host:~$ rsync -av --delete --delete-excluded --exclude=/tmp --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/mnt --exclude=/media --link-dest=/backup/current / user@192.168.1.100:/backup/back-$(date "+%Y-%m-%d")
  • Mettre à jour le lien symbolique current :
    • Supprimer le lien symbolique current :
user@host:~$ ssh -p 22 user@192.168.1.100 "rm /backup/current"
  • Recréer le lien symbolique current :
user@host:~$ ssh -p 22 user@192.168.1.100 "ln -s /backup/back-$(date "+%Y-%m-%d") /backup/current"

Autres

Voici quelques options supplémentaires que je trouve utiles.

  • Afficher la progression pendant le transfert :
user@host:~$ rsync --progress -av /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
  • Afficher les stats à la fin du transfert :
user@host:~$ rsync --stats -av /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
  • Limiter la bande passante utilisé à une limite définie :
user@host:~$ rsync --progress -av --bwlimit=100k /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
  • Transférer seulement les fichiers dont la date de modification est de 3 jours maximum dans le dossier /tmp/ :

💡 Note : fonctionne via transfert local ou par ssh sans mot de passe.

user@host:~$ rsync --progress -av remoteuser@192.168.1.100:/ --no-relative --files-from=<(ssh remoteuser@192.168.1.100 find /data/* -mtime -3 -type f) /tmp/
  • Copie mirroir (--delete : supprime les fichiers dans le répertoire de destination si non présents dans le dossier source) :
user@host:~$ rsync -av --progress --delete /home/std/ /tmp/folder_dest

Comment utiliser Rsync sur une machine distante avec les droits root

  • Ajouter l'entrée sudo sur l'hôte distant :
root@host:~# visudo
user       ALL=NOPASSWD:/usr/bin/rsync
  • Rsync avec l'utilisation de sudo si besoin d'avoir les droits root sur l'hôte distant :
user@host:~$ rsync -av -e 'ssh -p 22' --rsync-path='sudo rsync' /home/std user@192.168.1.100:/data/