SauvegardeCet article décrit la mise en place d’un serveur de sauvegardes incrémentales avec Rsnapshot sous Rocky Linux 8. Rsnapshot est une solution de sauvegarde robuste et efficace écrite en Perl et basée sur Rsync. En combinaison avec SSH, Rsnapshot permet d’effectuer des sauvegardes à distance. Une fois que la première synchronisation des données est effectuée, les sauvegardes se font de manière incrémentale moyennant une série de liens durs (hard links), ce qui évite la duplication inutile.

Rsnapshot tourne sur le serveur de sauvegardes. Les machines dont il faut sauvegarder les données sont totalement passives, il faut juste qu’elles aient un serveur SSH activé.

Prérequis

Le serveur de sauvegardes doit pouvoir se connecter via SSH aux machines distantes. Il faut donc configurer l’authentification par clé SSH au préalable.

AstuceSi vous installez Rsnapshot sur un serveur dédié et que vous l’utilisez pour sauvegarder un serveur dédié protégé par Fail2ban, ce n’est pas une mauvaise idée d’ajouter l’IP du serveur de sauvegardes dans la rubrique ignoreip de la configuration de Fail2ban. Ça vous évitera de vous faire bannir de façon malencontreuse.

# /etc/fail2ban/jail.d/custom.conf

[DEFAULT]
bantime = 24h 
ignoreip = 163.172.81.8

[sshd]
enabled = true

Installation

Rsnapshot est fourni par le dépôt de paquets EPEL, qu’il faudra donc activer en conséquence :

# dnf repolist | grep epel
epel               EPEL
epel-modular       EPEL Modular
# dnf install -y rsnapshot

Configuration

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, nous allons le renommer et repartir de zéro :

# cd /etc/
# mv -v rsnapshot.conf rsnapshot.conf.orig
renamed 'rsnapshot.conf' -> 'rsnapshot.conf.orig'

Éditer une configuration personnalisée comme ceci, par exemple :

# /etc/rsnapshot.conf

# Config file version
config_version  1.2

# Snapshot root directory
snapshot_root /srv/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 /var/log/rsnapshot

# Prevent two instances from running simultaneously
lockfile  /var/run/rsnapshot.pid

# sd-123456.dedibox.fr
backup  root@sd-123456.dedibox.fr:/etc  sd-123456.dedibox.fr
backup  root@sd-123456.dedibox.fr:/home sd-123456.dedibox.fr
backup  root@sd-123456.dedibox.fr:/var/named  sd-123456.dedibox.fr
backup  root@sd-123456.dedibox.fr:/var/www  sd-123456.dedibox.fr

Quelques remarques :

  • 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.
  • L’emplacement des sauvegardes spécifié par la directive snapshot_root sera créé au besoin par Rsnapshot.
  • Les commandes correspondent à un système Rocky Linux 8, et plus généralement à la plupart des distributions Linux.
  • La directive retain daily 7 correspond à une sauvegarde quotidienne complète.
  • Dans l’exemple ci-dessus, on spécifie les arborescences de données à sauvegarder, plutôt que de choisir l’ensemble du système à la louche pour ensuite exclure les parties du système que l’on ne veut pas sauvegarder.
  • Les bases de données pourront être récupérées par le biais d’un script automatique sqldump.sh installé sur la machine distante, qui range les sauvegardes SQL soigneusement ficelées dans un répertoire de votre choix.

Tester la configuration

Une fois qu’on a édité la configuration, on peut vérifier si l’on n’a pas fait d’erreurs de syntaxe :

# rsnapshot configtest
Syntax OK

L’option -t permet ensuite de simuler une sauvegarde. Dans ce cas, Rsnapshot nous affiche toutes les opérations qu’il effectuerait, sans réellement les exécuter :

# rsnapshot -t daily
echo 305131 > /var/run/rsnapshot.pid 
mkdir -m 0700 -p /srv/backup/ 
mkdir -m 0755 -p /srv/backup/daily.0/ 
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    --rsh=/usr/bin/ssh root@sd-123456.dedibox.fr:/etc \
    /srv/backup/daily.0/sd-123456.dedibox.fr 
