Crea sito

Backup Raspberry Pi SD card

Ciao a tutti in questo breve post volevo condividere con voi un piccolo script bash che ho scritto per effettuare il backup della SD card del mio raspberry pi, che utilizzo come webserver domestico.

La prudenza non è mai troppa, e la prevenzione, in informatica, soprattutto quando si ha a che fare con dispositivi di storage, quali hard disk, memory card e memorie flash in generale è fondamentale. Io, ovviamente, non perdo occasione di dimenticarmi questa cosa… Ma il buon Edward Murphy non si dimentica mai di ricordamelo. Qualche giorno fa, infatti, mi si è “cotta” la SD card del raspberry, capita 🙁 , ma dopo una giornata passata a reinstallare il sistema e a riconfigurare il webserver, mi sono detto che era fondamentale fare qualcosa.

Per tanto ho deciso di scrivere un piccolo script per effettuare il backup dell’intero sistema installato sul raspberry pi in un immagine sul mio PC in modo che se dovesse accadere una cosa del genere ancora, spenderei molto meno tempo a ripristinare il tutto.

Ma bando alle ciance, come funziona?

Il concetto è semplice, lo script stabilisce una connessione ssh con il raspberry pi, che si trova nella mia stessa rete locale, e usando il comando dd recupera in input i byte della sd card, ovvero, nel mio caso del device /dev/mmcblk0 e sfruttando le enormi potenzialità della pipe unix e di ssh li trasferisce al mio PC che a sua volta sta eseguendo un’istanza di dd con parametro of=nomeimmagine creando il mio backup!

L’immagine generata viene poi compressa con tar per risparmiare spazio.

Eccovi il codice:

#! /bin/bash

# Descriprion:
# This simple script creates a local sd image backup of a remote raspberry pi in a local folder
# using ssh, dd, and the unix pipe

# Requirements:

# - ssh e sshpass
# - notify-send

RASPBERRY_USER=pi # your raspberry pi username
RASPBERRY_PASS=raspberry # your raspberry pi password, the script assumes this user is in the sudoers file of the raspberry
RASPBERRY_ADDR=192.168.0.8 # IP address (or hostname if you're using a dynamic dns server)
BACKUP_FOLDER=/home/username/RB_BACKUP # local backup destination folder
BACKUP_NAME=$(date +"%Y%m%d_%H%M") # image filename
BACKUP_IMAGE=/home/username/RB_BACKUP/$BACKUP_NAME.img # absolute path to generated image

# Notify user, script is starting, useful if running this script with cron
notify-send "RASPBERRY BACKUP: Starting backup process, raspberry pi: $RASPBERRY_ADDR"

# Try to ping raspberry, if you can't find it, exit now

ping -c 3 $RASPBERRY_ADDR > /dev/null 2> /dev/null

if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: cannot ping raspberry at: $RASPBERRY_ADDR exiting"
exit 1
fi

# If destination dir does not exist, create it
if [ ! -d "$BACKUP_FOLDER" ]; then
mkdir $BACKUP_FOLDER
fi

notify-send "RASPBERRY BACKUP: Initiating SSH transfer, do not turn off your PC!!!"
# This opens a ssh connection with raspberry, and using dd and the unix pipe creates a local device image
sshpass -p $RASPBERRY_PASS ssh [email protected]$RASPBERRY_ADDR 'echo $RASPBERRY_PASS | sudo -S dd if=/dev/mmcblk0' | dd of=$BACKUP_IMAGE
# Check if everything is ok
if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: Something went wrong with the ssh transmission, deleting temporary files, try again!"
rm $BACKUP_IMAGE
exit 1
fi
notify-send "RASPBERRY BACKUP: Transfer complete, compressing image..."
# Compress image
tar -pczf $BACKUP_FOLDER/$BACKUP_NAME.tar.gz $BACKUP_IMAGE
# Check compression result
if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: Backup complete, BUT it wasn't possible to compress the image"
exit 1
fi
# Delete uncompressed files
rm $BACKUP_IMAGE
notify-send "RASPBERRY BACKUP: Backup Complete! Backup saved in $BACKUP_FOLDER"

