Raspberry Pi Backup
Ein regelmäßiges Raspberry Pi Backup schützt vor Datenverlust. Über den Raspberry Pi wird in zahlreichen Foren und Blogs berichtet. Ein Thema das ich dabei persönlich oft vermisse ist das Backup. Grundsätzlich sollte man sich bei jedem System, egal ob nun Linux, Mac oder Windows immer eine intelligente Backupstrategie überlegen. Vor allem dann, wenn man mit Daten arbeitet, deren Verlust tragisch ist. Seien es nun Daten die einen reellen Wert (Kundendaten, Rechnungsdaten, …) haben oder nur sentimentalen Wert (zum Beispiel die Familienfotos).
Raspberry Pi Backup
Der Raspberry Pi muss nicht unbedingt lebensnotwendige Daten besitzen, welche nicht durch eine Neuinstallation ersetzt werden können. Es kann aber sein, dass man den Raspberry Pi als Webserver oder Datenbankserver nutzt und dort Programmdaten und live Daten speichert. Diese sollte man regelmäßig sichern. Grundsätzlich unterscheide ich hier 2 Backup Lösungen:
- manuelles Backup der SD Karte als Image
- automatisches Backup im Betrieb
manuelles Backup
Das einfachste Backup ist beim Raspberry Pi die komplette Sicherung aller Daten auf der SD Karte. Dafür müssen wir jedoch den laufenden Raspberry Pi herunterfahren, die SD Karte herausnehmen und am PC oder Laptop anschließen. Die Sicherung unterscheidet sich hier je nach Betriebssystem auf der Sicherungsmaschine.
Linux / Mac OSX
bei Unix Betriebssystemen ist das ganze recht einfach. Folgende Schritte sind in einer Konsole/Terminal auszuführen:
df -h
alternativ auf Linux Systemen:
lsblk
Hier muss man feststellen unter welchen Pfad die SD Karte gemounted wurde (üblicherweise /dev/disk1s1 oder ähnlich).
diskutil umount /dev/disk1s1
Die SD Karte muss entfernt werden. Das ist der Unmount Befehlt von MacOSX bei Linux reicht umount als Befehl.
dd if=/dev/disk1s1 of=/home/backup/backup.img bs=1M
Mit diesem Befehl kopiert man den gesamten Inhalt Bitweise in eine Image Datei. Hier muss man den korrekten mount Ordner der SD Karte angeben und ein Verzeichnis am lokalen Rechner in der das Image gespeichert wird. Achtung: das Image kann so groß werden wie der angegebene Speicher auf der SD Karte! Die Sicherung wird mit dem selben Befehl zurückgespielt. Man muss nur die Pfade von if und of tauschen.
Windows
Unter Windows kann man die SD Karte mit dem Tool win32Diskimager.exe sichern. Einfach in der Image File Zeile einen Speicherort nach Wahl für das Backup angeben und danach ‚Read‘ klicken. Nach kurzer Zeit hat man eine voll Sicherung als Image.
automatisches Backup
Das automatische Backup kann mit einem Skript direkt am Raspberry Pi ausgeführt werden. Es ist notwendig, dass ein genügend großer Speicher verfügbar ist, auf dem das Image gesichert werden soll. Das kann zum einen ein USB Stick oder eine externe Festplatte sein oder besser ein Netzlaufwerk.
Zuerst sollte man herausfinden, wo die SD Karte mit dem Betriebssystem am Raspberry Pi gemounted ist. Das geht am einfachsten mit:
sudo cat /etc/fstab
Normalerweise ist /dev/mmcblk0p2 die SD Karte. Diese kann man auch im laufenden Betrieb mit dem dd Befehl sichern:
sudo dd if=/dev/mmcblk0p2 of=/home/pi/networkdrive/my.img bs=1M
Wobei der Output Pfad (of) der USB Stick, die externe Festplatte oder ein Netzlaufwerk ist. Diesen Befehl kann man auch sehr gut über ein Skript laufen lassen, dass täglich ausgeführt wird.
Im Internet habe ich dafür ein tolles Skript gefunden, dass so eigentlich direkt genutzt werden kann:
#!/bin/bash # Setting up directories SUBDIR=raspberrypi_backups DIR=/hdd/$SUBDIR echo "Starting RaspberryPI backup process!" # First check if pv package is installed, if not, install it first PACKAGESTATUS=`dpkg -s pv | grep Status`; if [[ $PACKAGESTATUS == S* ]] then echo "Package 'pv' is installed." else echo "Package 'pv' is NOT installed." echo "Installing package 'pv'. Please wait..." apt-get -y install pv fi # Check if backup directory exists if [ ! -d "$DIR" ]; then echo "Backup directory $DIR doesn't exist, creating it now!" mkdir $DIR fi # Create a filename with datestamp for our current backup (without .img suffix) OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S)" # Create final filename, with suffix OFILEFINAL=$OFILE.img # First sync disks sync; sync # Shut down some services before starting backup process echo "Stopping some services before backup." service apache2 stop service mysql stop service cron stop # Begin the backup process, should take about 1 hour from 8Gb SD card to HDD echo "Backing up SD card to USB HDD." echo "This will take some time depending on your SD card size and read performance. Please wait..." SDSIZE=`blockdev --getsize64 /dev/mmcblk0`; pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock # Wait for DD to finish and catch result RESULT=$? # Start services again that where shutdown before backup process echo "Start the stopped services again." service apache2 start service mysql start service cron start # If command has completed successfully, delete previous backups and exit if [ $RESULT = 0 ]; then echo "Successful backup, previous backup files will be deleted." rm -f $DIR/backup_*.tar.gz mv $OFILE $OFILEFINAL echo "Backup is being tarred. Please wait..." tar zcf $OFILEFINAL.tar.gz $OFILEFINAL rm -rf $OFILEFINAL echo "RaspberryPI backup process completed! FILE: $OFILEFINAL.tar.gz" exit 0 # Else remove attempted backup file else echo "Backup failed! Previous backup files untouched." echo "Please check there is sufficient space on the HDD." rm -f $OFILE echo "RaspberryPI backup process failed!" exit 1 fi
Ich hoffe ihr könnt so mit täglichen oder wöchentlichen Raspberry Pi Backups einem Datenverlust vorbeugen.
Hi, gibt es auch eine Möglichkeit für das manuelle Backup ohne das sich die Datei auf
die volle SD-Kartengröße aufbläht? Ich möchte gerne eigene Images erstellen.
Hi! Hast du das schon mal probiert? Ich hab geschrieben „kann“ die volle SD Kartengröße brauchen. Mein Backup meiner 8 GB Karte hat am Mac knapp 4 GB benötigt.
Danke für das Script, es liest sich interessant. Leider zerschoss es mir die SD-Karte, ich habe meinen Pi komplett neu aufgesetzt. Gut, dass ich noch eine andere Backup-Strategie habe, die mir einiges gerettet hat – u.a. meine Owncloud-Datenbank.
Kann sein, dass ich mich irre, sollte man nicht besser ein Backup von der ganzen SD-Karte machen, also /dev/mmcblk0, um die Partionen etc alles so beizuhehalten?
Habe mir das Skript gerade durchgelesen, dort wird auch ein Backup von /dev/mmcblk0 gemacht.
Hat sich dann denke ich erledigt
Hallo,
Tolles Tut um ein Backup des Pi zu machen. Ich hab bisher immer den Pi abgedreht und die SD Card am Win7 PC mittels Win32 DiskImager eingelesen.
Das Ergebnis am Ende des Scripts ist dann eine .img Datei mit dem selben Inhalt wie wenn ich das mit de Win32 DiskImager mache?
Dh. ich kann dann, sollte der Pi crashen, einfach ne SD Card nehmen und das .img File aufspielen?
Danke für deine Antwort.
Hallo!
probiere es einfach mit einer 2. SD Karte aus! Dann weißt du es genau und bist auf der sicheren Seite. Die SD Karte muss nur mindestens so groß sein wie für das *.img Platz benötigt wird. Bin mir aber sicher man könnte im Notfall das Image auch mit einem externen Programm am PC verkleinern.
Hi Werner!
wie wäre die Zeilen (wo hdd steht) zu modifizieren, um alles direkt vom RPi auf meinen externen pw-geschutzten NAS zu schreiben statt auf irgendeinen lokalen hdd-partition?
# Setting up directories
SUBDIR=raspberrypi_backups
DIR=/hdd/$SUBDIR
Any ideas??
Ziel ist, alles als cron.weekly einzurichten?
naja wie hast du denn dein NAS gemounted?
Der Ansatz, überhaupt ein Backup zu machen und die Methode anderen in einem Blog als Anregung verfügbar machen finde ich sehr gut. Trotzdem habe ich Anmerkungen zum Komplettbackup/Image der SD-Karte:
1. Am Mac muss es heißen „dd if=/dev/disk1s1 of= bs=1m“, also ein kleines „m“ am Ende, sonst gibt’s eine „illegal numeric value“ Fehlermeldung. Bei Linux/Unix ist es mir gerade nicht geläufig.
2. Mit dem oben im dd Kommando angegebenen if-Device (disk1s1) wird nur die Boot-Partition gesichert. Will man die gesamte Karte sichern, muss es heißen „dd if=/dev/disk1 of=…“.
3. Man kann den Vorgang deutlich beschleunigen, wenn man das RAW DEVICE ausliest: „dd if=/dev/rdisk1 of=…“. Die benötigte Zeit wird auf ca. 25% reduziert.
4. Ein Image mit dd hat immer die Größe des gelesenen Device, es ist ein Bit-für-Bit Abbild des Device, unabhängig ob /dev/disk oder /dev/rdisk verwendet wird.
5. Man kann sicherlich von einem laufenden System aus mit dd das Image z. B. auf einen gemounteten USB-Stick schreiben. Bei geforderter 7*24h Verfügbarkeit würde ich dies auch so tun, mit einem Image von einem sauber runter gefahrenen System würde ich aber besser schlafen.
danke für das ausführliche Kommentar!
Wem das Imagefile zu groß is, kann es während der Erstellung komprimieren. Der Platzbedarf sinkt dabei auf ca. 15%. Die Kommandozeile sieht dann auf dem Mac so aus:
sudo dd bs=1m if=/dev/rdisk1 | gzip > [filename].gz
Restore auf eine neue FAT-formatierte, gleich große (oder größere) SD-Karte:
gzip -dc [filename].gz | dd of=/dev/rdisk2
Hallo,
bin ein Anfänger und betreibe den Raspi für Heizungssteuerung und PV-Kontrolle. Nun möchte ich regelmässig meine SD bzw. Log-Dateien auf meinem externen Netzwerkspeicher mit der IP 192.168.x.x speichern.
Habe mit dem Kommando
dd if=/dev/disk1s1 of=192.168.x.x/backup/backup.img bs=1M
versucht und erhalte den Fehler “ Verzeichnis oder Datei nicht vorhanden „.
Was muß ich denn bei der Netzwerkangabe eingeben ?
Gruß Peter
Hi, du kannst keinen externen Pfad mit der IP Adresse angeben. Du musst das Verzeichnis vom externen Gerät, also den Ordner backup dort freigeben und am Raspberry Pi mit dem mount Befehl als lokales Verzeichnis mounten, zB nach /mnt/backup. Dann kannst du im dd Befehl of=/mnt/backup angeben und die Datei wird am externen Gerät erstellt. Als Anfänger mal nach mount googlen oder die Dokumentation mit man mount lesen.
Guten Morgen,
ich habe in diesem Zusammenhang die Frage, unter welchen Umständen eine SD Karte in einem Raspberry PI „gefährdet“ wird.
Ich musste inzwischen schon 2mal Raspian + FHEm neue aufsetzen.
Ist es
a) ein Stromausfall am Raspberry?
b) das Abziehen der SD-Karte
Wie kann ich die SD-Karte richtig entfernen?
besten Dank
Thomas
Naja, eine SD Karte kann nur begrenzt oft beschrieben werden, d.h. je mehr Daten ständig gespeichert und wieder gelöscht werden (zB log Dateien) desto kürzer ist die Lebensdauer. Generell sind SD Kartem aber sehr robust.
Hallo,
vielen Dank für die von dir geteilten Infos für ein automatisches Backup. Ich habe jedoch Probleme wenn ich den Script im crontab ausführen möchte. Ich poste mal den output hier rein 🙂
root@rpi:/var/log# cat backupScript.log
Starting RaspberryPI backup process!
/home/pi/autoScript.sh: 11: /home/pi/autoScript.sh: [[: not found
Package ‚pv‘ is NOT installed.
Installing package ‚pv‘. Please wait…
Paketlisten werden gelesen…
Abhängigkeitsbaum wird aufgebaut….
Statusinformationen werden eingelesen….
pv ist schon die neueste Version.
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Stopping some services before backup.
/home/pi/autoScript.sh: 38: /home/pi/autoScript.sh: service: not found
/home/pi/autoScript.sh: 39: /home/pi/autoScript.sh: service: not found
/home/pi/autoScript.sh: 40: /home/pi/autoScript.sh: service: not found
Backing up SD card to USB HDD.
This will take some time depending on your SD card size and read performance. Please wait…
/home/pi/autoScript.sh: 1: /home/pi/autoScript.sh: blockdev: not found
pv: Diese Option benötigt ein Argument — »s«
`pv –help‘ zeigt weitere Informationen an.
0+0 Datensätze ein
0+0 Datensätze aus
0 Bytes (0 B) kopiert, 0,00392915 s, 0,0 kB/s
Start the stopped services again.
/home/pi/autoScript.sh: 53: /home/pi/autoScript.sh: service: not found
/home/pi/autoScript.sh: 54: /home/pi/autoScript.sh: service: not found
/home/pi/autoScript.sh: 55: /home/pi/autoScript.sh: service: not found
Successful backup, previous backup files will be deleted.
Backup is being tarred. Please wait…
tar: Entferne führende „/“ von Elementnamen
RaspberryPI backup process completed! FILE: /mnt/rpiBackup//backup_20150416_122003.img.tar.gz
root@rpi:/var/log# nano /home/pi/autoScript.sh
root@rpi:/var/log# dpkg -s pv | grep Status
Status: install ok installed
Manuell läuft der Script sauber durch!
Vielen Dank
Daniel