Raspberry Pi Home Server : faire un backup automatique de la carte SD

Après le plantage de ma carte SD il y a peu (voir ici), je me suis dit qu’il était temps de se mettre à la recherche d’un moyen de faire une sauvegarde de la carte SD automatiquement.

Raspberry Pi Home Server : faire un backup automatique de la carte SD

J’ai parcouru les forums et je suis tombé sur une série de post assez intéressant (ici et entre autres) et j’ai voulu regrouper un peu c’est informations et les utiliser pour assurer un minimum que si mon système plante, je ne me retrouve pas à tout réinstaller.

Je suis donc parti sur le principe que faire une sauvegarde de la carte avec dd alors que le système est en train de tourner, ça n’est pas une bonne idée. L’idéal est que ce soit un autre OS qui fonctionne. Comme il est possible de démarrer une distribution sur une clé USB, j’avais mon système de backup :

  1. Depuis mon système principal, je redémarre le Raspberry Pi et boote sur une clé USB qui contient une distribution minimaliste
  2. Une fois dans ce système, je lance mes sauvegardes
  3. A la fin des sauvegardes, je redémarre vers mon système principal

J’ai choisi de laisser les sauvegardes sur la clé USB qui chez moi sera plus facilement accessible que le disque dur. Sous Mac OS j’ai installé Fuse qui permet de lire les partitions ext4 donc je peux facilement récupérer des archives si besoin.

Ne reste plus qu’à passer à l’action !

  1. Faire une sauvegarde de votre carte SD avant toute chose (oui oui manuellement, on sait jamais)
    dd –bs=1m if=/dev/<xxx> of=<nom_image>.img
  2. Installer Moebius sur une clé USB en suivant les instructions ici
    La partition de boot sur la clé USB sera sdX2 où X sera a ou b
    Chez moi c’est /dev/sda2 c’est ce que nous allons utiliser par la suite
  3. Sur la partition /boot de la carte SD, sauvegarder le fichier /boot/cmdline.txt en /boot/cmdline.txt.origin et /boot/cmdline.txt.usbkey
  4. Editer /boot/cmdline.txt.usbkey (toujours de la carte SD) et remplacer
    root=/dev/mmcblk0p2

    Par

    root=/dev/sda2
  5. A partir de maintenant en utilisant cmdline.txt.origin, on boote sur la carte SD, en utilisant cmdline.txt.usbkey, on boote sur la clé USBCopier /boot/cmdline.txt.usbkey à la place de /boot/cmdline.txt, brancher la clé USB et relancer le Raspberry Pi
  6. Se connecter en SSH. Attention le mot de passe est de nouveau raspi puisque la distribution est toute fraiche
  7. Le système va lancer le menu de configuration. Le quitter sans rien faire.Agrandir la partition principale ne va pas fonctionner car il se base par défaut sur la carte SD et non le périphérique utilisé.
  8. Se reconnecter
  9. Mettre à jour le système
    apt-get update
  10. Installer partclone qui va permettre la sauvegarde d’une partition
    apt-get install partclone
  11. Mon choix a été de créer une partition à part qui va utiliser le reste de la clé pour y stocker les sauvegardes de ma carte SD. Donc j’ai utilisé fdisk pour y ajouter une partition principale avec fdisk /dev/sda
  12. Modifier le fichier /etc/fstab pour monter automatiquement la partition au démarrage. Utiliser le UUID pour garantir le montage de la bonne partition (voir ici pour le montage avec UUID)
  13. Utiliser la commande dmesg pour identifier la carte, généralement mmcblk0backup-1
  14. L’objectif maintenant est de créer un script qui après le redémarrage va effectuer les actions suivantes :
    1. Définir les différents paramètres
      BACKUP_PATH=/backup
      
      BACKUP_TYPE=full ou BACKUP_TYPE=partition
    2. S’assurer de trouver la carte et que la partition de backup est bien montée
      mount | grep $BACKUP_PATH
    3. Au choix :
      • Sauvegarder la totalité de la carte (BACKUP_TYPE=full)
      • Sauvegarder le MBR, la partition boot et la partition système (BACKUP_TYPE=partition)
    4. Sur la partition /boot de la carte SD mettre le cmdline.txt.origin à la place du cmdline.txt
    5. Redémarrer (le script est disponible ici backup_sdcard.sh)
  15. Ajouter le script dans /etc/init.d pour qu’il soit lancé au démarrage du système
    update-rc.d backup_sdcard.sh defaults
  16. Si vous lancez manuellement le script, ca devrait vous créer une sauvegarde du système principal dans le répertoire de sauvegarde
  17. Copier /boot/cmdline.txt.origin à la place de /boot/cmdline.txt, relancer le Raspberry Pi
  18. Créer un script backup_sdcard.sh sur le système d’origine
    #! /bin/sh
    
    # Copy cmdline.txt.usbkey on cmdline.txt
    
    cp /boot/cmdline.txt.usbkey /boot/cmdline.txt
    
    # Reboot
    
    reboot
  19. A vous de décider si vous le lancez manuellement ou par crontab régulièrement

