Sauvegarde locale avec Rsnapshot
Rsnapshot fait partie des briques logicielles que j'utilise au quotidien dans mon entreprise depuis une bonne quinzaine d'années, peut-être même plus. C'est un outil simple et robuste, et qui tourne actuellement sur tous mes serveurs de sauvegarde.
Rsnapshot sous le capot
L'architecture de Rsnapshot est inspirée de l'article Easy Automated Snapshot-Style Backups with Linux and Rsync de Mike Rubel. L'éditeur O'Reilly avait publié l'intégralité de cet article dans son ouvrage Linux Server Hacks, paru en 2003. Vous serez probablement surpris d'apprendre que ces informations restent pertinentes à l'heure actuelle.
Tout le monde ne dispose pas d'un serveur - local ou dédié - pour y stocker ses sauvegardes. Je me suis donc demandé s'il n'y avait pas moyen de bidouiller Rsnapshot pour le faire fonctionner en local avec un simple disque dur externe. J'ai passé un après-midi pluvieux à expérimenter avec un PC bac à sable dans mon bureau, et j'ai fini par trouver une solution qui me plaît bien.
Quelle distribution ?
Rsnapshot fonctionne a priori sur n'importe quel système unixoïde.
L'exemple ci-dessous a été réalisé sur un poste de travail AlmaLinux 9
en version KDE. Ceci étant dit, une fois que le paquet rsnapshot est
installé, la plupart des infos que je vous fournis pourront s'adapter à
votre distribution et votre bureau, à quelques menus détails près.
Préparer le disque
Pour mes tests, je me suis servi d'un vieux disque dur externe Western Digital avec une capacité de 500 Go. La première chose qu'on va faire, c'est remplacer le partitionnement et le formatage à la sauce Microsoft par quelque chose de plus sain.
Je branche mon disque externe et je l'identifie :
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 55,9G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─ ...
sdb 8:16 0 465,7G 0 disk
└─sdb1 8:17 0 465,7G 0 part
Je réinitialise le disque :
Débrancher et rebrancher le disque
Vu qu'on vient de lui flinguer la table de partitions en mettant deux coups de douze, ce n'est pas une mauvaise idée de débrancher et de rebrancher le disque à ce stade.
Je crée une partition de type Linux sur le disque :
# fdisk -l /dev/sdb
Disk /dev/sdb: 465.73 GiB, 500074283008 bytes, 976707584 sectors
Disk model: Elements 10B8
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x119326bf
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 976707583 976705536 465.7G 83 Linux
Je formate la partition :
# mkfs.ext4 -v /dev/sdb1
mke2fs 1.46.5 (30-Dec-2021)
...
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
J'ajoute une étiquette appropriée :
Configurer le montage
Le disque sera monté sur /mnt/backup :
J'édite /etc/fstab et j'ajoute la ligne suivante qui correspond au disque
externe :
-
L'option
noautoévite les tentatives de montage automatique au démarrage du système. -
L'option
userpermet à un utilisateur normal d'utiliser la commandemountavec ce périphérique.
Tester le montage du disque
Redémarrez la machine, débranchez et rebranchez le disque et essayez de le monter manuellement dans un terminal comme ceci :
C'est quoi cet avertissement SELinux ?
Si vous utilisez un clone RHEL comme moi, vous verrez probablement un
avertissement du genre Vous avez monté un système de fichiers permettant
l'utilisation d'étiquettes, mais qui n'en contient pas, sur un système
SELinux. Vous pouvez sereinement ignorer ce message.
Définir les permissions du disque
Le disque est monté, mais je ne dispose pas des droits d'écriture dessus :
$ cd /mnt/backup/
$ ls
lost+found
$ touch test
touch: impossible de faire un touch 'test': Permission non accordée
Je vais donc attribuer la racine de ce disque à mon utilisateur :
Je refais un petit test :
C'est tout bon pour le disque.
Installer Rsnapshot
Sous AlmaLinux et sous Rocky Linux, le paquet rsnapshot est fourni par le
dépôt tiers EPEL (Extra Packages for Enterprise Linux) :
# dnf repolist | grep epel
epel Extra Packages for Enterprise Linux 9 - x86_64
# dnf search rsnapshot
...
rsnapshot.noarch : Local and remote filesystem snapshot utility
# dnf install -y rsnapshot
Configurer Rsnapshot
Rsnapshot se configure par le biais du fichier /etc/rsnapshot.conf. Le fichier
fourni par défaut est amplement commenté et pourra servir de point de départ.
La page de manuel rsnapshot(1) fournit la référence complète. Au lieu d'éditer
le fichier /etc/rsnapshot.conf, je vais le renommer et repartir de zéro :
# cd /etc/
# mv -v rsnapshot.conf rsnapshot.conf.orig
renamed 'rsnapshot.conf' -> 'rsnapshot.conf.orig'
J'édite une configuration personnalisée adaptée à mon cas de figure :
# Config file version
config_version 1.2
# Snapshot root directory
snapshot_root /mnt/backup
# External program dependencies
cmd_cp /usr/bin/cp
cmd_rm /usr/bin/rm
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger /usr/bin/logger
cmd_du /usr/bin/du
cmd_rsnapshot_diff /usr/bin/rsnapshot-diff
# Backup intervals
retain daily 7
# Print errors and warnings only
verbose 2
# Same verbosity for data written to specified logfile
loglevel 3
logfile /tmp/rsnapshot.log
# Prevent two instances from running simultaneously
lockfile /tmp/rsnapshot.pid
# PC de Nico
backup /home/microlinux pc-nico
Utilisez des tabulations
Il faut impérativement utiliser les tabulations comme séparateurs. Si l'on
utilise l'éditeur Vim, l'option :set list permettra d'afficher les
tabulations dans le fichier. Si l'on a activé l'option :set expandtab qui
remplace les tabulations par une série d'espaces, il faut également la
désactiver grâce à :set noexpandtab.
Automatiser le montage et la sauvegarde
En temps normal, la sauvegarde est censée s'effectuer en trois temps :
-
Le disque externe est monté.
-
Rsnapshot s'en sert pour écrire la sauvegarde dessus.
-
Une fois que la sauvegarde est terminée, le disque externe est démonté.
Je vais automatiser cette succession d'opérations à l'aide d'un petit script
shell backup.sh que je range dans un endroit approprié :
#!/bin/bash
#
# backup.sh
SLEEP=3
echo
echo "##############"
echo "# SAUVEGARDE #"
echo "##############"
echo
sleep $SLEEP
if [ -h /dev/disk/by-label/SAUVEGARDE ]
then
echo "Le disque dur externe SAUVEGARDE est présent."
sleep $SLEEP
if grep -qs '/mnt/backup ' /proc/mounts
then
echo "Le disque dur externe SAUVEGARDE est monté."
else
echo "Montage du disque dur externe SAUVEGARDE."
mount /mnt/backup
sleep $SLEEP
fi
else
echo "Veuillez brancher le disque dur externe SAUVEGARDE."
sleep $SLEEP
exit 1
fi
sleep $SLEEP
echo "Sauvegarde en cours. Veuillez patienter..."
rsnapshot daily
rsnapshot du
echo "Démontage du disque dur externe SAUVEGARDE."
umount /mnt/backup
sleep $SLEEP
echo "Sauvegarde terminée."
sleep $SLEEP
exit 0
Je rends ce script exécutable :
Je lance le script dans un terminal pour le tester :
$ backup.sh
##############
# SAUVEGARDE #
##############
Le disque dur externe SAUVEGARDE est présent.
Le disque dur externe SAUVEGARDE est monté.
Sauvegarde en cours. Veuillez patienter...
4,8G /mnt/backup/daily.0/
4,8G total
Démontage du disque dur externe SAUVEGARDE.
Sauvegarde terminée.
Je le relance pour tester le montage automatique et la sauvegarde incrémentale :
$ backup.sh
##############
# SAUVEGARDE #
##############
Le disque dur externe SAUVEGARDE est présent.
Montage du disque dur externe SAUVEGARDE.
Sauvegarde en cours. Veuillez patienter...
4,8G /mnt/backup/daily.0/
5,8M /mnt/backup/daily.1/
4,8G total
Démontage du disque dur externe SAUVEGARDE.
Sauvegarde terminée.
Créer une entrée de menu
Mon utilisateur ne va pas ouvrir un terminal et taper backup.sh pour lancer
une sauvegarde. Je vais donc créer une entrée de menu correspondante pour un
peu plus de confort d'utilisation :
[Desktop Entry]
Type=Application
Terminal=true
Exec=/usr/local/bin/backup.sh
Icon=preferences-system-backup
Encoding=UTF-8
GenericName=Rsnapshot
Name=Incremental backup
Name[fr]=Sauvegarde incrémentale
Categories=Utility;
Je prends en compte la nouvelle entrée de menu :
Dans mon bureau KDE, je retrouve désormais mon petit programme Sauvegarde incrémentale dans la rubrique Utilitaires :
Voici ce qui se passe lorsque je clique dessus :
-
Une fenêtre de terminal s'ouvre.
-
Le montage du disque est géré automatiquement sous le capot.
-
La sauvegarde incrémentale s'effectue automatiquement sur le disque externe.
-
Une fois que la sauvegarde s'est terminée, le disque est démonté.
-
La fenêtre se ferme automatiquement.
Conclusion
Nous avons réussi à transformer un simple disque dur externe en système de sauvegardes incrémentales.
-
Si vous avez un volume de données conséquent dans votre répertoire personnel, la toute première sauvegarde prendra probablement quelque temps.
-
En revanche, les sauvegardes subséquentes seront nettement plus rapides, étant donné que Rsnapshot va transférer uniquement le delta depuis la dernière sauvegarde.
-
Cette façon de procéder vous évitera les téraoctets de sauvegardes plus ou moins redondantes que l'on voit fleurir un peu partout.
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.



