Le raspberry pi est une superbe petite machine mais qui a un point faible c’est que son disque est une simple carte SD et ce type de support, certes économique, à une durée de vie assez limitée. Je vous propose donc ce script trouvé sur le site developer-blog.net que j’ai adapté à mon goût.

Au début je voulais l’envoyer directement sur mon pc fixe en le compressant à la volé. Mais malheureusement cela demandait trop de temps (plus de 10H) car le Rpi n’a pas les ressources nécessaires.

Alors comme modifications :

  • je l’ai francisé les affichage (pas les commentaires),
  • j’ai changé le tar en compression avec gzip (cela peut être long…)
  • j’ai ajouté l’arrêt du daemon docker. Si vous voulez l’utiliser n’oubliez pas d’ajouter ou de supprimer les services tournant sur votre RPI.
  • et changé diverses petites choses…

Dans une fenêtre Terminal Ctrl+Alt+T tapez les commandes suivantes :

sudo nano /usr/local/bin/backup.sh

Copiez le code ci-dessous :

#!/bin/bash

# Setting up directories
SUBDIR=raspberrypi_backups
DIR=/hdd/$SUBDIR

echo "Démarrage de la sauvegarde complète du RPI!"

# First check if pv package is installed, if not, install it first
PACKAGESTATUS=`dpkg -s pv | grep Status`;

if [[ $PACKAGESTATUS == S* ]] then
echo "Le Package 'pv' est installé."
else
echo "Le Package 'pv' n'est pas installé."
echo "Installation du package 'pv'. Patientez..."
apt-get -y install pv
fi

# Check if backup directory exists
if [ ! -d "$DIR" ];
then
echo "Le répertoire $DIR n'existe pas, création en cours ... !"
mkdir $DIR
fi

# Create a filename with datestamp for our current backup (without .img suffix)
OFILE="$DIR/backup_$(date +%Y%m%d)"

# Create final filename, with suffix
OFILEFINAL=$OFILE.img

# First sync disks
sync; sync

# Shut down some services before starting backup process
echo "Stopping some services before backup."
service apache2 stop
service mysql stop
service cron stop
service stop docker

# Begin the backup process, should take about 1 hour from 8Gb SD card to HDD
echo "Backing up SD card to USB HDD."
echo "This will take some time depending on your SD card size and read performance. Please wait..."
SDSIZE=`blockdev --getsize64 /dev/mmcblk0`;
pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE obs=1M conv=sync,noerror iflag=fullblock

# Wait for DD to finish and catch result
RESULT=$?

# Start services again that where shutdown before backup process
echo "Start the stopped services again."
service apache2 start
service mysql start
service cron start
service start docker

# If command has completed successfully, delete previous backups and exit
if [ $RESULT = 0 ];
then
rm -f $DIR/backup_*.img
mv $OFILE $OFILEFINAL
echo "RaspberryPI backup process completed! FILE: $OFILEFINAL.img"
exit 0
# Else remove attempted backup file
else
echo "Le backup n'a pas fonctionné. Le précédent est conservé"
rm -f $OFILE
exit 1
fi

On donne les droits à root de l’exécuter :

sudo chmod +x /usr/local/bin/backup.sh

Maintenant on ajoute une ligne à la crontab de root pour lancer son exécution tous les soirs à 00:00 :

sudo crontab -i

Ajoutez la ligne suivante :

00 00 * * * /usr/local/bin/backup.sh 1>/var/log/backup_pi.log 2>&1

Montage de votre clé USB sur le RPI. Dans un premier temps il faut trouver le device de la clé. Montez la et lancer la commande suivante :

sudo blkid

Vous devriez avoir ce type de résultat :

/dev/mmcblk0p1: SEC_TYPE="msdos" UUID="4B83-57F7" TYPE="vfat"
/dev/mmcblk0p2: UUID="0e55909e-fba1-4387-beb2-0a852a041e68" TYPE="ext4"
/dev/sda1: LABEL="ubuntu" UUID="A813-AACA" TYPE="vfat" PARTUUID="1b45097d-01"
/dev/mmcblk0: PTTYPE="dos"

Ici la clé usb est monté sur le device /dev/sda et possède une partition du type vfat. On va l’ajouter au fichier fstab pour qu’il soit monté automatiquement (ne pas oublié de mettre votre UUID à la place de XXXX-XXXX.

sudo nano /etc/fstab

UUID=XXXX-XXXX /hdd vfat rw,exec 0 0

Créons le point de montage et montons le :

sudo mkdir /hdd
sudo mount /a

Vous pouvez maintenant lancez le backup manuellement pour contrôler que tout se passe bien

sudo backup.sh