RaspberryPi während des Betriebs sichern

Nachdem meine beiden Raspberry Pis lange untätig in der Ecke lagen, habe ich nun für beide eine sinnvolle Aufgabe gefunden. Mit diesem „Produktiveinsatz“ steht man natürlich vor der Frage: wie sichere ich meine Geräte und Daten?

Die Variante, dass die SD-Karte bei Bedarf gesichert wird, ist nun nicht keine Option mehr. Das Backup muss im laufenden Betrieb erfolgen und dabei so konsistent wie möglich. Da ich mit meinem Synology NAS DS713+ ein ideales Ziel für ein solches Backup habe, soll die Sicherung auf ein NFS-Volume erfolgen. Anschließend geht dieses Backup im Rahmen meiner Backupstrategie seinen Weg.

Das Tolle am Internet ist die Tatsache, dass man selten der Erste und schon gar nicht der Einzige ist, der ein Problem oder eine Anforderung hat. So bin ich auch in diesem Fall fündig geworden. Das Einbinden des NFS-Volumes fehlte mir noch zum Glück und so habe ich die Vorlage noch ein wenig verfeinert und nutze nun das folgende Skript für ein Live-Backup meiner RasPis.

#!/bin/bash

#####################################################################
# Konfiguration
#####################################################################

# Name des PIs
SUBDIR=rpi  
# NFS-Freigabe
NFSVOL=192.168.1.1:/volume1/backup 
# Mountpoint für das NFS-Volume
NFSMOUNT=/home/pi/nas

#####################################################################
# Skript
#####################################################################

DIR=$NFSMOUNT/$SUBDIR

echo "Starte RaspberryPi-Backup! $(date +%H:%M:%S)"
echo "NFSVOL=$NFSVOL"
echo "DIR=$DIR"

# Vorsichtshalber einmal unmounten
umount $NFSMOUNT
# NFS-Volume mounten
mount -t nfs $NFSVOL $NFSMOUNT

# Checken, ob das Zielverzeichnis existiert
if [ ! -d "$DIR" ];
   then
      echo "Backupverzeichnis existiert nicht. Abbruch!"
      umount $NFSMOUNT
      exit 1
fi

# Dateinamen zusammenbauen
OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S).img"

# Daten aus dem Arbeitsspeicher auf die SD-Karte schreiben
sync; sync

# Manche Dienste herunterfahren, um konsistente Daten zu erhalten
echo "Dienste werden beendet."
service apache2 stop
service cron stop

# Alte(s) Backup(s) löschen
rm -f $DIR/backup_*.img

# Nun wird das eigentliche Backup geschrieben
echo "Image wird erstellt. Das kann jetzt dauern..."
SDSIZE=`/sbin/blockdev --getsize64 /dev/mmcblk0`;
pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock

# Ergebnis abfragen
RESULT=$?

# Gestoppte Dienste wieder starten
echo "Dienste werden wieder gestartet."
service apache2 start
service cron start

if [ $RESULT = 0 ];
   then
      umount $NFSMOUNT
      echo "Backup erfolgreich beendet. $(date +%H:%M:%S)"
      exit 0
   else
      # evtl. ein angefangenes Backup löschen, wenn es fehlschlägt
      rm -f $OFILE
      echo "Backup fehlgeschlagen! $(date +%H:%M:%S)"
      umount $NFSMOUNT
      exit 1
fi

Das Skript läuft nun als Cronjob jede Nacht. Dieser letzte Schritt war schwieriger als erwartet, da das Skript wunderbar funktionierte, wenn es manuell auf der Konsole gestartet wurde, aber den Dienst verweigerte, wenn es per Cron laufen sollte.
Ursache war aber nur eine fehlende Pfadangabe, was sich dank ein paar heller Köpfe auf Twitter lösen ließ 🙂

4 Kommentare

  • Hallo,

    vielen Dank für das super Script. dd arbeitet aber nicht inkrementell, oder? Das dauert dann natürlich immer sehr lange.

    Wie stellt man denn das Ganze wieder her?

    Die SD Karte muss dann genauso groß sein?

     

    Mfg, Apropo

  • Das Skript macht immer eine Vollsicherung. Wiederherstellung erfolgt auch mit dd. Oder evtl. auch mit WinImage oder Etcher. Mit den GUI-Tools habe ich es nie getestet…

  • Hallo,

     

    Was mich interessieren würde, wäre welche Dienste für das ‚Live-Backup‘ gestoppt werden müssten?

     

     

  • Michael Nolte

    Hallo Malte, da gibt es eine klare Antwort: „das kommt drauf an“ 😉

    Je nach dem was auf deinem Pi läuft, musst du wissen, welche Dienste aktiv sind, z.B. nginx oder Apache etc.

    Diese Dienste stoppst du dann und startest sie wieder nach dem Backup

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.