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

7 commentaires:

  1. Bonjour,
    ok, et une fois le backup fait, comment procéder à la restauration de la carte?
    Cdt, Julien

    RépondreSupprimer
  2. Bonjour,
    Chez moi les PC sont sous Linux donc pas de soucis, je le fais avec la commande dd.
    Un exemple de restauration ici :
    http://www.pihomeserver.fr/2012/12/24/raspberry-pi-home-server-faire-un-backup-automatique-de-la-carte-sd/#comment-1964819808

    RépondreSupprimer
  3. Bonjour et merci pour ce super tuto.

    Je rencontre un petit problème lors du nommage du fichier. La sauvegarde se fait sous le nom suivant : "srv-domoticz-.img", la notion de date n'est pas prise en compte.
    Je tourne sous Raspbian sur un raspberry pi3.

    Avez-vous une idée?

    Merci d'avance

    RépondreSupprimer
    Réponses
    1. Solution trouvée !

      Il y a une erreur dans le script "Backup.sh".
      A deux ou trois endroits du code, il faut remplacer "${DATE_DEBUT}" par "${DATE_BCK}"

      Merci pour script, ça fonctionne parfaitement

      Supprimer
    2. Merci effectivement je n'avais pas remarqué cette coquille vu que mon script (qui tourne toujours sur mon RPI3) était lui bien corrigé.
      J'ai mis à jour l'article

      Supprimer
  4. Bonjour, il y a un bug dans la ligne :
    DATE_BCK=`date +%d-%m-%Y-%Hh%m`
    il faut remplacer 'm' par 'M'
    DATE_BCK=`date +%d-%m-%Y-%Hh%M`
    Sinon ce ne sont pas les minutes mais le mois courant.

    RépondreSupprimer
  5. Effectivement... La coquille est corrigée ;)
    Pour info ce script fonctionne toujours mais mon disque dur externe est maintenant derrière une BOX SFR

    RépondreSupprimer