Sauvegarde de la carte SD du Raspberry Pi sur un serveur externe

Personne n'est jamais à l'abri d'une panne, et la sauvegarde (backup en anglais) est l'opération qui consiste à dupliquer et à mettre en sécurité les données contenues dans un système informatique.

Le Raspberry Pi utilise une carte SD ou micro-SD selon la version dont vous disposez. Ces cartes sont pratiques car pas chères et peu encombrantes, mais sont détournées de leur usage principal et doivent encaisser plus de cycles de lecture-écriture qu'une carte SD utilisée d'une façon plus normale.

Si votre carte SD voit ses données corrompues, il vous faudra donc réinstaller le système, refaire votre configuration, ... ce qui peut être évité si vous avez une sauvegarde de votre carte SD.

Vous pouvez très bien utiliser le logiciel Win32DiskImager, mais cela implique de devoir arrêter votre Raspberry Pi et donc les services hébergés.

Nous allons voir ici comment réaliser une image de votre carte SD de manière automatique, sans arrêt du système, et en externalisant la copie vers un serveur sur votre réseau local. Vous serez ainsi à même de restaurer votre carte SD et de limiter les pertes de données.

Pour ma part, je me suis servi de mon NAS Synology pour recevoir les images des cartes SD de mes Raspberry Pi.


Prérequis

Il faut configurer activer le protocole NFS et créer un partage accessible en
NFS (notez le chemin d’accès dans un coin). (Pour les NAS Synology, vous pouvez suivre la procédure suivante.)

Sur votre Raspberry, il faut vérifier que les paquets nécessaires à l'opération soient présents sur votre système, et le cas échéant les installer.

  • Tester la présence du protocole NFS :

    dpkg -l | grep nfs-common
    
    • Installer NFS s’il est absent de votre système :

      apt-get install nfs-common
      
  • Tester la présence de l’outil PV (Pipe Viewer pour voir la progression du clonage lancé manuellement) :

    dpkg -l | grep pv
    
    • Installer PV s’il est absent de votre système :

      apt-get install pv
      

Paramétrage du clonage
  • Créer un point de montage :

    sudo mkdir /mnt/Backup_NAS
    
  • Inscrire le montage dans fstab (pour permettre le montage automatique du partage au démarrage du système) :

    sudo nano /etc/fstab
    

    Et ajouter la ligne suivante :

    192.168.1.100:/volume1/Backup_Jeedom    /mnt/Backup_NAS    nfs    rw,user    0    0
    
  • Tester le montage du partage distant :

    sudo mount -a && sudo df
    

    Votre partage devrait maintenant apparaître.

  • Tester l’accès en écriture au partage distant :

    sudo mkdir /mnt/Backup_NAS/totofaitdubato
    

    Vous ne devriez pas avoir d'erreur

  • Lancer manuellement le clonage de la carte SD (utile pour obtenir l’espace et le temps nécessaires au clonage) :

    sudo dd if=/dev/mmcblk0 bs=4M | sudo pv -treb | sudo dd of=/mnt/Backup_NAS/SD_Backup/Backup_SD_TEST.img && sync
    

    L'image ainsi générée occupera 4Go d'espace si votre carte SD fait 4Go. Il est tout à fait possible de compresser l'image pour gagner en espace, notamment sur l'espace libre disponible sur votre carte SD.

    sudo dd if=/dev/mmcblk0 bs=4M | sudo pv -treb | sudo gzip -1 -| sudo dd of=/mnt/Backup_NAS/SD_Backup/Backup_SD_TEST.img && sync
    

    Pour mon Raspberry Pi B avec une carte SD de 8Go, le clonage classique s'est fait en 1h44 pour un fichier généré de 8Go et le clonage compressé s'est fait en 2h19 pour un fichier généré de 4,3 Go.


Automatisation du clonage

Maintenant que le test a été effectué, nous pouvons automatiser tout ça. La durée de l'opération va permettre de bien planifier la tâche de clonage tandis que la taille du fichier permettra au script de contrôler son poids. Pour aller au bout de l’idée, nous allons mettre en place l’envoi de rapports par mail...

  • Installer et Paramétrer les fonctionnalités d’envoi de mails

    • Installation de la fonction mail

      sudo apt-get install mailutils mpack ssmtp
      
    • Editer la configuration de ssmtp pour paramétrer la passerelle smtp

      sudo nano /etc/ssmtp/ssmtp.conf
      
    • Le fichier ssmtp.conf est à paramétrer comme suit :

      root=monLogin@gmail.com
      mailhub=smtp.gmail.com:587
      hostname=RaspberryPi
      AuthUser= monLogin@gmail.com
      AuthPass=monMotdepasse
      FromLineOverride=YES
      UseSTARTTLS=YES
      

      ATTENTION : Si vous utilisez la validation en deux étapes chez Google, vous devez générer un mot de passe d’application.

    • Tester l’envoi d'un mail :

      echo "Contenu du mail" | mail -s "Titre du mail" AdresseDestinataire@gmail.com

  • Créer un script CloneSD.sh pour l’exécution du clonage :

    sudo nano CloneSD.sh
    

    Et copier le contenu suivant :

    #!/bin/bash
    DATE=$(date +"%Y-%m-%d")
    BoxToClone=RaspberryPi
    SdImgSize=2032664576
    FileName=SD-Backup_$BoxToClone\_$DATE.img
    File=/mnt/img_nas/$FileName
    
    
    #sans compression : sudo dd if=/dev/mmcblk0 bs=4M of=$File && sync
    sudo dd if=/dev/mmcblk0 bs=4M | sudo gzip -1 -| sudo dd of=$File && sync
    
    
    FileStat=$(wc -c "$File" | cut -f 1 -d ' ')
    
    
    if [ $? -eq 0 ]; then
            if [ $FileStat -ge $SdImgSize ]; then
                    Objet="($DATE) SD-Backup $BoxToClone : ERREUR"
                    Message="Taille du fichier $FileName incorrecte"
            else
                    #taille OK
                    Objet="($DATE) SD-Backup $BoxToClone : OK"
                    Message="Clonage OK"
            fi
    else
            if [ -e $File ]; then
                    sudo rm $File
            fi<br>
            Objet="($DATE) SD-Backup $BoxToClone : ECHEC"
            Message="Echec du Clonage : fichier inexistant."
    fi
    
    
    echo "$Message" | mail -s "$Objet"  AdresseDestinataire@gmail.com
    
  • Autoriser l’exécution de ce script CloneSD.sh :

    sudo chmod u+x /home/user/CloneSD.sh
    
  • Exécuter le script manuellement pour tester son bon fonctionnement :

    sudo bash /home/user/CloneSD.sh
    
  • Planifier l’exécution du script (chaque Mercredi à 9h dans l’exemple)

    sudo crontab -e
    
    • Ajouter la ligne suivante puis enregistrer :

      00 9 * * 3 sh /home/user/CloneSD.sh
      

Voilà, ce tutorial est terminé, vous aurez maintenant une image de votre carte SD au cas où un problème surviendrait et que celle-ci serait corrompue ou inutilisable.

N'hésitez pas à laisser des commentaires !

Source : Tutorial de Masterfion sur le forum de Jeedom

Guillaume

Ingénieur dans l'informatique passionné par la domotique, les nouvelles technologies, le Web et toutes les innovations dont ce dernier regorge.

Paris