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