Comment sauvegarder et restaurer un Raspberry Pi ?


La perte de données en informatique a toujours été un problème important à prendre en compte, quel que soit le support. Et souvent ce n’est pas la sauvegarde le problème, mais la vérification de celles-ci …
Si tout comme moi vous faites pas mal de changements sur votre Raspberry Pi, cela peut être une bonne idée de considérer la mise en place d’une sauvegarde
Et c’est encore mieux de s’assurer que les sauvegardes qui sont faites sont récupérables 🙂

Comment faire une sauvegarde de son Raspberry Pi ?
Il existe plusieurs méthodes possibles pour la sauvegarde d’un Raspberry Pi :
– Sauvegarder uniquement les fichiers importants (configuration, documents, bases de données)
– Faire une image complète de la carte SD sur un autre ordinateur
– Ou encore faire un backup complet du Raspberry Pi sans l’éteindre
Tout dépendra de votre utilisation de ce dernier, et de la criticité des données

Nous allons maintenant voir en détail comme aborder chacune de ces solutions

Sauvegarde des fichiers importants du Raspberry Pi

La première méthode est sans doute celle que vous utiliserez la plupart du temps pour une sauvegarde simple de votre Raspberry Pi. Il s’agit de mettre de côté uniquement les fichiers utiles ou importants.
Par exemple, si vous utilisez un Raspberry Pi pour piloter une caméra de surveillance, une fois le fichier de configuration sauvegardé, c’est suffisant, il n’y a rien d’autre de bien utile sur ce système.

Nous allons donc voir les étapes suivantes :

  • Comment créer un script qui s’occupera de cela
  • Puis comment le planifier pour sauvegarder les fichiers modifiés automatiquement
  • Comment envoyer les sauvegardes vers un autre ordinateur (dans le script ou manuellement)
  • Et finalement comment restaurer ces fichiers !

Script

Avant de passer à la création du script, il vous faudra bien sur identifier les fichiers à sauvegarde
Dans mon script, je vais utiliser un fichier et un dossier, comme ça vous pourrez adapter à vos besoins :

  • /etc/app1/file1.conf
  • /etc/app2

Pour commencer, nous allons créer un dossier de sauvegarde pour copier les fichiers dedans plus tard :
mkdir /home/pi/backups

Créez ensuite un script avec nano :
sudo nano /usr/local/bin/backup.sh

Et créer quelques lignes sur ce modèle suivant vos besoins :
#!/bin/bash
/bin/cp /etc/app1/file1.conf /home/pi/backups
/bin/cp /etc/app2 /home/pi/backups/ -r

Comme vous pouvez le voir c’est un script très simple, qui va écraser les fichiers chaque jour avec la nouvelle version
Nous allons ensuite l’améliorer à plusieurs niveaux

Utilisation de variables

La première bonne pratique à mettre en place est d’utiliser des variables dans ce script
Par exemple, si vous avez 200 fichiers à sauvegarder vers /home/pi/backups, et que demain vous avez besoin d’envoyer les fichiers vers /media/nas/pi par exemple, il vous faudra modifier les 200 lignes du script pour modifier ce dossier de destination

Vous pouvez également faire la même chose pour la commande « cp ». Ainsi si vous devez changer pour utiliser rsync ou autre, vous aurez juste une ligne à modifier

Voici un script légèrement amélioré :
#!/bin/bash
DEST_FOLDER='/home/pi/backups/'
BACKUP_CMD='/bin/cp'

$BACKUP_CMD /etc/app1/file1.conf $DEST_FOLDER
$BACKUP_CMD /etc/app2 $DEST_FOLDER -r

Le résultat sera le même, mais il sera bien plus simple de le mettre à jour si nécessaire

Compression des fichiers

La plupart du temps, on utilise la compression pour les sauvegardes, ou au moins on crée un fichier d’archive
Je vais utiliser tar pour archiver les fichiers en un seul, puis gzip pour compresser ce fichier

Voici à quoi pourrait ressembler votre script en ajoutant cela :
#!/bin/bash
DEST_FOLDER='/home/pi/backups/'
DEST_FILE='backup.tar'
BACKUP_CMD='/bin/tar -rvf'

