logo rss

Comment utiliser rsync avec des exemples

logo rsync

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).

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/.

une représentation graphique de la structure des dossiers Linux avec la copie rsync d'un fichier /home/std/myfile_source vers /tmp/myfile_dest
  • 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/.

une représentation graphique de la structure des dossiers Linux avec la copie rsync d'un 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.

une représentation graphique de la structure des dossiers Linux de deux machines avec la copie rsync entre elles d'un dossier
  • 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 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 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.

une représentation graphique de la structure des dossiers Linux avec la sauvegarde rsync vers un disque USB
  • 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 symbolique current qui pointe sur la dernière sauvegarde qui est ici back-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 ici back-2022-08-15.
Les trois phases pour faire des sauvegardes incrémentales rsync sur un disque usb

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.

une représentation graphique de la structure des dossiers Linux avec la sauvegarde incrémentale rsync vers un disque USB
  • 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 :
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.

une représentation graphique de la structure des dossiers Linux avec la sauvegarde incrémentale rsync vers serveur de sauvegarde Linux
  • 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 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

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 days 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/
  • Copy 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

Rsync 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/
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact