Raspberry Pi backup

Raspberry Pi – automatisches Backup mit Python erstellen

Lange Zeit habe ich meinen Raspberry Pi entweder gar nicht gesichert oder nur sehr mühsam und das auch nur sporadisch. Das muss aber eigentlich gar nicht sein. Mit einem einfachen Code und einem USB-Stick oder einer externen Festplatte lässt sich eine Sicherungskopie ganz automatisch erstellen. In dieser Anleitung wollen wir ein Skript programmieren, das uns in regelmäßigen Abständen ein komplettes Image-Backup der SD-Karte erzeugt.

In dieser Anleitung werde ich nicht drauf eingehen, wie Raspberry Pi OS installiert wird. Ich Arbeite mit einem Windows 10 PC und einem Raspberry Pi 3 auf dem Raspberry Pi OS Lite läuft.

Folgende Dinge werden benötigt:

  • Raspberry Pi egal welches Modell
  • USB-Stick oder Festplatte größer als die SD-Karte im Pi
  • Texteditor wie Notepad++
  • SSH Client wie Putty
  • FTP Client wie Filezilla

01. USB Gerät formatieren

Damit wir später keine Probleme haben mit dem Dateisystem, formatieren wir unseren Datenträger als Erstes mit dem Windows-Bordmittel zu einem “NTFS” Gerät.

ACHTUNG alle Daten auf dem USB-Gerät werden hierbei gelöscht!

Wir stecken unser Speichermedium in den PC ein und öffnen im Datei-Explorer “Dieser PC”. Mit einem Rechtsklick auf das USB-Gerät erscheint das Kontextmenü und wir wählen die Option “Formatieren”. Unter Dateisystem stellen wir nun “NTFS” ein, anschließend setzten wir noch den Hacken für “Schnellformatierung”. Mehr müssen wir an dieser Stelle nicht einstellen, der Formatierungsvorgang kann nun Starten.

02. Datenträger mounten

Wir öffnen unseren “SSH Client” und melden uns am PI an. Im ersten Schritt installieren wir die nötigen Treiber für das “NTFS” Dateisystem. “NTFS” ist ein von Microsoft entwickeltes System, das zwar bei Windows ohne Zutun des Nutzers funktioniert, aber bei Linux nachgerüstet werden muss mit diesem Befehl:

sudo apt-get install ntfs-3g

Leider erstellt Raspberry Pi OS nicht selbständig einen Pfad für externe Datenträger, daher müssen wir einen neuen Ordner platzieren und diesen dann mit unserem USB-Gerät verknüpfen. Einen neuen Ordner legen wir mit diesem Befehl an:

sudo mkdir /media/usbdevice

Nun können wir das USB-Gerät mit dem Raspberry Pi verbinden. Mit dem folgenden Befehl lassen wir uns alle verfügbaren Partitionen anzeigen:

sudo blkid -o list -w /dev/null

Nun halten wir Ausschau nach unserem “NTFS” Datenträger und merken uns den aktuellen Pfad (In meinem Fall “/dev/sda5”) und die “UUID”.

Wir kennen nun den Pfad unseres Speichermediums und haben auch schon den “Mountpoint” festgelegt. Eine Verbindung zwischen den beiden Punkten schaffen wir mit folgendem Befehl:

sudo mount -t ntfs-3g -o utf8,uid=pi,gid=pi,noatime /dev/sda /media/usbdevice

Dabei ist zu beachten, dass wir den Pfad zu unserem Device anpassen müssen und ggf. auch den Benutzer oder die Benutzergruppe. Solltet ihr mit dem Benutzer “pi” unterwegs sein, muss nur der “/dev/sda…” Parameter im Code angepasst werden.

Dank der Option “utf8” können auch Umlaute in Dateinamen gelesen werden, allerdings ist das unter Linux nie zu empfehlen.

Damit das USB-Gerät auch nach einem Neustart im System verankert ist, müssen wir noch eine Zeile in der Datei “fstab” hinzufügen. Dazu benötigen wir die individuelle “UUID”, die wir vorhin schon mit ausgelesen haben.

sudo nano -w /etc/fstab

Wir fügen unseren angepassten Befehl am Ende des Dokuments ein und speichern diesen ab mit “str + o” und verlassen danach den Text-Editor “Nano” mit “str + x”.

