Aller au contenu

Sauvegarde locale avec Rsnapshot

Sauvegarde

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 :

# sgdisk --zap-all /dev/sdb
# wipefs --all /dev/sdb

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 :

# e2label /dev/sdb1 SAUVEGARDE

Configurer le montage

Le disque sera monté sur /mnt/backup :

# mkdir -v /mnt/backup
mkdir: created directory '/mnt/backup'

J'édite /etc/fstab et j'ajoute la ligne suivante qui correspond au disque externe :

/etc/fstab
LABEL=SAUVEGARDE  /mnt/backup  ext4  noauto,user  0 0
  • L'option noauto évite les tentatives de montage automatique au démarrage du système.

  • L'option user permet à un utilisateur normal d'utiliser la commande mount avec 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 :

$ mount -v /mnt/backup
...
mount : /dev/sdb1 monté sur /mnt/backup.

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 :

$ sudo chown microlinux:microlinux .

Je refais un petit test :

$ touch test
$ rm 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 :

/etc/rsnapshot.conf
# 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é :

/usr/local/bin/backup.sh
#!/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 :

# chmod +x /usr/local/bin/backup.sh

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 :

/usr/share/applications/backup.desktop
[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 :

# update-desktop-database

Dans mon bureau KDE, je retrouve désormais mon petit programme Sauvegarde incrémentale dans la rubrique Utilitaires :

Rsnapshot

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.

Rsnapshot

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.