Raspberry Pi Backup der SD-Karte im Betrieb

Wenn ein Raspberry Pi läuft und macht, was er soll will man ihn am liebsten gar nicht mehr abschalten. Oder der Raspberry Pi ist an einer unzugänglichen Stelle eingebaut.
Außerdem nervt es wenn man den Raspberry Pi erst herunterfahren muss, die SD-Karte ausgebaut werden, in den Rechner gesteckt und gesichert werden und das ganze wieder zurück.
Es wäre doch viel einfacher ein Raspberry Pi Backup der SD-Karte im laufenden Betrieb zu machen, als die SD-Karte des Raspberry Pi für ein Backup auszubauen.

Wenn es geht ist es immer besser den Raspberry Pi nicht im Betrieb zu sichern.
Ich würde -wenn es geht- immer diese Lösung vorziehen.

https://www.hagenfragen.de/tipps-und-tricks/raspberry-pi-tipps/raspberry-pi-backup-erstellen-sd-karte-sichern.html

Das Dateisystem im Betrieb auszulesen ist eigentlich keine gute Idee, weil das OS im Betrieb die ganze Zeit Lese- und Schreibzugriffe durchführt. Eigentlich muss man ein Dateisystem vor dem Sichern abmelden (unmount) und aushängen. Daher ist die Lösung nicht optimal aber immer noch besser wie kein Backup.
Um ein Dateisystem bzw. ein Blockdevice auszulesen gibt es das unter Linux das Kommando dd.

dd (disk dump) dient zum bit-genauen Kopieren von Festplatten, Partitionen oder Dateien. “Bit-genaues” Kopieren bedeutet, dass der Datenträger Bit-für-Bit bzw. Byte-für-Byte ausgelesen und beschrieben wird, unabhängig von dessen Inhalt und Belegung. dd ignoriert Dateisysteme und funktioniert mit allen blockorientierten Datenträgern, also auch mit Daten-CDs/DVDs.
dd wird ohne weitere Rückfragen bzw. Sicherheitsabfragen ausgeführt. Bei unachtsamen Aufrufen könnten evtl. vorhandene Daten überschrieben werden!

https://wiki.ubuntuusers.de/dd/

dd ist eigentlich auf jedem Linux vorinstalliert und gehört wir tar (tape archive) zum “Grundwortschatz. Falls es nicht auf dem Rechner ist:

sudo apt-get install coreutils 

Dis Syntax ist simpel:

dd if=Quelle of=Ziel <Optionen> 

Quelle und Ziel können jedes Blockdevice oder jedes Dateisystem sein. (es kann auch von kaputten Dateisystemen gelesen werden, um zB Datenträger zu retten)
Die Optionen sind auch simpel, ich verwende hier BlockSize, was die Größe des am Stück zu lesenden Blocks angibt bs=1M und status=progress, damit der Fortschritt der Aktion angezeigt wird. Ansonsten macht dd keine Ausgabe.

Das Backup von einem entfernten Rechner starten

Der nächste Schritt ist das Backup von einem entfernten Rechner auf dem Pi zu starten und dort abzulegen. Man kann natürlich auch einen USB-Stick an den Pi stecken und das Backup direkt auf den Stick machen.
Dafür verwende ich eine Spielart des SSH-Kommandos welches auf dem entfernten Rechner ein gzip-Kommando startet, welches dann in eine Pipe schreibt, die dann auf dem Zielrechner in eine Datei schreibt. (Was ein nerdiger Satz – egal google einfach nach den Begriffen).

Die fertige Kommandozeile vom Server oder Linux-Rechner sieht wie folgt aus:

# simple Version
ssh pi@pi-volkszaehler "sudo dd if=/dev/mmcblk0 bs=1M status=progress | gzip -" | dd of=./$(date +%Y%m%d_%H%M%S)\pi-volkszaehler.gz
# Version mit Parametern
myPi=192.168.4.1
# oder 
myPi=pi-rechnername.local
ssh pi@$myPi "sudo dd if=/dev/mmcblk0 bs=1M status=progress | gzip -" | dd of=./$(date +%Y-%m-%d_%H-%M-%S)\$myPi.gz

Beispiel:

Raspberry Pi Backup der SD-Karte von remote Host starten.
Backup fertig

Vorsicht:

Es gibt natürlich aber einige Dinge zu beachten, wenn man dieses Live-Backup macht. Wie oben bereits erwähnt ist diese Lösung nicht die beste Idee, aber besser auf jeden Fall besser als kein Backup.

  • Vorsicht bei Raspberry die Datenbanken verwenden (Datenbanken schreiben zum Teil in eigene Dateien, die wie Dateisysteme verwendet werden und immer geöffnet sind, was zu inkonsistenten Datenbanken führen kann)
  • Dauer (je nachdem wie stark der Pi während dem Backup beansprucht wird (CPU und FS) und der Größe der SD-Karte dauert das Backup um die 9 Stunden bei einer 64GB SD-Karte

Update

Um Speicherplatz zu sparen ist es besser bzip2 zu verwenden. Bei einem Backup einer 32MB SD-Karte ist die gepackte Datei ca. 300MB kleiner. Klingt nach nicht viel, aber das summiert sich recht schnell bei 5 PIs mit je 10 Backups auf der Platte.

#! /bin/bash

ssh pi@pi-volkszaehler "sudo dd if=/dev/mmcblk0 bs=1M status=progress | bzip2 -9 -" | dd of=./$(date +%Yi-%m-%d\_%H-%M-%S)\pi-volkszaehler.bz2
6 Kommentare
  1. Michi
    Michi sagte:

    danke für die gute Anleitung.
    Eine Frage habe ich aber noch:
    Wie stelle ich das Backup im Falle eines Falles auf einer leeren SD-Karte wieder her?

    Antworten
    • Hagen Glötter
      Hagen Glötter sagte:

      Hi Michi, im Prinzip genau wie oben beschrieben, nur die Parameter herumdrehen.
      Oder eine neue SD Karte in einen Rechner einlegen und
      sudo dd if=backup.gz of=/dev/mmcblk0 bs=1M status=progress
      auführen.

      Antworten
      • Andre
        Andre sagte:

        Danke für die Anleitung, ich würde empfehlen die Kompression via gzip oder bzip auf dem Zielrechner durchzuführen und nicht auf dem Raspberry. In dieser Konstallation sind Sicherungen von 16GB Karten binnen 30 Minuten möglich. Der Aufwand für den Raspberry zu komprimieren ist ungleich größer als der Transport der Brutto-Dateien über den Ethernet-Port.

        Antworten
        • Hagen Glötter
          Hagen Glötter sagte:

          Danke für den Kommentar. Du hast an sich absolut Recht.
          Allerdings hängt es auch von der Hardware ab auf die du sichern willst. Bei einem billigen kleinen NAS mit zwei Platten wird es schon wieder schwierig einen g-oder bzip ans laufen zu bekommen. Wenn du auf einen Linux Server im Web sicherst ist es kein Problem, der hat genug Power.

          Antworten
  2. Michael
    Michael sagte:

    Hi, funktioniert Super.

    Geht es auch irgendwie das ich eine Batch-Datei für Windows 11 erstelle und wenn ich darauf klicke das genau diese ganzen Befehle ausgeführt werden über Windows?

    Vielen dank im voraus.

    LG Michael

    Antworten
    • Hagen Glötter
      Hagen Glötter sagte:

      Hallo Michael,
      Du kannst das WSL installieren und damit das Linux Script unter Windows ausführen.
      Das habe ich aber noch nie probiert. Du kannst mir aber gerne Rückmeldung geben, wie es geklappt hat.

      Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

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