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).
rsync n'est généralement pas préinstallé dans les distributions, donc la première chose à faire et de lancer l'installation.
user@host:~$ sudo apt install rsync
[root@host ~]# pacman -S rsync
Commençons de façon simple, nous allons ici utiliser rsync pour copier un fichier présent dans le dossier /home/std/ vers /tmp/.
user@host:~$ rsync -av /home/std/myfile_source /tmp/myfile_dest
On pourra aussi utiliser rsync pour récursivement copier un dossier. Ici on copiera le dossier /home/std vers /tmp/.
user@host:~$ rsync -av /home/std/ /tmp/folder_dest
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.
user@host:~$ rsync -av -e 'ssh -p 22' /home/std user@192.168.1.100:/data/
user@host:~$ rsync -av -e 'ssh -p 22' user@192.168.1.100:/data/std /home/
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.
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.
root@host:~# rsync -av --delete --delete-excluded --exclude=/tmp --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/mnt / /mnt/usb/back-$(date "+%Y-%m-%d")
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).
C'est l'application détaillée de ce que l'on a vu juste au-dessus.
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")
user@host:~$ rm -f /mnt/usb/current
user@host:~$ ln -s /mnt/usb/back-$(date "+%Y-%m-%d") /mnt/usb/current
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
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.
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")
user@host:~$ ssh -p 22 user@192.168.1.100 "rm /backup/current"
user@host:~$ ssh -p 22 user@192.168.1.100 "ln -s /backup/back-$(date "+%Y-%m-%d") /backup/current"
Je vais mettre ici les éléments que je juge utile.
user@host:~$ rsync --progress -av /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
user@host:~$ rsync --stats -av /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
user@host:~$ rsync --progress -av --bwlimit=100k /home/std/folder_source/ remoteuser@192.168.1.100:/tmp/folder_dest
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/
user@host:~$ rsync --progress /home/std/ /tmp/folder_dest
root@host:~# visudo
user ALL=NOPASSWD:/usr/bin/rsync
user@host:~$ rsync -av -e 'ssh -p 22' --rsync-path='sudo rsync' /home/std user@192.168.1.100:/data/
Contact :