/bin/rm $DEST_FOLDER/$DEST_FILE.gz
$BACKUP_CMD $DEST_FOLDER/$DEST_FILE /etc/app1/file1.conf
$BACKUP_CMD $DEST_FOLDER/$DEST_FILE /etc/app2
/bin/gzip $DEST_FOLDER/$DEST_FILE

J’ajoute donc une nouvelle variable DEST_FILE pour indiquer le nom du fichier de sauvegarde
La commande « tar -rvf » permet d’ajouter des fichiers à notre fichier tar existant
Et « gzip » permet de compresser ce fichier une fois terminé

Eviter l’écrasement

Ce script n’est toujours pas parfait, puisque chaque jour nous effaçons le fichier de la fois d’avant
Ce n’est pas optimal. S’il y a un problème avec la sauvegarde, nous serons incapables de récupérer un fichier plus ancien

La bonne pratique est d’ajouter la date et l’heure de la sauvegarde dans le nom du fichier, comme ceci :
#!/bin/bash
DEST_FOLDER='/home/pi/backups/'
DEST_FILE='backup-$(date +%F_%R).tar'
BACKUP_CMD='/bin/tar -rvf'

$BACKUP_CMD $DEST_FOLDER/$DEST_FILE /etc/app1/file1.conf $BACKUP_CMD $DEST_FOLDER/$DEST_FILE /etc/app2/bin/gzip $DEST_FOLDER/$DEST_FILE

Rien n’a changé à part l’ajout de la date dans la variable DEST_fILE, ce qui nous permet d’éviter d’effacer le fichier précédent

À chaque fois que le script va tourner, il va maintenant créer un nouveau fichier et conserver toutes les anciennes versions

Planification des sauvegardes

Maintenant que notre script est créé, le plus gros du travail est fait

Il ne nous reste plus qu’à programmer ce script afin qu’il se lance automatiquement chaque jour par exemple
Pour cela, nous allons passer par le fichier crontab :

  • Ouvrez le crontab de l’utilisateur :
    crontab -e
  • Collez cette ligne à la fin du fichier :
    0 0 * * * /usr/local/bin/backup.sh
    Cette tâche planifiée va lancer votre script chaque jour à minuit.
    Je vous laisse modifier cela si nécessaire
  • Sauvegardez et quittez (CTRL+O, Entrée, CTRL+X)

Si vous sauvegardez des fichiers nécessitant des droits pour y accéder, n’oubliez pas de programmer ce script dans le crontab de root :
sudo crontab -e

Si vous n’êtes pas très à l’aise avec cela, n’hésitez pas à lire mon tutoriel sur la planification de tâches sur Raspberry Pi

Effacement des anciens fichiers

Maintenant que notre script est programmé, il va créer un nouveau fichier chaque jour, mais les anciens ne seront jamais effacés
Ce que vous pouvez faire afin de libérer un peu de place est de supprimer les fichiers qui ont plus d’une semaine (à adapter suivant vos besoins bien sur)

Pour faire cela, vous pouvez ajouter cette commande à la fin du script :
/usr/bin/find $DEST_FOLDER -mtime +8 -delete

En faisant cela, vous aurez 8 fichiers de sauvegardes disponibles à tout moment dans l’histoire du dossier de destination
Je vous laisse adapter le délai pour augmenter ou diminuer le nombre de fichiers à garder (tout dépend de la place occupée et du temps que vous mettrez à vous rendre compte d’un problème)

C’est toujours bien de garder au minimum quelques jours d’historique
Vous ne pouvez pas être certain de voir le problème dès le premier jour

Envoi des sauvegardes sur le réseau

Nous avons maintenant un backup quotidien avec plusieurs jours d’historique sur notre carte SD, mais cela ne suffira pas en général.
Si demain votre carte SD ne fonctionne plus, cela ne vous aidera pas beaucoup d’avoir 8 fichiers de sauvegarde dessus
Il nous faut copier ces fichiers vers un autre ordinateur du réseau afin d’éviter ce problème

Sur un ordinateur Linux ou un NAS

Si vous avez un ordinateur Linux (ou même un NAS) sur votre réseau, il est possible de transférer les fichiers de sauvegarde dessus pour les garder en sécurité
Cela fonctionne de la même façon si vous avez un Mac

Manuellement

