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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /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 $RASPBERRY_USER@$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:

1
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.