UUID=... /media/usbdevice/ ntfs-3g utf8,uid=pi,gid=pi,noatime 0

03. Python Code

Der eigentliche Code, der das Backup ausführt, ist ein “Bash” Kommando und könnte auch ganz ohne Python auskommen. Möchte man aber mehr als nur eine reine Sicherung haben, so bietet es sich an den Befehl in ein Python-Kostüm zu hüllen.

Wir nutzten das Programm “dd” zum Erstellen von Image-Dateien, den Code könnten wir auch händisch in unser Terminal eingeben und hätten damit schon ein Backup in Auftrag gegeben.

sudo dd if=/dev/mmcblk0 of=/media/usbdevice/pibackup-$(date +%d%m%Y-%H%M%S).img bs=1MB

Um den Befehl mit Python einfach ausführen zu können, nutzen wir die Bibliothek “OS”.

Wir erstellen eine Text-Datei auf unserem Windows Desktop und nennen diese um in “pibackup.py”. Mit einem Text-Editor wie “Notepad++” öffnen wir die Datei und tragen Folgendes am Anfang ein:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Run this script only with python2
# Script by Andreas Schmidt

import os

print "Backup is running!"
createimg = 'sudo dd if=/dev/mmcblk0 of=/media/usbdevice/pibackup-$(date +%Y%m%d-%H%M%S).img bs=1MB'
os.system(createimg)

Damit nicht unendlich viele Kopien der SD-Karte erzeugt werden und der Speicherplatz irgendwann knapp wird, bauen wir noch eine Rotation ein. Wir legen fest, wie viele Image-Dateien gelagert werden sollen und löschen die vorherigen Versionen nach dem Erstellen einer neuen Sicherungskopie.

Bei der Anzahl der verfügbaren Backups sollte beachtet werden, dass eine Image-Sicherung immer so groß ist wie die gesamte SD-Karte, auch wenn nur ein Teil der Karte mit Daten belegt ist. Ich habe eine 32 GB SD-Karte in meinem Pi und nutze einen 64 GB großen USB-Stick, daher kann ich immer nur eine Sicherungskopie vorhalten. Der Code zum Löschen sieht wie folgt aus:

deleteimg = 'sudo pushd /media/usbdevice; ls -tr /media/usbdevice/pibackup* | head -n -1 | xargs rm; popd'
os.system(deleteimg)
    
print "Backup is finished!"

Mit der Option “-1” legen wir fest, wie viele Image-Dateien wir auf Reserve behalten wollen.

Der komplette Code sieht dann so aus:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Run this script only with python2
# Script by Andreas Schmidt

import os

print "Backup is running!"
createimg = 'sudo dd if=/dev/mmcblk0 of=/media/usbdevice/pibackup-$(date +%Y%m%d-%H%M%S).img bs=1MB'
os.system(createimg)

deleteimg = 'sudo pushd /media/usbdevice; ls -tr /media/usbdevice/pibackup* | head -n -1 | xargs rm; popd'
os.system(deleteimg)
    
print "Backup is finished!"

04. Cronjob erstellen

Damit automatisch jeden Sonntag um 3:30 Uhr ein Backup erzeugt wird, müssen wir noch einen neuen “Cronjob” erstellen.

Wir laden unsere “pibackup.py” Datei in das Verzeichnis “/home/pi/” und öffnen anschließend den “Crontab” mit:

sudo crontab -e

Als Text-Editor wählen wir “Nano” aus, danach können wir einen neuen “Cronjob” am Ende der Datei hinzufügen mit:

30 3 * * 7 python /home/pi/pibackup.py

Die “30” gibt die Minute an, die “3” steht für die Stunde und die “7” am Ende bestimmt den Wochentag.

Zuletzt speichern wir unseren neuen “Cronjob” mit “str + o” ab und verlassen den Text-Editor “Nano” mit “str + x”.

05. Download

Ich habe hier nochmal alle Files zusammengestellt, damit das Einrichten nochmal etwas schneller von der Hand geht. Außerdem befindet sich noch zusätzlich eine “Pro Version” in dem Paket. Ich hoffe, ihr habt genauso viel Spaß mit dem Projekt wie ich und jetzt wünsche ich euch gutes Gelingen.

zip-file-icon

artsblog-raspi-backup-master.zip

Filesize: 0,3 mb
Related Posts