La première méthode est de la faire manuellement
Si vos fichiers ne changent pas souvent ou qu’ils ne sont pas bien critiques, vous pouvez simplement le faire de temps en temps pour être un peu plus sûr que si tout reste sur le Raspberry Pi

Pour transférer les fichiers depuis le Raspberry Pi vers l’ordinateur en question, vous pouvez utiliser rsync
Il faut d’abord s’assurer qu’il est installé sur les deux machines :
sudo apt install rsync
(à adapter suivant votre distribution)

Puis créez un dossier sur l’ordinateur :
mkdir /home/[UTILISATEUR]/backups_pi

Et enfin transférez les fichiers, avec l’une de ces méthodes :

  • Depuis l’ordinateur :
    rsync -auzr pi@[RASPBERRY_IP]:/home/pi/backups/* /home/[UTILISATEUR]/backups_pi/
  • Ou depuis le Raspberry Pi :
    rsync -auzr /home/pi/backups/* [USER]@[IP_ORDINATEUR]:/home/[UTILISATEUR]/backups_pi/

N’oubliez pas de remplacer les variables entre crochets par l’adresse IP des équipements et votre nom d’utilisateur sur l’ordinateur
Et vous pouvez également supprimer les fichiers une fois transférés si cela vous arrange

Automatiquement

Comme pour la partie sauvegarde, il est toujours plus intéressant d’automatiser ce genre de tâche
Le problème, c’est qu’un mot de passe vous sera demandé à chaque lancement de la commande
Pour éviter cela, il faudra faire un échange de clés SSH entre les deux machines

Dans ce cas, je vais partir du principe que c’est votre ordinateur qui déclenche le transfert
Si vous préférez le faire dans l’autre sens, je vous laisse adapter et faire l’inverse

Echange de clés :

  • Commencez par générer une clé SSH sur votre ordinateur si vous n’en avez pas encore :
    ssh-keygen -t dsa
    Appuyez sur Entrée pour chaque question, laissez la « passphrase » vide
  • Puis transférez la clé publique vers le Raspberry Pi
    rsync ~/.ssh/id_rsa.pub pi@[RASPBERRY_IP]:/home/pi/
    C’est la dernière fois qu’un mot de passe est nécessaire 🙂
  • Depuis le Raspberry Pi, ajoutez ce fichier dans vos clés autorisées :
    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
  • Essayez maintenant de vous connecter depuis l’ordinateur, cela ne devrait plus demander de mot de passe :
    ssh pi@[RASPBERRY_IP]

Script simple :

Vous devriez maintenant être capable de lancer la commande « rsync » sans avoir besoin de taper de mot de passe
Nous pouvons donc créer un script de ce genre :
#!/bin/bash
rsync -auzr pi@[RASPBERRY_IP]:/home/pi/backups/* /home/[USER]/backups_pi/find /home/[USER]/backups_pi -mtime -8 -delete

Puis le programmer en l’ajouter au crontab comme indiqué précédemment

Vers un ordinateur Windows

Si votre ordinateur est sous Windows, le principe sera similaire, mais il faudra passer par des logiciels cette fois 🙂

Manuellement

Pour transférer manuellement les fichiers du Raspberry Pi vers Windows, la méthode la plus simple sera d’installer le logiciel WinSCP sur Windows
C’est un logiciel gratuit pour transférer des fichiers via SSH :

  • Une fois installé, démarrez-le
  • Ajoutez un nouveau site avec les informations du Raspberry Pi :
  • Cliquez sur « Save » et connectez-vous
  • Sur la droite, vous verrez les fichiers du Raspberry Pi, et sur la gauche, ceux du PC
    Vous pouvez transférer les fichiers d’un côté à l’autre avec un glisser et déposer
    Rendez-vous dans /home/pi/backups du côté Raspberry Pi et récupérez les fichiers sur votre ordinateur
  • Vous pouvez bien sur supprimer les vieux fichiers présents sur votre ordinateur pour ne garder que les plus récents

Automatiquement

Si vous souhaitez automatiser cela, WinSCP ne sera pas la solution
Et installer SSH sur Windows n’est vraiment pas pratique
Il nous faut donc trouver un autre moyen
Ce que je vous propose, c’est de partager un dossier sur Windows, et de laisser le Raspberry Pi gérer l’automatisation de la copie

Partager un dossier

Voici comment partage un dossier sur Windows :

  • Créez un nouveau dossier qui accueillera vos sauvegardes
  • Faites un clic droit sur ce dossier et choisissez Propriétés dans le menu
  • Rendez-vous dans l’onglet Partage et cliquez sur Partager
  • Par défaut, l’utilisateur de l’ordinateur aura accès à ce partage, mais vous pouvez ajouter d’autres utilisateurs si vous voulez
    Il vous faudra par contre un utilisateur avec un mot de passe
    Si votre utilisateur actuel n’en a pas, définissez en un ou créez un autre compte pour les sauvegardes
  • Une fois que tout est prêt, cliquez sur le bouton Partager
  • C’est bon, vous partagez maintenant ce dossier sur le réseau local
    Souvenez-vous du chemin d’accès que vous utiliserez par la suite
    Pour moi cela ressemblait à : \\[IP]\Utilisateurs\[UTILISATEUR]\Bureau\partage

Accéder au partage depuis le Raspberry Pi

Nous devons maintenant accéder à ce partage depuis le Raspberry Pi
Pour faire cela de manière permanente, voici comment faire :

  • Créez un dossier qui servira de point de connexion
    sudo mkdir /media/partage
  • Modifiez le fichier fstab
    sudo nano /etc/fstab
    Ce fichier sert à gérer les disques et partages sur Linux et donc le Raspberry Pi
  • Collez cette ligne :
    //[IP]/Utilisateurs/[UTILISATEUR]/Bureau/partage /media/partage cifs username=[UTILISATEUR],password=[MOTDEPASSE],iocharset=utf8 0 0
    Remplacez les variables entre croches pour que cela corresponde à votre environnement
    Notez qu’il faut utiliser des slashs et non des antislashs pour le chemin réseau
  • Sauvegardez et quittez (CTRL+O, Entrée, CTRL+X)
  • Montez le partage manuellement :
    sudo mount /media/partage

Votre dossier partagé est maintenant accessible sur le Raspberry Pi dans /media/partage
Si vous créez un fichier à cet emplacement, vous le retrouverez sur l’ordinateur Windows, par exemple :
sudo touch /media/partage/test

Exemple de script

Enfin, il ne nous reste plus qua faire un script tout simple pour copier les fichiers sur ce partage régulièrement (pensez bien à le programmer ensuite) :
#!/bin/bash
cp /home/pi/backups/* /media/partage/
find /media/partage -mtime +8 -delete

Je ne vous recommande pas de changer directement la destination dans le premier script de sauvegarde, puisque cela ne fonctionnera pas si votre ordinateur est éteint

Récupération de la sauvegarde

Cette sauvegarde sera la plus simple à récupérer parmi toutes les solutions que je vous propose dans cet article
Vous aurez simplement besoin d’extraire les fichiers de l’archive et de les renvoyer vers le Raspberry Pi dans le dossier d’origine

Depuis Linux

Sur Linux, vous pouvez utiliser le logiciel de compression par défaut fourni avec votre système
Par exemple, sur Ubuntu, double cliquez sur le fichier de sauvegarde pour l’ouvrir et voir les fichiers à l’intérieur
Cliquez ensuite sur « Extraire »

Une fois les fichiers récupérés, renvoyez les sur le Raspberry Pi en utilisant rsync comme vu précédemment

Depuis Windows

Sur Windows, je pense que l’outil par défaut ne saura pas ouvrir nos fichiers .tar.gz
Il faudra donc installer et utiliser un logiciel comme 7zip ou WinRAR

Décompressez les fichiers et utilisez WinSCP comme vu précédemment pour le transférer sur le Raspberry Pi

Essayez le !

Comme je vous l’ai dit en introduction, la plupart des problèmes avec les sauvegardes apparaissent lorsque l’on essaye de récupérer les données sauvegardées une fois que tout est perdu
Il est donc très important d’essayer de faire cette récupération au moins une fois avant de se considérer en sécurité

L’idéal étant de réinstaller Raspbian sur une nouvelle carte SD et de tenter de retrouver la même configuration qu’avant en utilisant la sauvegarde mise en place

Supervision

Pour cette première solution, il sera également facile de surveiller le bon fonctionnement de vos sauvegardes

Vous pouvez par exemple créer un script comme celui-ci, qui vérifiera qu’il existe des fichiers récents dans le dossier de destination :

#!/bin/bash

if [[ $(find /home/pi/backups -type f -mtime -1) ]]; then
echo "Backup OK" //DO NOTHING
else
echo "Backup KO" //DO SOMETHING (MAIL ?)
fi

Export des données MySQL

If vous avez des bases de données MySQL à sauvegarder sur votre Raspberry Pi, la procédure sera un peu différente, car vous ne pouvez pas sauvegarder les fichiers directement

Sauvegarde

Pour sauvegarder des bases de données MySQL, il va d’abord falloir exporter les données, puis les sauvegarder comme dans le premier cas

Exporter la base en utilisant la commande suivante :
mysqldump -uroot -p[MOTDEPASSE] [NOM-BASE] > export-[NOM-BASE].sql

Cette commande va créer un fichier contenant toutes les requêtes SQL nécessaires pour recréer la base de zéro
Vous pouvez suivre les étapes vu précédemment pour automatiser cela :

  • Créer un script
  • Le planifier
  • Transférer les fichiers sur un autre appareil

Si vous avez plusieurs bases à sauvegarde, ajoutez une ligne par base, en changeant bien le nom du fichier et de la base à chaque fois

Récupération

Pour récupérer une base de donnée perdue vous devrez tout d’abord suivre les mêmes étapes que dans le cas d’une sauvegarde de fichiers
Une fois le fichier .sql en question récupéré sur le Raspberry Pi, la commande suivante vous permettra d’importer les données dans une base vide :
mysql -uroot -p[MOTDEPASSE] [NOM-BASE] < export-[NOM-BASE].sql*

La base devrait être vide afin que l’import fonctionne
Donc en fonction de la situation, vous devrez suivre l’une de ces méthodes :

  • Importer la sauvegarde dans une base avec un nom différent, puis copier uniquement ce qui est nécessaire dans la base qui a un problème
  • Ou renommer la base corrompue, la recréer (vide) et ensuite importe le fichier

Comme dans le cas d’un backup de fichiers simples, n’oubliez pas de tester cela au moins une fois avant de considérer que vous avez une sauvegarde en place 🙂

Créer une image de la carte SD

Nous avons donc vu dans les parties précédentes comment sauvegarder certains fichiers de votre Raspberry Pi
Maintenant, comment faire si l’installation est très complexe et que vous préférez faire une sauvegarde complète du Raspberry Pi plutôt que de lister tous les fichiers concernés ?

Sauvegarde

Le but de cette méthode de sauvegarde sera de créer une image contenant tous les fichiers du Raspberry Pi
Cela vous permettra de la remettre un jour sur une nouvelle carte SD afin de récupérer votre Raspberry Pi à l’identique

Linux

Si vous avez un PC sous Linux, vous pouvez utiliser la commande « dd » pour créer une image de la carte SD

  • Éteignez le Raspberry Pi et récupérez la carte SD
  • Insérez-la sur votre ordinateur
  • Identifiez le nom de la carte SD :
    sudo fdisk -l
    Cette commande va afficher l’ensemble des périphériques de stockage sur votre ordinateur
    Vous devriez voir votre disque dur, et quelque part à la fin de la liste votre carte SD
    Notez le nom indiqué (en général /dev/sdX ou /dev/mmcblk0)
  • Créer l’image de cette manière :
    sudo dd bs=4M if=/dev/mmcblk0 of=backup.img
    N’oubliez pas de remplacer le nom du périphérique et du fichier de destination si nécessaire

Après quelques minutes, vous aurez le backup complet de votre Raspberry Pi dans ce fichier (backup.img dans mon cas)

Cette commande fonctionne aussi sur MacOS, remplacez juste 4M par 4m

Windows

Sur Windows, le mieux sera d’utiliser Win32 Disk Imager pour cela

  • Téléchargez le logiciel Win 32 Disk Imager ici si besoin et installez-le
  • Lancez-le, vous obtiendrez une fenêtre comme cela :
  • Entrez le chemin de destination pour l’image et le nom du fichier (au format .img)
  • Sélectionnez la lettre correspondant à la carte SD à copier
  • Cliquez sur « Read »
  • Cet outil va ainsi créer une image dans le dossier indiqué

Récupération

Le plus simple pour réutiliser ensuite cette image de sauvegarde est d’utiliser Etcher afin de créer une nouvelle carte SD identique :

  • Téléchargez Etcher depuis leur site officiel
  • Installez-le et lancez-le
  • Choisissez une image de sauvegarde sur la gauche
  • Sélectionnez votre carte SD
  • Puis cliquez sur le bouton « Flash! »

Quelques minutes plus tard, vous obtiendrez une carte SD identique au système qui a été sauvegardé précédemment

Sur Linux et Mac, vous pouvez aussi utiliser « dd » à nouveau pour créer la carte SD (l’inverse de tout à l’heure) :
sudo dd bs=4M if=backup.img of=/dev/mmcblk0

Si vous avez une carte SD vierge disponible, n’hésitez pas à tester cette procédure dès maintenant pour vous assurer que tout fonctionne comme prévu

Cloner un Raspberry Pi en fonctionnement (hot backup)

Cette dernière méthode reprend le même principe que la précédente, mais en poussant cela un peu plus, notamment pour les systèmes critiques
Si vous ne pouvez/voulez pas arrêter votre Raspberry Pi afin de réaliser la sauvegarde complète, je vous propose cette solution

Pré-requis

Je vais vous présenter deux manières de faire une sauvegarde complète d’un Raspberry Pi en fonctionnement (depuis un outil graphique ou en ligne de commande)
Dans les deux cas, il vous faudra connecter une seconde carte SD à votre Raspberry Pi afin de copier une carte vers l’autre

Si vous n’en avez pas encore, le moyen le moins onéreux est sans doute de partir sur un adaptateur USB bon marché sur Amazon (comme celui-ci par exemple)

PiClone (version Desktop)

Si votre Raspberry Pi utilise la version Desktop de Raspbian, il existe un outil appelé PiClone que vous pouvez utiliser pour cela
Le nom dans le menu principal est « SD Card Copier »
Vous le trouverez dans les accessoires

L’utilisation du logiciel est très intuitive :

  • Choisissez la carte SD à copier dans la première liste
  • Puis la carte SD de destination dans la seconde
  • Appuyez ensuite sur « Start » pour démarrer la copie
  • Attendez quelques instants et récupérer la carte SD

N’hésitez pas à démarrer ensuite cette carte SD sur un autre Raspberry Pi identique si vous en avez la possibilité, afin de vous assurer que cela fonctionne

Script (version Lite)

Si vous êtes sur Raspbian Lite ou si vous préférez utiliser un script pour pouvoir l’automatiser, voici comme faire via un script disponible sur Internet

Je vais vous expliquer ici comment utiliser ce script
Mais vous trouverez toutes les informations complémentaires sur la page GitHub du projet

  • Installez git pour commencer :
    sudo apt install git
  • Lancez ensuite le téléchargement du script et installez-le :
    cd ~/Downloads
    git clone https://github.com/billw2/rpi-clone.git
    cd rpi-clone
    sudo cp rpi-clone rpi-clone-setup /usr/local/sbin
  • Utilisez ensuite fdisk pour récupérer le nom de la carte SD pour la sauvegarde
    sudo fdisk -l
    Vous devriez voir la carte SD principale (en général /dev/sda ou /dev/mmcblk0)
    Et en dessous la carte SD pour le backup (par exemple /dev/sdb ou /dev/mmcblk1)
  • Enfin, utilisez le script pour dupliquer la carte en cours d’utilisation
    Par exemple :
    sudo rpi-clone sdb -v
    Adaptez si nécessaire le nom de la carte dans la commande

Conclusion

Et voilà! Vous savez maintenant comme réaliser des sauvegardes de votre Raspberry Pi de plusieurs manières

Essayez de les programmer ou en tout cas de les faire régulièrement
Sans oublier de les vérifier de temps en temps

Il n’y a rien de pire qu’une sauvegarde qui ne s’est pas lancée depuis des mois, ou que l’on est incapable de récupérer, car le test n’a jamais été fait 🙂

Patrick Fromaget

Je suis l'auteur principal et le créateur de RaspberryTips. Mon but est de vous aider sur tous vos problèmes qui concernent Raspberry Pi and publiant des guides détaillés et des tutorials rapides. Dans la vraie vie, je suis administrateur système (Linux principalement) avec un expérience dans le développement web.

Recent Content