Voilà ! Si vous avez des soucis ou des remarques, les commentaires sont ouverts !

Bonne fêtes à tous

27 réflexions au sujet de « Raspberry Pi Home Server : faire un backup automatique de la carte SD »

  1. Si je comprends bien, il faut rebooter le serveur pour faire la sauvegarde ? Où est l’automatisation de la sauvegarde ???

    J’attendais cet article avec impatience, mais je pense que je vais faire autrement (un tar gz de /etc et /var ainsi qu’un dump de la base mysql, exécutés par cron, me semblent suffisants, non ? Par contre, je souhaiterais stocker ces sauvegardes sur un ordi local, via sshfs par exemple, alors il faut que je creuse un peu ça. En attendant, je crois que ça se fera sur une clé usb dédiée à ça.

    • Désolé pour le cadeau de Noël raté !! ;-)
      Pour moi automatisation veut dire pas d’intervention manuelle. Tous les dimanches à 3h du matin je lance ma sauvegarde ce qui est (pour mon usage) transparent. Si tu cherches une solution de sauvegarde en live ça sera une sauvegarde de fichiers à mon avis. Comme tu dis, il y a /etc et /var mais aussi /usr, /bin et si tu as créé des users particuliers le répertoire /home pour être synchro avec le fichier passwd. Pour moi le restaure de ce genre de backup est plus complexe et surtout moins fiable qu’une image complète de disque (mais déformation pro surement) car on peut avoir oublié un répertoire important.
      Si tu te lances, tiens moi au courant !

  2. C’est pas faux !

    Du coup je me suis dit que j’allais essayer ta méthode, pour voir.

    1. (HS) : le système d’alerte de ton blog quand un nouveau commentaire est publié, ne fonctionne pas (je n’ai rien reçu pour ta réponse, d’où le délai)

    2. Je n’avais pas bien compris le principe que tu décrivais dans ton article. Si tout est automatisé, ça me va.

    3. J’ai installé moebius sur mon RPi, tout roule, mais sur la clé usb, en procédant de la même manière à coup de dd, ça ne fonctionne pas du tout : j’ai créé 2 partitions (1 de 2Go pour moebius, et 1 de 6 Go pour les sauvegardes, en ext4). La 1e a reçu moebius avec dd, et se retrouve avec un fs non reconnu. Résultat : la clé n’est pas bootable, et je ne peux monter que la 2e partition, celle qui ne m’intéresse pas pour l’instant… J’ai recommencé l’opération 2 fois en vain. Une idée ?

    • Re,
      1) Pour les notifications c’est géré automatiquement par WordPress.com du coup j’ai pas trop d’idée. Je vais fouiller dans les options ! (c’est normal le + dans ton email ?)

      3) De mon coté l’install de Moebius sur la clé USB se fait comme la carte SD c’est à dire sans aucune préparation de la clé. Le dd avec le fichier d’origine va me créer 2 partitions, une boot et une principal de 2Go je crois. Avec fdisk j’ai utilisé l’espace libre pour créer la partition qui va recevoir les sauvegardes

      En espérant que ca t’aide un peu ….

  3. Je n’ai pas encore terminé cette partie, mais j’ai réussi à démarrer la sauvegarde depuis la clé.

    J’ai dû essayer d’utiliser dd sur une partition, au lieu de l’utiliser sur le disque entier (/dev/sdb1 vs /dev/sdb).

    Par contre, j’ai eu beaucoup de mal à savoir sur quel système modifier les fichiers dans /boot : confusion permanente entre le système sur clé usb et celui sur la SD… Je ne sais pas si ça vient de moi ou si ce n’est pas très clair dans l’article ;)

  4. Tuto pas mal. Je suis en train de le mettre en place mais je me pose juste une question. Comme tu automatise avec « update-rc.d », ça veut dire que le script est lancé DEUX fois à chaque coups ??? (Une fois au chargement et une seconde fois à l’arret du systéme normalement)

    Ne devrait-on pas faire une détection (avec `case « $1″ in start)` ) pour ne le lancer qu’au démarage.

    PS : tu as inverser le « . » et « - » donc la commande « update-rc.d ».

    • Le script fait un reboot mais n’est pas lancé à l’arrêt. La commande reboot doit couper la séquence. Maintenant j’ai bien conscience que c’est pas la meilleure méthode ;-)

      C’est corrigé pour la commande merci.

  5. Personnellement, je serais plus partie sur une solution de type tar.

    Une fois par semaine :

    – sauvegarde complète du système

    tar -cvpzf « backup$(date +%Y_%m_%d_%s).tar.gz » –exclude=/backup*.tar.gz –exclude=/proc –exclude=/lost+found –exclude=/sys –exclude=/mnt –exclude=/media –exclude=/dev/ –listed-incremental=/backup.list

    – Sauvegarde du mbr + partitions

    dd if=/dev/sda of=/backup-sda-$(date +%Y_%m_%d_%s).mbr bs=512 count=1

    Et tous les jours

    tar -cvpzf « backup$(date +%Y_%m_%d_%s).tar.gz » –exclude=/backup*.tar.gz –exclude=/proc –exclude=/lost+found –exclude=/sys –exclude=/mnt –exclude=/media –exclude=/dev/ –listed-incremental=/backup.list

  6. Bonjour.

    (C’est encore moi :-) )

    Ma question est la suivante :

    Une fois la sauvegarde de partitions effectuée j’ai donc deux fichiers .img compressés en .gz. Admettons que ma carte SD actuelle me lache et que j’ai une carte SD vierge (plus petite ou plus grande que l’ancienne, mais d’une capacité suffisante pour y mettre la sauvegarde). Comment dois-je procéder pour y créer les deux partitions qui vont bien et y restaurer mes sauvegardes ?

    D’avance un grand merci pour toute aide :).

    PS : la compression est si lente que je pense commenter cette partie du code ^^.

    Encore merci.

  7. Alors par contre tout fonctionnait bien mais sans savoir comment j’ai maintenant le script qui se lance une fois au boot (normal) mais qui se relance aussi après la commande reboot. C’est assez peu pratique. Je vais essayer de n’ajouter le script qu’au runlevel 2 et viendrai indiquer mes résultats.

    Si quelqu’un a une explication quant à pourquoi il se lance maintenant deux fois ^^ je suis preneur.

    Sinon, utiliser partclone pour restaurer ..hum.. je vais fouiner sur google.

      • Merci.

        Je vais en effet corriger la priorité pour lancer dropbear avant le backup.

        Par contre toujours le problème du script qui est exécuté à l’arrêt du system …

      • C’est encore moi. Alors tout fonctionne. J’ai modifié le script. Si cela peut servir à quelqu’un :

        ### BEGIN INIT INFO

        # Provides: backup_sd

        # Required-Start: $all

        # Required-Stop:

        # Default-Start: 2 3 4 5

        # Default-Stop: 0 1 6

        # Short-Description: Script to start the backup process

        # Description: Perform a full backup of all system partitions defined on the SD card

        ### END INIT INFO

        #! /bin/sh

        # /etc/inti.d/backup_sdcard_gold.sh

        # ###################################

        # Parameters to define the backup

        # ###################################

        # Select the type of backup you want

        # full : full backup of the SD card

        # partition : backup partitions one by one in different files

        BACKUP_TYPE=partition

        # How many backups you want to keep ?

        NUMBER_OF_BACKUPS=1

        # Where do you want your backups ?

        BACKUP_PATH=/backup

        # Is BACKUP_PATH an external partition

        BACKUP_PATH_ON_PARTITION=1

        case « $1″ in

        start)

        # ##################################

        # Nothing to update after this line

        # ##################################

        # Check if backup is running

        # Check if BACKUP_PATH exists

        if [ ! -e $BACKUP_PATH ]; then

        echo « $BACKUP_PATH does not exist. Please create it »

        exit

        fi

        # Check if the partition used is mounted

        if [ $BACKUP_PATH_ON_PARTITION -eq 1 ]; then

        partition_mounted=`mount | grep $BACKUP_PATH`

        if [ "$partition_mounted" = '' ]; then

        echo « Backup partition is not mounted. Please mount it or update /etc/fstab. »

        exit

        fi

        fi

        # Full backup of SD Card

        if [ "$BACKUP_TYPE" = full ]; then

        echo « Full backup »

        # Check if dd is installed

        if [ ! -e /bin/dd ]; then

        echo « /bin/dd not found »

        exit

        fi

        # Check if we have to delete a backup

        nb_backups=`ls -l $BACKUP_PATH | wc -l`

        nb_backups=$(( $nb_backups – 1 ))

        if [ $nb_backups -ge $NUMBER_OF_BACKUPS ]; then

        echo « Too many backups. Removing the oldest one »

        oldest_file=`ls -rt -1 $BACKUP_PATH | head -n 1`

        rm $BACKUP_PATH/$oldest_file

        fi

        # We have the path, we have the tools so let’s backup the SD card !

        archive_name=`date + »%Y-%m-%d-at-%H-%M »` ».img.gz »

        dd bs=4M if=/dev/mmcblk0 | gzip > $BACKUP_PATH/$archive_name

        fi

        # Backuping only partitions

        if [ "$BACKUP_TYPE" = "partition" ]; then

        echo « Backuping partitions only »

        # Check if partclone.fat and parclone.extfs are installed

        if [ ! -e /usr/sbin/partclone.vfat -o ! -e /usr/sbin/partclone.extfs ]; then

        echo « partclone.fat or partclone.extfs not found. Please install partclone package using apt-get install partclone »

        exit

        fi

        # Check if we have to delete a backup

        nb_backups=`ls -l $BACKUP_PATH | wc -l`

        nb_backups=$(( $nb_backups – 1 ))

        if [ $nb_backups -gt $NUMBER_OF_BACKUPS ]; then

        echo « Too many backups. Removing the oldest one »

        oldest_file=`ls -rt -1 $BACKUP_PATH | head -n 1`

        rm -rf $BACKUP_PATH/$oldest_file

        fi

        # We have the path, we have the tools so let’s backup the SD card !

        path_archive_name=`date + »%Y-%m-%d-at-%H-%M »`

        mkdir $BACKUP_PATH/$path_archive_name

        if [ -e $BACKUP_PATH/$path_archive_name ]; then

        # Save MBR

        dd bs=512 count=1 if=/dev/mmcblk0 of=$BACKUP_PATH/$path_archive_name/mbr.img

        # Save /boot

        umount /boot

        partclone.fat –clone –source /dev/mmcblk0p1 –output $BACKUP_PATH/$path_archive_name/boot.img

        mount /boot

        #gzip $BACKUP_PATH/$path_archive_name/boot.img

        # Save System

        partclone.extfs –clone –source /dev/mmcblk0p2 –output $BACKUP_PATH/$path_archive_name/system.img

        #gzip $BACKUP_PATH/$path_archive_name/system.img

        fi

        fi

        # Restore cmdline.txt from cmdline.txt.origin

        cp /boot/cmdline.txt.origin /boot/cmdline.txt

        # Reboot

        reboot

        ;;

        stop)

        echo « Arret du systeme script de backup ne fait rien »

        ;;

        *)

        echo « Usage: /etc/init.d/backup_sdcard_gold.sh {start|stop} »

        exit 1

        ;;

        esac

        exit 0

      • De rien.

        Par contre je suis toujours un peu bloqué :

        J’ai d’un coté ma sauvegarde de partitions avec mbr.img boot.img et system.img.

        J’ai de l’autre côté une carte SD que j’utilisais jusqu’alors comme stockage (une seule partition fat32).

        Je n’ai pas trouvé comme restorer les 3 fichiers sur la carte pour pouvoir l’utiliser dans mon Pi.

        Merci d’avance pour toute aide.

      • Sauf s’il y a une GUI que j’ai manquée (CloneZilla et Redo ne lisant pas les fichiers créés en suivant ta méthode), alors oui, j’ai beau avoir lu l’aide de partclone, je ne sais pas quoi/comment faire pour remettre ces trois fichiers .img au bon endroit (ie. en trois partitions) sur la carte actuellement vierge et non partitionnée). Il faut y passer un coup de GParted pour créer des partitions qui font exactement la bonne taille ?

        • Salut,
          Il faut effectivement faire le restore sur une partition donc l’idéal c’est de la même taille ou plus grande. Tu peux sauvegarder les blocs et utiliser fdisk pour créer rapidement les 2 partitions sachant que le boot n’est pas une partition. Si tu ne veux pas passer par fdisk, il y a partclone.dd qui est l’équivalent de dd pour faire une image complète de disque

  8. Je tente une proposition pour voir si j’ai tout suivi et si oui alors ce commentaire pourra peut être servir à d’autre.

    Situation : la carte SD actuelle crashe/brule/… mais j’ai mes 3 backups (mbr, boot, et system) bien au chaud sur la clef usb. J’achète une carte SD de taille à minima égale à la somme des tailles des 3 backups

    Problème : pas moyen de booter directement sur la clé usb sans carte SD.

    Marche à suivre : démarrer une machine sous linux (un livecd ou liveusb si pc sous windows). Depuis cette machine il faut

    Restaurer le MBR à partir du fichier MBR.img. Pour cela utiliser dd. Les chemins sont à adapter mais cela donne

    dd count=1 bs=512 if=$BACKUP_PATH/$path_archive_name/mbr.img of=/dev/mmcblk0.

    Si la nouvelle carte est plus grande et que la taille des partitions change alors ne restaurer que les 446 premiers octets :

    dd count=1 bs=512 if=$BACKUP_PATH/$path_archive_name/mbr.img of=/dev/mmcblk0.

    Il faudra ensuite créer deux partitions sur la carte sd neuve. L’une en fat32 de la taille (a minima) du fichier boot.img. L’autre en ext4 de la taille (a minima) du fichier system.img. Pour cela utiliser fdisk (ou Gparted)

    Restaurer les deux fichiers boot.img et system.img sur les partitions prévues à cet effet dans l’étape précédente. Pour cela :

    partclone.restore –source $BACKUP_PATH/$path_archive_name/boot.img –output /dev/mmcblk0p1

    partclone.restore –source $BACKUP_PATH/$path_archive_name/system.img –output /dev/mmcblk0p2

    Les options de partclone.restore sont dispos ici : http://www.partclone.org/usage/partclone.restore.php

    Voila ce que j’ai compris pour le moment.

    Par contre pourquoi dis-tu que le boot n’est pas une partition ?

    Merci beaucoup.

    • Eh ben ! Sacré boulot :-)

      Ce n’est pas une partition dans le sens où un fdisk ne l’affichera pas. C’est juste 512 octets positionné en début de disque pour contenir la table des partitions

  9. Bonjour,

    J’ai suivi le tuto pour booter sur une clé usb à base de Moebius et faire le backup. Tout fonctionne merci.

    En revanche il me reste un dernier détail à régler, je n’arrive pas a mettre à jour la date du system de la clé usb qui n’est pas cohérente.

    Par exemple on est le 19/04/2013 à 8h33 et date renvoie :

    Fri Apr 19 14:23:52 CEST 2013

    J’ai essayé raspi-config et dpkg-reconfigure tzdata en choisissant Europe puis paris mais toujours le même problème. Du coup la date des backups n’est pas cohérente.

    Et je n’ai pas de soucis avec le système sur la carte sd mais lui est à base de raspbian wheezy. Une idée ?

    A bientôt.

    • Salut,

      Par hasard, le système n’est pas en Read Only ? Ca pourrait expliquer que la zone ne change pas

      Sinon essayes :

      sudo echo « Europe/Paris » > /etc/timezone

      sudo dpkg-reconfigure –frontend noninteractive tzdata

  10. Bonsoir,

    Je pense pas que le système soit en readonly vu que je peux créer des fichers. On dirait que j’ai réussi a m’en sortir. J’ai installé rdate et ntp qui n’était pas présent. Je pense que c’est surtout ntp qui m’a permis d’avoir la date à jour.

    J’ai donc maintenant la bonne heure qui s’affiche quand je fais date.

    Avant d’installer ces packages, j’avais déjà Europe/Paris dans /etc/timezone et la commande sudo dpkg-reconfigure –frontend noninteractive tzdata me donnais une erreur :

    debconf: falling back to frontend: Noninteractive

    dpkg-query: package ‘noninteractive’ is not installed and no information is available

    En tout cas, merci pour l’aide.

    A bientôt

  11. Bonsoir,

    J’utilise un gros disque dur externe comme disque système (j’ai migré le système dessus). Le problème pour la sauvegarde, c’est qu’elle clone le disque : il fait 180go, ça fait beaucoup sachant qu’il y a moins de 10go de fichiers dessus.

    Y a t’il un moyen de sauvegarder le raspberry (avec raspbian pour moi) juste en sauvegardant les fichiers au lieu de cloner tout le disque ? Et si une technique existe, ensuite, de pouvoir restaurer cette sauvegarde ?

    Merci d’avance pour l’aide !
    Riri

      • Ok bah je vais faire comme ça, sauf pour la carte SD à la limite que je peux sauvegarder facilement avec une image disque. J’espère quand même ne pas à avoir à utiliser ses sauvegardes !
        Merci pour ta réponse

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>