Script de sauvegarde planifié

A vos NAS ! Prêt ! Scriptez !

Mon premier script ! Je m’en souviens comme si c’était hier alors que ça fait plus d’un an qu’il tourne gentiment.

Le contexte est simple : des documents multimédias sur 1 Raspberry (Raspbian) avec 2 disques sans RAID. Pourquoi pas de RAID 1 ? Car ce n’est pas une solution de sauvegarde et je l’ai appris par le « hard way » en faisant une mauvaise manipulation sur le dossier de mes photos. Le RAID 1 est vraiment utile dans un environnement professionnel où la disponibilité et la fiabilité est importante.

Ce script fait une synchronisation de mes dossiers /data /home /root et /etc tous les lundis à 3h00 avec un suivi dans /var/log/backup. Tout ceci sera orchestré par cron.

Pour commencer, créer un fichier backup.sh pour ma part dans /root/scripts

#!/bin/bash

# Création d'une fonction pour formater la date comme ceci :

# ##########################################
#           vendredi 10 mars 2017
#                  18:06:05
# ##########################################

function TIME {
echo
echo '##########################################'
date '+          %A %d %b %Y%n                %k:%M:%S'
echo '##########################################'
echo
}

# Déclaration des options pour la commande rsync
# v=verbose
# a=archive
# h=human read, aide à comprendre les valeurs
# E=preserve executability, garde les fichiers exécutables s'ils le sont
# i= avec -u,montre les fichiers mises à jour
# u=update, copie uniquement si la date du fichier est différente du dossier de destination
# --delete=supprime les fichiers de destination s'ils ne sont plus existants dans le dossier source
# --stats=affiche des statistiques utiles
OPTIONS='-vauhEi --delete --stats'

# Déclaration d'un chemin pour les logs
LOG=/var/log/backup

# Déclaration d'un chemin pour le dossier de sauvegarde
BACKUP=/backup

# Copie du dossier /data
(
TIME
rsync $OPTIONS /data $BACKUP
TIME
) >> $LOG/data.log

# Sauvegarde du dossier /etc
(
TIME
rsync $OPTIONS /etc $BACKUP
TIME
) >> $LOG/etc.log

# Sauvegarde des dossiers /home et /root
(
TIME
rsync $OPTIONS /home /root $BACKUP
TIME
) >> $LOG/home.log

Note à moi-même : ne pas oublier de rendre le fichier exécutable (c’est arrivé plus d’une fois 🙂 )

chmod +x /root/scripts/backup.sh

Edition du crontab

crontab -e

Si vous êtes comme moi, éduqué à la dur avec vi (vi c’est la vie !), il est possible de changer l’éditeur par défaut, notamment ici pour l’édition du cron (pour moi c’est le 3)

update-alternatives --config editor

Revenons à notre crontab -e :

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="postmaster@opti-it.fr"

# Tous les lundis à 3h, exécution du script de sauvegarde pour /data /etc /home sur le 2ème DD, log dans /var/log/backup
0 3 * * 1 /root/scripts/backup.sh

Petites explications concernant les 2 variables PATH et MAILTO :
Il est nécessaire de déclarer les variables de son PATH car dans le script que j’utilise, les chemins des binaires sont relatifs. Au lieu de rsync, on aurait pu mettre /usr/bin/rsync et ensuite les arguments.
MAILTO est comme son nom l’indique, un envoi d’email. Si c’est vide ou manquante, aucun mail ne sera envoyé.

D’autres variables peuvent être déclaré dans votre crontab. Extrait du man crontab :

Plusieurs variables d’environnement sont automatiquement configurées par le démon cron(8). SHELL est rempli avec /bin/sh, LOGNAME et HOME sont configurées à partir de la ligne de /etc/passwd correspondant au propriétaire de la crontab. HOME et SHELL peuvent être surchargés par des affectations explicites dans la crontab, LOGNAME non.

Ce petit script maison peut être facilement adaptable selon vos besoins. La 1ère sauvegarde est longue mais ensuite il suffit de quelques secondes pour synchroniser les dossiers.

Une dernière chose est à finaliser : les logs. Au bout d’un certain temps, ils deviennent trop gros. Pour l’instant je m’en sors avec le logrotate de Raspbian :

vi /etc/logrotate.d/backup
/var/log/backup/*.log {
        monthly
        size 2M
        compress
        delaycompress
        missingok
        notifempty
}

Donc ici logrotate surveille toutes les fichiers .log dans /var/log/backup et réalise les opérations suivantes :

  • le 1er jour de chaque mois
  • s’il dépasse 2Mo alors rotation du log
  • qu’il va ensuite compresser
  • mais pas la 1ère rotation
  • si un fichier de log est manquant alors passer au suivant
  • si fichier vide alors passer au suivant

Je pense que je vais améliorer ce point là car ce n’est pas facile de retrouver rapidement des informations. Je pensais à créer un fichier de log daté par sauvegarde réalisé, directement géré dans le script.

N’hésitez pas à faire un retour, tout est optimisable 😉

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.