Mise en place d’un script de sauvegarde de la carte SD d’un Raspberry vers un disque dur ou un emplacement réseau et mode opératoire pour la restauration sur une nouvelle carte SD.
Sommaire
Emplacement de la sauvegarde
Commencer par créer un emplacement pour la sauvegarde de la carte SD.
L’emplacement peut être sur un disque dur local ou sur un disque réseau monté sur le Raspberry à sauvegarder.
Sur la machine hébergeant le disque dur de sauvegarde :
1mkdir /home/partage/Sauvegarde_SD
Si le disque dur est en local sur la machine à sauvegarder, passer directement au chapitre suivant « script de sauvegarde ». Sinon réaliser les étapes ci-dessous pour monter le disque dur en réseau sur la machine à sauvegarder.
Pré-requis : le disque dur de sauvegarde doit être partagé sur le réseau local.
Dans cet exemple le dossier /home/partage est partagé via samba avec les droits en lecture/écriture.
Exemple : partage réseau avec Samba
Sur le Raspberry à sauvegarder, créer le répertoire pour le montage du disque réseau :
1sudo mkdir /mnt/Sauvegarde_SD
Editer le fichier /etc/fstab pour monter le répertoire au démarrage :
1sudo nano /etc/fstab
Ajouter la ligne suivante, penser à renseigner le username et password :
1//192.168.1.50/partage/Sauvegarde_SD /mnt/Sauvegarde_SD cifs rw,username=xxx,password=xxx,uid=1000,gid=1000,_netdev 0 0
Avec 192.168.1.50 = ip locale de la machine hébergeant le disque dur et partage = [nom du partage] configuré dans /etc/samba/smb.conf.
Monter le disque :
1sudo mount /mnt/Sauvegarde_SD
Vérifier si le montage a fonctionné :
1mount | grep /mnt/Sauvegarde_SD
Script de sauvegarde
Créer le script Save_SD.sh dans le répertoire /home/pi du Raspberry à sauvegarder.
1nano Save_SD.sh
Copier – coller le script ci-dessous et enregistrer. Penser à ajuster la variable DOSSIER. Si nécessaire, dé-commenter les lignes pour l’arrêt et le redémarrage des services Nginx, PHP et MySQL. Le log des sauvegardes se fait dans /home/pi/Save_SD.log.
12345678910111213141516171819202122232425262728293031323334353637383940414243#!/bin/bashexec 3>&1 1>>/home/pi/Save_SD.log 2>&1DATE=$(date +"%Y-%m-%d %Hh%M")DOSSIER=/mnt/Sauvegarde_SDBOOT=Partition_1.tar.gzSYSTEME=Partition_2.tar.gzif grep -qs $DOSSIER /proc/mounts; thenecho "===== Début de la sauvegarde $(date +"%Y-%m-%d %Hh%M") =====" | tee /dev/fd/3# echo "Arrêt des services nginx, php, mysql" | tee /dev/fd/3# sudo service nginx stop# sudo service php5-fpm stop# sudo service mysql stopecho "$(date +"%Y-%m-%d %Hh%M") : Début de la sauvegarde de /boot/" | tee /dev/fd/3sudo tar -cpf $DOSSIER/$BOOT /boot/ --one-file-systemRESULT=$?if [ $RESULT = 0 ]; thenecho "$(date +"%Y-%m-%d %Hh%M") : Sauvegarde de /boot/ effectuée dans $BOOT" | tee /dev/fd/3elif [ $RESULT = 1 ]; thenecho "$(date +"%Y-%m-%d %Hh%M") : Sauvegarde de /boot/ effectuée dans $BOOT mais certains fichiers peuvent différer" | tee /dev/fd/3elseecho "$(date +"%Y-%m-%d %Hh%M") : Erreur lors de la sauvegarde de /boot/" | tee /dev/fd/3fiecho "$(date +"%Y-%m-%d %Hh%M") : Début de la sauvegarde de /" | tee /dev/fd/3sudo tar -cpf $DOSSIER/$SYSTEME / --one-file-systemRESULT=$?if [ $RESULT = 0 ]; thenecho "$(date +"%Y-%m-%d %Hh%M") : Sauvegarde de / effectuée dans $SYSTEME" | tee /dev/fd/3elif [ $RESULT = 1 ]; thenecho "$(date +"%Y-%m-%d %Hh%M") : Sauvegarde de / effectuée dans $SYSTEME mais certains fichiers peuvent différer" | tee /dev/fd/3elseecho "$(date +"%Y-%m-%d %Hh%M") : Erreur lors de la sauvegarde de /" | tee /dev/fd/3fi# echo "Redémarrage des services nginx, php, mysql" | tee /dev/fd/3# sudo service mysql start# sudo service nginx start# sudo service php5-fpm startecho "===== Fin de la sauvegarde $(date +"%Y-%m-%d %Hh%M") =====" | tee /dev/fd/3exit 0elseecho "$(date +"%Y-%m-%d %Hh%M") : Erreur, le repertoire de sauvegarde n'est pas monté" | tee /dev/fd/3exit 0fi
Rendre le script exécutable :
1chmod +x Save_SD.sh
Lancer la sauvegarde avec :
1sudo ./Save_SD.sh
Une fois la sauvegarde terminée, vérifier la présence des archives Partition_1.tar.gz (~20 Mo) et Partition_2.tar.gz (>1,80 Go).
1ls -l /mnt/Sauvegarde_SD/
Programmer la sauvegarde
Programmer la sauvegarde automatique de la carte SD tous les 6 mois avec crontab :
1sudo crontab -e
Ajouter la ligne ci-dessous à la fin et enregistrer.
10 4 1 6,12 * sudo sh /home/pi/Save_SD.sh
La sauvegarde se lancera les 1er juin et 1er décembre à 4h00.
Pour personnaliser la programmation : https://crontab.guru/
Restauration de la carte SD
Utiliser gparted ou fdisk pour créer 2 partitions, la première de 50 Mo qui sera de type W95 et formatée en FAT32 et la seconde du reste de l’espace disponible de type Linux et formatée en ext4.
Repérer la carte SD et lancer fdisk (penser à démonter les partitions)
12sudo fdisk -lsudo fdisk /dev/sdd
- Lister les partitions : commande « p »
- Supprimer les partitions existantes : commande « d »
- Créer une nouvelle table vide de partitions DOS : commande « o »
- Ajouter une première partition : commande « n », p (primaire), numéro 1, premier secteur par défaut, +50M (taille)
- Ajouter une seconde partition : commande « n », p (primaire), numéro 2, premier secteur par défaut, deuxième secteur par défaut
- Modifier le type de la partition 1 : commande « t », numéro 1, code hexa « c »
- Sauvegarder et quitter : commande « w »
Formater et nommer les partitions.
Label première partition : boot
Label seconde partition : rootfs
12sudo mkfs.vfat -F 32 -n boot /dev/sdd1sudo mkfs.ext4 -b 4096 -L rootfs /dev/sdd2
Monter les partitions avec l’explorateur de fichier ou manuellement.
1234sudo mkdir /media/sdcard/bootsudo mkdir /media/sdcard/rootfssudo mount /dev/sdd1 /media/sdcard/bootsudo mount /dev/sdd2 /media/sdcard/rootfs
Extraire les archives de sauvegarde Partition_1.tar.gz et Partition_2.tar.gz respectivement sur les partitions boot et rootfs.
12sudo tar -xvpf /chemin/vers/Partition_1.tar.gz -C /media/sdcard/boot/ --numeric-ownersudo tar -xvpf /chemin/vers/Partition_2.tar.gz -C /media/sdcard/rootfs/ --numeric-owner
Une fois l’extraction terminée, déplacer tous les fichiers dans /media/sdcard/boot/boot vers /media/sdcard/boot.
12mv /media/sdcard/boot/boot/* /media/sdcard/boot/rm -R /media/sdcard/boot/boot
Démonter les partitions et retirer la carte SD.
1sudo umount /media/sdcard/*
Il ne reste plus qu’à booter sur la nouvelle carte SD depuis le Raspberry.