Comment utiliser rsync avec des exemples
- Mise à jour le 27 janv. 2025

Rsync est un outil en ligne de commande très puissant qui permet de réaliser des copies de fichiers locales ou distantes.
Il est parfaitement adapté pour copier des fichier et réaliser des sauvegardes d'un serveur de fichiers. Par contre il n'est pas adapté pour traiter les fichiers en cours d'utilisation comme le sont les fichiers de bases de données ou les disques virtuels de machines virtuelles, dans ces cas nous aurons des copies de fichiers inexploitables (c'est à dire des fichiers corrompus).
- Notes :
- Lorsque l'on souhaite effectuer une copie entre deux hôtes distants, rsync doit être installé sur les deux hôtes
- C'est un outil adapté pour les fichiers plats (fichiers textes, images, vidéos etc…)
- Non adapté pour les fichiers en cours d'utilisation comme les bases de données et les machines virtuelles
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/
.

- Ligne de commande :
user@host:~$ rsync -av /home/std/myfile_source /tmp/myfile_dest
- Options :
-a
ou--archive
qui inclus :-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/
.

- Ligne de commande :
user@host:~$ rsync -av /home/std/ /tmp/folder_dest
- Options :
-a
ou--archive
qui inclus :-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 interessant, 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.

- Ligne de commande :
user@host:~$ rsync -av -e 'ssh -p 22' /home/std user@192.168.1.100:/data/
- Options :
-a
ou--archive
qui inclus :-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 leport 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 disques 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
.

- 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 inclus :-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érentce (1Go ou 2Go 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 disques usb est monté sur
/mnt/usb/
- BACKUP : on lance la sauvegarde
rsync
, rsync utilise le lien symboliquecurrent
qui pointe sur la dernière sauvegarde qui est iciback-2022-08-14
. - POST-BACKUP : une fois la sauvegarde rsync terminée, nous devons mettre à jour le lien symbolic
current
afin de le faire pointe vers notre dernière sauvegarde qui est iciback-2022-08-15
.
- PRE-BACKUP : le disques usb est monté sur

Sauvegarde vers un disques USB avec incrémentales
C'est l'application détaillée de ce que l'on a vu juste au-dessus.

- Options :
-a
ou--archive
qui inclus :-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
:
- Supprimer le lien symbolique
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-2022-08-11
1G back-2022-08-12
2G back-2022-08-13
1G back-2022-08-14
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.

- Options :
-a
ou--archive
qui inclus :-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 serveur192.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
:
- Supprimer le lien symbolique
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
Je vais mettre ici les éléments que je juge utile.
- 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 --progress /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/