mkdir -m 0755 -p /srv/backup/daily.0/ 
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    --rsh=/usr/bin/ssh root@sd-123456.dedibox.fr:/home \
    /srv/backup/daily.0/sd-123456.dedibox.fr 
mkdir -m 0755 -p /srv/backup/daily.0/ 
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    --rsh=/usr/bin/ssh root@sd-123456.dedibox.fr:/var/named \
    /srv/backup/daily.0/sd-123456.dedibox.fr 
mkdir -m 0755 -p /srv/backup/daily.0/ 
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    --rsh=/usr/bin/ssh root@sd-123456.dedibox.fr:/var/www \
    /srv/backup/daily.0/sd-123456.dedibox.fr 
touch /srv/backup/daily.0/

Synchronisation initiale

Si le serveur distant contient quelques centaines de gigaoctets ou même quelques téraoctets de données, la première synchronisation peut être assez longue. La bonne politique consiste à effectuer cette première opération à la main, comme ceci :

# rsnapshot daily

Une deuxième console permettra de se faire une idée de la progression du transfert :

# watch du -sh /srv/backup
2.1G    /srv/backup/

Au bout de l’opération, on pourra vérifier si tout s’est bien déroulé :

# tail /var/log/rsnapshot
...
[2024-02-09T03:07:09] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded 
                      --rsh=/usr/bin/ssh root@sd-123456.dedibox.fr:/var/www 
                      /srv/backup/daily.0/sd-123456.dedibox.fr
[2024-02-09T03:08:35] touch /srv/backup/daily.0/
[2024-02-09T03:08:35] rm -f /var/run/rsnapshot.pid
[2024-02-09T03:08:35] /usr/bin/rsnapshot -v daily: completed successfully

Définition des tâches automatiques

Une fois que la synchronisation initiale s’est correctement déroulée, on peut songer à mettre en place une tâche automatique :

# crontab -e
# Run Rsnapshot backups at 02:45 AM
45 02   * * *  /usr/bin/rsnapshot daily

Sur mes machines, j’utilise un petit script backup.sh qui m’envoie une notification par mail chaque fois que la sauvegarde s’effectue :

#!/bin/bash
#
# backup.sh

HOSTNAME=$(hostname --fqdn)
SENDER="root@${HOSTNAME}"
RELAY="${SENDER}"
ADMIN="info@microlinux.fr"

rsnapshot -v daily 2>&1 |
  mail -s "Daily backup report for ${HOSTNAME}" \
  -r "${RELAY} (root@${HOSTNAME})" \
  ${ADMIN}

exit 0

Le script est lancé par une tâche automatique quotidienne :

# crontab -e
# Run Rsnapshot backups at 02:45 AM
45 02 * * *  /root/bin/backup.sh

Utilisation au quotidien

Au bout d’une semaine d’utilisation, voilà à quoi ressemble le répertoire des sauvegardes :

# ls -l /srv/backup/
total 28
drwxr-xr-x. 6 root root 4096 Feb  9 03:08 daily.0
drwxr-xr-x. 6 root root 4096 Feb  8 03:07 daily.1
drwxr-xr-x. 6 root root 4096 Feb  7 03:04 daily.2
drwxr-xr-x. 6 root root 4096 Feb  6 03:05 daily.3
drwxr-xr-x. 6 root root 4096 Feb  5 03:05 daily.4
drwxr-xr-x. 6 root root 4096 Feb  4 03:04 daily.5
drwxr-xr-x. 4 root root 4096 Feb  9 09:39 daily.6

L’option du permet d’afficher un rapport détaillé sur l’espace disque occupé par les sauvegardes :

# rsnapshot du
75G     /srv/backup/daily.0/
386M    /srv/backup/daily.1/
399M    /srv/backup/daily.2/
399M    /srv/backup/daily.3/
395M    /srv/backup/daily.4/
8.7G    /srv/backup/daily.5/
3.4G    /srv/backup/daily.6/
88G     total

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.

 


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *