samedi 28 février 2015

Sauvegarde complete Raspberry sur Freebox V6

Salut à tous,
Il y a peu, je me suis laissé tenter par le nouveau Raspberry Pi 2 avec l'idée d'en faire un petit serveur domotique.
Après m'être documenté à droite et à gauche, mon choix de distribution Linux s'est vite arrêté sur Raspbian, un dérivé de Debian parfaitement optimisé pour Raspberry tout en préservant au maximum la vie de la carte SD.
La gestion de la domotique est confiée à Domoticz, logiciel open sources multi protocoles consommant peu de ressources tout en étant relativement complet et puissant.
Quelques configurations, customisations et scripts spécifiques plus tard est venu le besoin de ne pas perdre tout ce travail en cas de décès de la carte SD en place.
Personnellement je préfère une sauvegarde complète de la carte SD (8 Gigas) et pour ceci, il existe l'excellente commande "dd" sous linux grace à laquelle il est possible d'effectuer une sauvegarde image du disque entier à chaud.
Mon besoin est de stocker cette sauvegarde sur un disque externe raccordé à la Freebox V6.
Il existe de nombreux tutos ou articles comme celui-ci expliquant comment réaliser ceci sauf... que je me suis systématiquement retrouvé avec un agacant "Permission denied" au moment de monter le disque externe de la Freebox avec la commande "mount".
Finalement c'est l'option "sec=ntlm" manquante dans les différents tutos qui provoquait ce problème peut-être lié au kernel plus récent du RPI2. 

Voici donc ma méthode KISS. Pour l'appliquer il est préférable d'avoir de bonnes notions sur linux car je ne détaille pas expressément chaque étape.

1) Création du répertoire de montage
sudo mkdir /mnt/freebox

2) Ajout du montage dans le fstab (attention ce n'est qu'une seule ligne, l'adresse locale de ma freebox est 192.168.1.254 et le disque externe raccordé est nommé USBWD)
Personnellement j'utilise l'éditeur "nano"
//192.168.1.254/USBWD /mnt/freebox cifs users,noauto,uid=root,gid=users,sec=ntlm,user=freebox,pass=XXXX,_netdev,vers=1.0 0 0

3) Le script que j'ai placé dans un fichier backup.sh dans le répertoire /home/pi/domoticz/scripts
Vous devez absolument identifier le nom de votre périphérique correspondant à votre carte SD à l'aide de la commande fdisk sour root, chez moi  son nom est "mmcblk0"
#!/bin/sh
#
# Script de sauvegarde de l'image complète du serveur vers un disque USB
# Contient un système de purge
#

# Chemin montage disque distant
MOUNT_PATH=/mnt/freebox
# Repertoire sauvegarde journaliere
SAVE_PATH_DAY=/backup-raspberry/days/
# Repertoire sauvegarde hebdomadaire
SAVE_PATH_WEEK=/backup-raspberry/weeks/
# Formatage date pour nom du fichier et logs
DATE_BCK=`date +%d-%m-%Y-%Hh%M`
# Nom du fichier de sauvegarde
BCK_FILE=srv-domoticz-${DATE_BCK}.img.gz
# Nombre de semaines à conserver
KEEP_WEEKS=10
# Nombre de jours à conserver
KEEP_DAYS=10
# Filtre de recherche
FILE_FILTER="srv*img.gz"
# Recuperation numero du jour de semaine
DAY_OF_WEEK=`date +%u`

# Inscription du début de la sauvegarde dans le syslog
echo '*** BACKUP CARTE SD SUR FREEBOX DEBUT : '$DATE_BCK' ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX DEBUT : '$DATE_BCK' ***'

# montage du disque dur Freebox
if ! mountpoint -q /mnt/freebox ; then
/bin/mount ${MOUNT_PATH}
if [ $? -ne 0 ]; then
echo '*** BACKUP CARTE SD SUR FREEBOX ERREUR MONTAGE DISQUE ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX ERREUR MONTAGE DISQUE ***'
exit 1
fi
fi

# Sauvegarde sur le disque externe USB Freebox
echo "Sauvegarde sur la Freebox"
if [ $DAY_OF_WEEK -eq "1" ];then
echo "Sauvegarde hebdomadaire"
ls -1t ${MOUNT_PATH}${SAVE_PATH_WEEK}${FILE_FILTER} | tail -n +$KEEP_WEEKS | xargs rm -rf
dd if=/dev/mmcblk0 | gzip -9 > ${MOUNT_PATH}${SAVE_PATH_WEEK}srv-domoticz-${DATE_BCK}.img.gz
else
echo "Sauvegarde journalière"
ls -1t ${MOUNT_PATH}${SAVE_PATH_DAY}${FILE_FILTER} | tail -n +$KEEP_DAYS | xargs rm -rf
dd if=/dev/mmcblk0 | gzip -9 > ${MOUNT_PATH}${SAVE_PATH_DAY}srv-domoticz-${DATE_BCK}.img.gz
fi

# umount du disque dur Freebox
/bin/umount ${MOUNT_PATH}
if [ $? -ne 0 ]; then
echo '*** BACKUP CARTE SD SUR FREEBOX ERREUR DEMONTAGE DISQUE ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX ERREUR DEMONTAGE DISQUE ***'
fi

# Formatage de la date et inscription de la fin de la sauvegarde dans le syslog
DATE_FIN=`date +%d-%m-%Y-%Hh%M`
echo '*** BACKUP CARTE SD SUR FREEBOX FIN : '$DATE_FIN' ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX FIN : '$DATE_FIN' ***'
Ne pas oublier de rendre le script executable par un chmod +x
Vous pouvez le tester manuellement avec un sudo ./backup.sh
Il est aisé de consulter si l'opération s'est bien passée en consultant le syslog.
pi@raspberrypi-sz ~ $ cat /var/log/syslog.1 | grep BACKUP
Feb 28 01:15:01 raspberrypi-sz logger: *** BACKUP CARTE SD SUR FREEBOX DEBUT : 28-02-2015-01h02 ***
Feb 28 02:11:14 raspberrypi-sz logger: *** BACKUP CARTE SD SUR FREEBOX FIN : 28-02-2015-02h02 ***

4) Le crontab root lançant la sauvegarde une fois par nuit à 1h00 (je l'adapterai sûrement)
0 1 * * * /home/pi/domoticz/scripts/backup.sh

La taille du fichier de sauvegarde compressé fait 1.3Go