Il processo completo, sul mio PC e sulla mia rete locale dura poco più di mezz’ora.

Ovviamente per ripristinare il backup, bisognerà effettuare l’operazione inversa, ovvero collegare al pc la sd card, decomprimere l’immagine con tar,

e lanciare il comando:

dd if=/path/all/immagine/da/ripristinare.img of=/dev/nomedevice_nuova_scheda_SD

Lo script è ancora un work in progress, per cui ci possono essere dei problemi, in caso segnalatemeli!

E se volete collaborare scrivete pure qua sotto le vostre modifiche.

Lo script potete trovarlo anche sul mio repository di github a questo indirizzo: https://github.com/elrod/RaspberryBackup , c’è anche allegato un bel readme con istruzioni di utilizzo, i requisiti ecc.

A presto!

2 Responses to Backup Raspberry Pi SD card

  1. Giampi dicembre 30, 2013 at 11:34 pm #

    ciao ho provato lo script da remoto, verso iw2drm.dyndns.tv, e da questa parte Debian 7,2 KDE Stable, la macchina remota non risponde hai ping ma lo script non mi dava l’avviso e lo terminava, quindi nello script ho flaggato:

    ## ping -c 3 $RASPBERRY_ADDR > /dev/null 2> /dev/null

    ## if [ $? -ne 0 ]; then
    ##notify-send “RASPBERRY BACKUP: cannot ping raspberry at: $RASPBERRY_ADDR exiting”
    ##exit 1
    ##fi

    poi tutto bene ma crea la dir di backup e il file ma termina così:

    [email protected]:/home/iw2drm# ./rbBackup.sh
    0+0 record dentro
    0+0 record fuori
    0 byte (0 B) copiati, 0,644845 s, 0,0 kB/s
    tar: Rimozione di “/” iniziale dai nomi dei membri
    [email protected]:/home/iw2drm# mc

    grazie per l’aiuto

    ciao

    Giampi

    • Jacopo gennaio 1, 2014 at 5:39 pm #

      Ciao!

      da quello che dici il problema sembra essere a monte, a quanto pare lo script non riesce proprio a raggiungere la tua macchina remota,
      il controllo iniziale con il comando ping, serve proprio a verificare che il raspberry sia raggiungibile, se quel controllo fallisce, è inutile proseguire l’esecuzione dello script…

      il fatto che commentando quel controllo lo script sia arrivato a termine, è normale, è dovuto al fatto che non effettua un controllo sulla dimensione del file generato dal comando dd, ma come tu stesso hai notato, non ha risolto il problema

      Ti consiglio di fare una prova, se non le hai già fatta tu… prova a pingare manualmente il tuo raspberry con:

      ping -c 3 http://iw2drm.dyndns.tv

      e vedere se il comando ha successo,
      io ho provato a pingarlo ora, ma mi ha detto che il dns non riesce a risolvere l’indirizzo, non so se è così perché al momento l’hai messo offline tu, oppure c’è un problema di configurazione

      Nel caso in cui anche tu avessi problemi a raggiungerlo allora verificherei la correttezza delle impostazioni sul pannello di controllo di dyndns e sul router al quale è collegato il raspberry… (inoltre ricordati di fare il forwarding della porta 22 in ingresso (quella di ssh) verso il raspberry)…

      Una prova di funzionamento rapido che puoi fare al volo per vedere se lo script funziona, è provare, se ti trovi sulla stessa rete a cui il raspberry è connesso, a sostituire l’indirizzo del raspberry: http://iw2drm.dyndns.tv con il suo indirizzo IP locale e vedere se va…

      Per quanto invece riguarda la mancanza di notifiche, non ho capito se non ne ricevi nessuna, oppure se non ricevi solo quella del ping,

      nel primo caso verifica di avere installato il pacchetto notify-send:

      sudo apt-get install notify-send

      spero di esserti stato utile, in caso di problemi chiedi pure,
      che cerchiamo di risolvere!

      ciao,

      Jacopo

Lascia un commento

Powered by WordPress. Designed by WooThemes