Backup des Raspberry Pi im laufenden Betrieb

Auf meinem Raspberry Pi läuft die Hausautomatisierung FHEM. Diese kann von Haus aus schon Backups von sich selbst anlegen, allerdings laufen auf meinem Raspberry noch weitere Dinge im Hintergrund die ich garantiert bei einem Wechsel der SD-Karte vergessen würde neu aufzusetzen. Und dann sitz ich wieder da, mache dicke Backen und weiß nicht warum der Quark nicht läuft.

Also habe ich für mich beschlossen dass ich liebe die komplette SD-Karte als Backup ablege. Das kann man nun mit verschiedenen Methoden veranstalten. Einerseits könnte man mit Software wie Win32 Disk Imager an einem Windows PC die Karte klonen wozu ich aber jedes Mal den Raspberry herunter fahren müsste, die SD-Karte raus pfriemeln und ins Lesegerät stecken müsste.
Praktischerweise kann so ein Raspberry mit dem “dd Kommando”  sich auch selber klonen und das Backup auf einen externen USB-Stick, oder wie in meinem Fall, dieses auf ein externes NAS legen.

“dd” würde ein Image auf der SD-Karte anlegen was aber totaler Quatsch wäre, wie käme man bei einem Defekt dann an die Daten? 😉
Also müssen wir ein externes Laufwerk “mounten”. Das bedeutet, wir gaukeln dem Raspberry vor dass das externe Laufwerk, welches wir beim Mounten verknüpfen ein Verzeichnis auf dem Raspberry sei.

Und das geht so:
Mit Putty auf dem Raspberry einloggen.
Als erstes legen wir nun das Verzeichnis an welches als Verbindungspunkt laufen soll.

sudo mkdir /backup

Als nächstes folgt die Verknüpfung mit dem externen Laufwerk. In meinem Fall ein externes NAS im Keller welches Benutzername und Passwort benötigt, die Backups sollen später im Verzeichnis “backup” abgelegt werden (muss schon existieren):

sudo mount -t cifs -o user=meinBenutzername,pass=MeinBenutzerPasswort //192.168.178.123/backup //backup

Dabei muss dann entsprechend Benutzername, Passwort und IP-Adresse bei Euch angepasst werden.

Damit bei jedem Neustart des Raspberry das Laufwerk auch wieder neu gemounted wird muss noch per Crontab ein Job angelegt werden. Dazu gehe ich aber später ein, wir müssen eh noch im Crontab einen Job anlegen.

Nachtrag vom 16.12.2020:
Das mit dem Crontab kann man sich getrost schenken wenn man den Mount-Prozess in fstab einträgt. Dazu weiter unten mehr.

Um einen USB-Stick zu mounten muss man etwas anders vorgehen, da hängt es unter anderem davon ab welchen Typ man benutzt. Da verweise ich auf dieses Tutorial, es würde hier zu lang werden.

Nun benutzen wir ein Script welches recht komfortabel die Backups erstellt und, wenn eine bestimmte Anzahl an Backups vorhanden ist, das älteste löscht.
Dazu einfach den Editor nano starten:

sudo nano /home/pi/Backup.sh

Hier nun das Script (Quelle:  Raspberry-tips) hinein kopieren und folgende Variablen anpassen:

  • BACKUP_PFAD – Pfad zum verknüpften Laufwerk (in unserem Fall /backup)
  • BACKUP_ANZAHL – Wieviele Backups sollen aufbewahrt werden?
  • BACKUP_NAME – Name der Sicherung
  • DIENST_START_STOP – Dienste die vor dem Backup gestoppt und dann wieder gestartet werden. Das ist zum Beispiel ziemlich wichtig wenn u.a. ein MySQL-Server mit drauf läuft, es gibt sonst korrupte Datenbankeinträge. Hat man keine wichtigen Dienste laufen kann man die Zeilen 11 und 17 mit einer Raute auskommentieren.
#!/bin/bash
 
# VARIABLEN - HIER EDITIEREN
BACKUP_PFAD="/pfad/zum_backup_order"
BACKUP_ANZAHL="5"
BACKUP_NAME="RaspberryPiBackup"
DIENSTE_START_STOP="service mysql"
# ENDE VARIABLEN
 
# Stoppe Dienste vor Backup
${DIENSTE_START_STOP} stop
 
# Backup mit Hilfe von dd erstellen und im angegebenen Pfad speichern
dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d-%H%M%S).img bs=1MB
 
# Starte Dienste nach Backup
${DIENSTE_START_STOP} start
 
# Alte Sicherungen die nach X neuen Sicherungen entfernen
pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

Abspeichern mit STRG+X, Y und Enter. Das Script muss nun ausführbar gemacht und verschoben werden:

sudo chmod 755 /home/pi/Backup.sh
sudo mv /home/pi/Backup.sh /usr/local/bin/Backup.sh

Kommen wir nun zum Crontab. Mit Crontabs können zeitgesteuert Prozesse gestartet werden.
Dazu den Crontab-Editor öffnen mit:

sudo crontab -e

Unter der letzten Zeile einen neuen Job anlegen mit

00 01 * * * /usr/local/bin/Backup.sh

Damit wird jeden Tag um 1 Uhr früh ein Backup gestartet.
Wer sich selber andere Zeiten oder nur für bestimmte Tage die Woche ein Backup anlegen möchte schaut sich mal den crontab guru an, da kann man sich seinen Zeitplan recht komfortabel zusammenstellen und dann die Zeile kopieren.

Nun noch speichern mit STRG+X, Y und Enter und schon laufen zur gewünschten Zeit die Backups.
Für meine 8 GB SD-Speicherkarte dauert ein Backup etwa 9 Minuten. Ich lasse die Backups 2x wöchentlich laufen jeweils morgens um 3 Uhr.
Mein Job dazu sieht dann wie folgt aus:

00 03 * * 1,5 /usr/local/bin/Backup.sh

Ich sprach ja vorhin davon dass wir bei den Crontabs noch einen weiteren Job wegen des Mounts anlegen müssen. In eine weitere Zeile fügt ihr folgendes ein:

@reboot mount -t cifs -o user=meinBenutzername,pass=MeinBenutzerPasswort //192.168.178.123/backup //backup

Passt auch hier wieder ggf. Eure IP, Pfade und Name/Passwort an.

Nachtrag vom 16.12.2020:
Ich erwähnte ja weiter oben schon dass man sich den Quatsch mit dem mounten per Crontab schenken kann. Dazu muss der Mount nur in die Datei /etc/fstab eingetragen werden. Dann wird der Mount bei jedem Neustart ausgeführt.

sudo nano /etc/fstab
dort in die unterste Zeile folgenes eintragen:
//192.168.178.xx/Backup /Ordner/fuer/NASVerbindung cifs username=HorstKevin,password=meingeheimesPasswort,uid=1000,gid=1000,dir_mode=0700,file_mode=0600,nounix,vers=1.0 0 0

Achtung! Diese Zeile passt nur für mein System, bei Euch müssen ggf noch Änderungen vorgenommen werden wie IP, Dateipfad, Username, Passwort, Filetyp etc.
Das hier ist auf ein Sambashare auf meinem Synology-Laufwerk ausgelegt. NFS würde vermutlich komfortabler laufen, funktioniert bei mir derzeit nur nicht so recht. Da bin ich noch auf der Fehlersuche.
Um das mit dem fstab besser zu verstehen verweise ich auf eine deutschsprachige Hilfeseite zum Thema:
https://wiki.ubuntuusers.de/fstab/ 

 

 

Und was macht man nun im Fall des Falles um das Backup zurück zu spielen?

Einfach das Image vom NAS mit dem Programm Win32 Disk Imager (oder einer anderen Software zum Bespielen von Images auf SD-Karten) auf eine frische Speicherkarte spielen, einstecken, Rasperry booten, fertig.

 

+++++++++++++++++++++++++++++++++++++++++++++
Update vom 26.12.19
Vor einiger Zeit hat jemand nach der Möglichkeit der Mailbenachrichtigung gefragt. Ich hab das mal hinzugefügt. Wie das geht findet man in diesem Artikel.
+++++++++++++++++++++++++++++++++++++++++++++
Und noch ein Update:
Wer seine Archive gezippt ablegen möchte tauscht einfach die Zeile

dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d-%H%M%S).img bs=1MB


gegen diese aus:

dd if=/dev/mmcblk0 bs=1MB status=progress | gzip > ${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img

Zurückspielen kann man das mit:

gunzip -c ${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img | dd of=/dev/mmcblk0

+++++++++++++++++++++++++++++++++++++++++++++
Update vom 16.12.20
Ich hab den Beitrag etwas editiert, das Mounten per Crontab ist Unfug. das kann man besser per fstab erledigen.

48 Gedanken zu „Backup des Raspberry Pi im laufenden Betrieb

  1. Ihr crontab würde jeden Sonntag um 01:00 ausgeführt werden, nicht täglich wie im Text darunter beschrieben.

  2. Stimmt, ein Flüchtigkeitsfehler.
    Es muss natürlich 00 01 * * * lauten.
    Ich korrigiere das.

  3. Hallo,
    ich habe da eine kurze Frage bzgl der backup.sh
    Warum werden nach der Sicherung die Dienste mit dem Befehl ${START_SERVICES} start gestartet und nicht mit ${DIENSTE_START_STOP} start?
    Und woher greift sich das System bei dem Befehl ${START_SERVICES} start die Dienste??
    Beim stoppen der Dienste wird mit dem Befehl ${DIENSTE_START_STOP} stop der Dienst aus der zuvor angelegten variablen gezogen. Daher leuchtet mir der start nicht so gang ein.
    Vielen Dank schon mal für eure Hilfestellung

  4. Könnte man dem Skript noch eine Überwachung hinzufügen? Zum Beispiel eine Mail an root bei Fehlern und erfolgreichem Backup?

  5. Hi!

    Das ist mir ehrlich gesagt noch gar nicht aufgefallen. Der Fehler lag schon im Quellscript von “Raspberry-Tips” (Siehe Link im Artikel).
    Die Variable ${START_SERVICES} muss natürlich auch oben definiert werden. Oder eben mit ${DIENSTE_START_STOP} start gestartet werden.

    Ich korrigiere das mal. Danke für den Hinweis.

  6. Dieses automatische Backup ist für mich höchstinteressant, leider bekomme ich es nicht hin 🙁
    Bei mir hängt es an dem Mount des externen Nas Laufwerks (Diskstation, andere Geräte sind per CIFS schon verbunden)
    Wenn ich das wie oben geschrieben anwende passiert:

    pi@raspberrypi:~ $ sudo mount -t cifs -o user=***,pass=+++ //192.168.1.30/RaspiBackup //backup
    mount: wrong fs type, bad option, bad superblock on //192.168.1.30/RaspiBackup,
    missing codepage or helper program, or other error
    (for several filesystems (e.g. nfs, cifs) you might
    need a /sbin/mount. helper program)

    In some cases useful info is found in syslog – try
    dmesg | tail or so

    also user + pw des nas sind korrekt. was mach ich falsch 🙁

  7. Phantastisch, genau was ich gesucht habe um meine OpenHab Pi’s unkompliziert komplett zu sichern, vielen Dank!

  8. Hallo,

    danke erstmal für den Artikel. Ich hatte etwas Probleme meine Diskstation zu mounten. Ich musste bei den Parametern noch vers=1.0 hinzufügen. Außerdem beim Crontab hinter @ reboot noch “sleep 60 && ” (ohne “”) einfügen, da es so kein automatisches Mounten nach dem Neustart gab. Die Netzwerkkonfig. des Raspi braucht wohl erst etwas Zeit. ☺

  9. je nach raspbian Version kann der Mount Befehl leider einen Haufen Ärger machen, was eine ziemlich lange Suche nach sich ziehen kann.
    Leider hatte ich nicht bemerkt, dass ein Raspbian Update oder Upgrade das verursacht hatte, so dass ich erst das Problem nicht merkte, dann nicht eingrenzen und auflösen konnte und nun erst Ewigikeiten später danach suchen und es auflösen konnte, warum bei mir all das mount Gedöns scheiterte, egal ob manuell oder per fstab, wobei die ja noch nicht einmal Hinweise auf Fehler rausspuckte, wenn der Pi bootete und zuerst die fstab abgearbeitet hat

    Dieser folgende mount Befehl funktioniert auch noch mit stretch:

    sudo mount -t cifs -o username=beginner,password=whoknows,vers=1.0 //192.168.x.x/fritz.nas/HUB_N /media/pi/FRITZNAS

    Ab stretch muss es username statt user heißen, sonst kommt ein mount error (22)

    Gleichfalls ist nach dem Passwortinhalt von “whoknows” ein ,vers=1.0 einzufügen, ansonsten grüßt der “host is down error”, was wohl mit SMB und Windows zu tun hat.

    Ggf. kann auch noch password statt zuvor pw oder passwrd erforderlich sein.

    Jedenfalls so funktioniert es hier auf aktuellem Raspbian mit Pi 4 in der 2 GB Version.

  10. Pingback: Raspberry Pi Backup jetzt mit Mailbenachrichtigung | Hilftdirweiter.de

  11. Hallo,
    das script läuft bei mir soweit super, jedoch läuft jetzt mein Synology NAS “voll”, da trotz der definierten Anzahl der max. Backups (ist bei 5 belassen) trotzdem einfach weitere Backups angelegt werden und die alten somit nicht gelöscht werden.
    Das Script ist 1:1 so angelegt wie es hier beschrieben ist.
    Kann ich um Support bitten, damit mein NAS wieder Luft zum Arbeiten bekommt?

  12. Moin Reiner.
    Puh, so aus der Glaskugel heraus ist das schwierig zu lesen warum das so ist.
    An erster Stelle würde ich mal tippen dass die Rechte zum Löschen von Dateien fehlen. Bekommst Du denn Fehler angeziegt beim Ausführen des Scripts?
    Kannst es ja mal manuell anstoßen.
    Sprich:
    in das Verzeichnis des Raspi gehen wo das Script liegt, dort dann “sudo Backup.sh” (wenn Du das Script unter dem Namen gespeichert hast) und schauen ob es Fehlermeldungen gibt.
    Die geben idR Aufschluss darüber wo der Fehler sitzt

  13. Hallo,
    kann man auch mehrere Dienste stoppen? Wenn JA, wie schreibe ich das?

    Vielen Dank –
    Hicki

  14. Hi Andreas.
    Ja, das geht. Im Grunde genommen ist das von mir gezeigte Script nach einiger Überlegung eh etwas unsinnig.
    Der Autor hat ja den Dienst “mysql” in eine Variable gelegt (hier: DIENSTE_START_STOP)
    Lass das mal weg.
    Schreib das wie folgt:
    # VARIABLEN - HIER EDITIEREN
    BACKUP_PFAD="/pfad/zum_backup_order"
    BACKUP_ANZAHL="5"
    BACKUP_NAME="RaspberryPiBackup"

    # ENDE VARIABLEN
    # Stoppe Dienste vor Backup
    service mysql stop
    service Dienst2 stop
    service Dienst3 stop

    Und später dann:

    # Stoppe Dienste nach Backup
    service mysql start
    service Dienst2 start
    service Dienst3 start

    Ich passe das die Tage mal an, denn es wäre außerdem schlau mögliche Fehler abzufangen und zu protokollieren. Aber darüber muss ich noch mal nachdenken.

  15. Hallo
    bin durch Zufall hier gelandet…
    sehr schöne Anleitung!
    Den Automount habe ich allerdings in fstab Eingetragen:
    sudo nano /etc/fstab
    //192.168.10.41/hbbackup /backup cifs username=test,password=test 0 0

    Gruß
    Stefan

  16. Hallo Ulf Heinrich,
    erst einmal vielen Dank für die schöne Zusammenfassung und Erklärung des Skriptes zum Backup der SD-Karte eines Raspberry pi´s.
    Das hat mit echt Zeit erspart.
    Da es zu einer Fehlermeldung gekommen ist, wenn die Anzahl der Backup-Dateteien im NAS-Verzeichnis kleiner als die maximale Anzahl Dateien ist, habe ich eine kurze Abfrage dazu hinzugefügt.
    Eine Frage habe ich:
    Wie kann man eine mit GZIP gezippte Datei wieder auf den Raspi zurückspielen?
    Diese SD-Karte ist ja defekt. Über Windows funktioniert das ja ja nicht so einfach.
    Die gezippten Daten haben eine Größe von ca. 4 GB, bei einer 32 GB SD-Karte, die ungezippten ca. 29 GB. Ist das OK?
    Gruß
    Frank

    p.s.: Hier das von mir leicht geänderte Skript:

    #!/bin/bash
    # Festplatte einbinden
    mount -t cifs -o user=´USER´password=XXX,rw,file_mode=0777,dir_mode=0777 //IP-Adresse/Raspi-Backup /mnt/nas
    # Variablen
    BACKUP_PFAD=”/mnt/nas”
    MAX_BACKUP_FILES=”4″
    BACKUP_NAME=”Raspi-bak”
    # Backup-Datei erstellen full
    # dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img bs=1MB
    # Backup-Datei erstellen mit gzip
    dd if=/dev/mmcblk0 bs=1MB status=progress | gzip > ${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img
    ## Entzippen der gzip-Backup-Datei
    ## gunzip -c ${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img | dd of=/dev//mmcblk0
    # Anzahl der vorhandenen Backup-Files ermitteln
    ANZ_BACKUP_FILES=”$(find ${BACKUP_PFAD} -maxdepth 1 -type f -name ‚*.img’ | wc -l)”
    if
    [ $ANZ_BACKUP_FILES -gt $MAX_BACKUP_FILES ]
    then
    # Alte Sicherung löschen
    pushd ${Backup_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${MAX_BACKUP_FILES} | xargs rm; popd
    echo “Backup-Datei erstellt und eine Datei geloescht” | mail -s “Backup+Clean” Meine Mailadresse
    else
    echo “Backup-Datei erstellt” | mail -s “Backup” Meine Mailadresse
    fi
    # Festplatte auswerfen
    umount /mnt/nas
    # END OF SCRIPT

  17. Hi Frank,

    im Grunde genommen ist das Prozedere bei den GZIP tatsächlich simpel:
    – entzippen
    – Image mit Win32DiskImager auf ne SD-Karte aufspielen mit gleicher oder größerer Größe.

  18. Hallo, ich habe eine Frage. Welche Dienste sollte man denn überhaupt grundsätzlich vor dem Update stoppen? Ich nutze ioBroker, motion/motionEye, Nextcloud und piVCCU. Vielen Dank und schöne Grüße

  19. Hi,
    das hängt davon ab welche Dienste zum Zeitpunkt des Backup etwas speichern.
    Eine SQL Datenbank zum Beispiel.
    Du hast dann sonst im Backup möglicherweise eine korrupte Datenbank die Dir später nichts nützen würde wenn Du das Backup brauchst.

  20. Bei mir hat es leider nicht funktioniert (Pi 4 B). Ich habe das Script nochmal angepasst und hoffe, dass es am Mittwoch sync. Kann man die Einstellungen irgendwie überprüfen bzw. testen?

  21. Moin Micha,

    ich weiß jetzt nicht genau was Du testen willst, aber Du kannst das Script ja auch manuell anstoßen, dann startet es sofort.
    sudo Backup.sh (oder wie auch immer Du Dein Backup-Script benannt hast)
    Dann siehst Du ja auch ob es läuft

  22. Hallo zusammen,

    ich habe gerade das Script auf meinem PI angelegt und es funktioniert.

    Da meine SD Karte 32GB hat dauert es schon eine Weile bis das Backup erstellt ist. Auf der SD Karte ist nur ein Bruchteil tatsächlich belegt.

    Wäre es eine Option die Sicherung mit pishrink zu verkleinern?

    Wer kann mir hier helfen das Script entsprechend anzupassen?

    Gruß
    Michael

  23. Hallo,
    ich bekomme bei dem Skript folgende Ausgabe, mit einer Fehlermeldung:

    sudo /home/…/Backup.sh
    15812+1 Datensätze ein
    15812+1 Datensätze aus
    15812526080 Bytes (16 GB, 15 GiB) kopiert, 865,668 s, 18,3 MB/s
    /mnt/ext1_500GB/Backup /mnt/ext1_500GB/Backup
    rm: fehlender Operand
    „rm –help“ liefert weitere Informationen.
    /mnt/ext1_500GB/Backup

    * Ich habe den cronjob noch nicht angelegt, sondern das Skript manuell ausgeführt.
    * Es gibt eine .img-Datei, er scheint erst beim ”rm” Befehl nicht weiter zu wissen

    Mein voller Code:


    #!/bin/bash

    # VARIABLEN – HIER EDITIEREN
    BACKUP_PFAD=”/mnt/ext1_500GB/Backup”
    BACKUP_ANZAHL=”5″
    BACKUP_NAME=”RaspberryPiBackup”

    # ENDE VARIABLEN

    # Stoppe Dienste vor Backup
    # service mysql stop

    # Backup mit Hilfe von dd erstellen und im angegebenen Pfad speichern
    dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d-%H%M%S).img bs=1MB

    # Starte Dienste nach Backup
    #service mysql start

    # Alte Sicherungen die nach X neuen Sicherungen entfernen
    pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

    Was übersehe ich hier? Würde mich über Hilfe freuen, bzw über eine Erklärung, was der letzte Befehl genau macht, und warum er mir einen Fehler wirft.

    Ansonsten sehr cooles Skript, genau das was ich suche. Nur das Stoppen der Dienste muss ich mir nochmal im Detail überlegen… Im Prinzip läuft nur ein Sambashare und ein DokuWiki darauf.

    Viele Grüße
    Petra

  24. Super Anleitung, vielen Dank für die Mühe.

    Eine kleine Frage, ich habe einen Pi4 und alles umgestellt auf SSD.
    Heißt, mein Raspain läuft auf einer gebooteten SSD. Im Script steht ja was von dev/mmcblk0p1 das findet er nicht. Hab mal mit sudo fdisk -l nachgeschaut und bei mir steht da:

    Device Boot Start End Sectors Size Id Type
    /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA)
    /dev/sda2 532480 234441647 233909168 111,5G 83 Linux

    Muss ich da jetzt /dev/sda2 nehmen? Die sda1 brauche ich nicht?

    Danke und Grüße
    René

  25. Hab im übrigen das gleiche Prob wie Michael. Mit DD nimmt er mir ja die ganze SSD und die ist mal 128 GB groß. Wie kann man das Script anpassen, damit nur die Daten selber kopiert werden?

  26. Lies Dich mal in das Kommando cp ein. Damit kannst Du Dateien und/oder Verzeichnisse kopieren.

  27. Gute Frage, theoretisch ja. Aber ich weiß nicht ob das Image dann funktionieren wird. Probiere es doch mal aus.
    Aber bedenke dass das Image die Größe der kompletten SSD annehmen wird. Egal ob voll beschrieben oder nicht.
    Mit SSD hab ich noch keine Erfahrungen gesammelt

  28. Hallo,

    erst einmal vielen Dank für die Anleitung.
    Leider hatte ich mit dem aktuellen Raspi OS (von 2020-05-27; mit “apt-get update && apt-get upgrade” aktualisiert) Probleme beim erstellen der “Backup.sh”
    Ich bekomme immer beim Speichern (strg+o) den Fehler, das mir die Berechtigungen (“Permission denied”) fehlen.
    Kann mir evtl. bei dem Problem jemand helfen??
    Ich hatte nano mit “sudo nano /home/pi/Backup.sh” aufgerufen.

    Ich bin bis dahin, außer bei dem Erstellen des Mounts, nach der Anleitung gegangen. Ich habe auf meiner NAS (Synology) den Mount per “autofs” eingebunden.Auch habe ich einen Benutzer “pi” auf dem NAS angelegt. Durch eine Test-Datei konnte ich feststellen, das das NAS tatsächlich gemountet wude. Abr auch das hat sehr lange gedauert 🙂 Bin halt Windows – Nutzer 🙂

  29. Hallo

    Super Idee mit dem Script. Hört sich sehr praktisch an. Ich habe das ganze jetzt mal versucht auf meinem Raspberry Pi zu integrieren.

    Mir fallen dabei 2 Dinge auf.

    Erstens verhält sich das Script anders wenn es über den cronjob läuft als wenn ich dieses manuell ausführe. Beim manuellen Ausführung läuft das Script und erstellt ein Image dass die grösse der SD-Karte hat. Also absolut korrekt. Das einzige was mir dort auffällt ist, dass ich dort den gleichen Fehler wie von Petra beschrieben erhalte (“rm: fehlender Operand”).

    Sehr interessant ist aber, wenn das Backup-Script über den cronjob läuft. Dort wird das Image nur ein paar MB gross, obschon ich ja die gleiche Sicherungsgrösse wie ab manuellem Start erwarte. Habe diverse Möglichkeiten versucht zu eruieren, leider ohne Erfolg. Muss aber zugeben, dass ich kein riesen Linux-Crack bin 🙂

    Hilfe ist daher sehr willkommen.

    Beste Grüsse
    JC

  30. Hmmm. Hast Du mal geschaut ob das Cronjob Image auch korrekt erstellt wurde? Sprich: ist es lauffähig oder korrupt und eben nur ein paar MB groß? Ich hatte das auch mal und das Script hat beim Erstellen irgendwo mittendrin abgebrochen. Sah dann auch so aus, allerdings war das Image nicht zu gebrauchen. Bei mir war das ein Speicherplatzproblem.

  31. Hi Ulf

    Ja habe ich geprüft. Es ist nicht lauffähig und eben nur ein paar MB gross. Starte ich das Script manuell (mit dem exakt gleichen Befehl wie in crontab hinterlegt), wird das Image korrekt erstellt (lauffähig) und entspricht auch der SD Grösse. Bin daher echt überfragt, warum es sich anders verhält im cronjob-Modus als bei manuellem Start. Ich bin echt überfragt..

    Ich vermute auch, dass hier das Script beim Cronjob irgendwie abbricht. Aber ich sehe nicht wieso (resp. live monitoren mochte ich nicht, da das Script um 00:30 startet). Ausserdem wäre dann meine Erwartung, dass dieses ja auch bei einem manuelle Start entsprechend abbrechen würde.

    Speicherplatzproblem kann ich ausschliessen. Auf der externen HD ist noch genügend Speicher vorhanden und sie ist korrekt gemount.

    Wie gesagt, ich bin überfragt…

  32. Hmm. Schreib mal ne andere Uhrzeit in den Cronjob. Tagsüber. Evtl macht Dein Router in der Zeit nen Reset und zerhackt Dir den Job.

  33. Hallo Ulf oder wer sonst eine Idee hat,

    Dieser Beitrag ist wirklich sehr hilfreich für alle, die ohne großen Aufwand immer ein aktuelles Image für ihren RasPi haben möchten. Wenn einmal etwas schief geht, kann das extrem viel Zeit und Nerven kosten. Danke dafür!

    In zwei Kommentaren (Petra und JC) wurde das Problem “rm: fehlender Operand“ angesprochen, dass auch bei mir auftritt und offensichtlich dazu führt, dass die alten Sicherungen nicht gelöscht werden. Die entsprechend Zeile im Script habe ich nicht verändert (siehe unten) und auch die Anzahl der Sicherunge auf 5 belassen. Mit “rm –help” komme ich hier nicht so recht weiter. Hat jemand eine Idee?

    pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

    Danke und Grüße NB

  34. Hallo Ulf,
    vielen Dank, du hast mir sehr mit deiner Anleitung sehr geholfen :-). Bei meiner Ausprobe bin ich jedoch auf zwei Dinge gestoßen und habe folgende Lösungen dafür gefunden.
    1. Problem – es wurden die Backups nach Anzahl >5 nicht gelöscht
    Ich habe herausgefunden, dass bei mir mit Starten des Dienstes Node-Red der Löschbefehl nicht mehr ausgeführt wurde
    Lösung: ich habe einfach die Reihenfolge der Befehle geändert und siehe da es funktioniert
    # Alte Sicherungen die nach X neuen Sicherungen entfernen
    pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

    # Starte Dienste nach Backup
    ${DIENSTE_START_STOP} start

    2. Problem: Beim Löschbefehl habe ich die Meldung rm: fehlender Operand“ erhalten konnte ich mit einem -r lösen.# Alte Sicherungen die nach X neuen Sicherungen entfernen
    Lösung:
    pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm -r; popd

    PS: Hat jemand das Skript so erweitert, dass man eine Fehlermeldung geschickt bekommt falls etwas nicht funktioniert – würde mich interessieren.

    LG Chris

  35. Hallo
    Du musst auf die richtige Eingabe der ‘ ‘ ” Zeichen etc. achten.

    #!/bin/bash

    # VARIABLEN – HIER EDITIEREN
    BACKUP_PFAD=”/backup”
    MAX_BACKUP_FILES=”5″
    BACKUP_NAME=”RaspberryPiBackup”
    DIENSTE_START_STOP=”service mysql”
    # ENDE VARIABLEN

    # Stoppe Dienste vor Backup
    # ${DIENSTE_START_STOP} stop

    # Backup mit Hilfe von dd erstellen und im angegebenen Pfad speichern
    #
    dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d-%H%M%S).img bs=1MB

    # Starte Dienste nach Backup
    # ${DIENSTE_START_STOP} start

    # Alte Sicherungen die nach X neuen Sicherungen entfernen
    # pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd
    # Anzahl der vorhandenen Backup-Files ermitteln
    ANZ_BACKUP_FILES=”$(find ${BACKUP_PFAD} -maxdepth 1 -type f -name ‘*.img’ | wc -l)”
    echo ‘AnzahlBackupfiles ‘ $ANZ_BACKUP_FILES ‘MaxBackupFiles ‘ $MAX_BACKUP_FILES
    if
    [ $ANZ_BACKUP_FILES -gt $MAX_BACKUP_FILES ]
    then
    # Alte Sicherung löschen
    pushd ${Backup_PFAD};ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${MAX_BACKUP_FILES} | xargs rm; popd
    fi

    Gruss Fred

  36. Vielen Dank für diese tolle Anleitung. Beim Mounten musste ich allerdings “username” statt “user” und “password” statt “pass” schreiben, sonst kam ein mount error (22).
    Grüße

    Tim

  37. Hallo,

    danke für die tolle Anleitung. Damit hat das automatische Sichern fast hervorragend geklappt. Einzig das Mounten beim Booten hat bei mir zunächst nicht geklappt.
    Hier folgender Tipp, von einer anderen Seite:
    sudo raspi-confic
    1 System Options > S6 Network at Boot > enable
    Bei meinem Raspi 4 mit 8Gb war er ggf. zu schnell beim Booten und konnte daher das NAS nicht erfolgreich einbinden.

  38. Hallo, jetzt war es bei mir mal soweit SD defekt und dann wollte ich mein Image auf eine neue SD Karte einspielen ging aber nicht. Fehlermeldung Size of image lager than device Image: 124778496 sectors, Device: 124735488 sectors, Sector Size: 512 The extra space DOES appears to contain data.
    Es sind beide 64GB. Jetzt habe ich eine 128GB benutzt mit der hat es auch geklappt. Sind die SD Karten unterschiedlich groß? Es fehlt ja nicht viel.
    Herzlichen Dank

  39. Ja, kenn ich. Wirklich exakt gleich groß sind nur baugleiche Karten.
    Drum hatte ich immer 2 identische SD Karten gekauft und eine als Reserve hin gelegt. Kosten ja nicht viel.

  40. Falls mal jemand noch über Rolands Frage vom 28.4.21 stolpert:
    Man kann das Image auch einfach auf die Größe des Sicherungsdatenträgers shrinken. Dazu gibt es verschiedene Programme und Anleitungen.
    Am einfachsten aber ist es für Raspian mit grafischer Oberfläche, die integrierte Raspi-Kopier-Funktion mit automatischem Shrink zu verwenden:
    Im Menue Anwendung/Zubehör findet sich SD Card Copier. Zuerst einen SD-Kartenleser mit der neuen Speicherkarte an einen der USB-Ports anschließen, dann Generic STORAGE DEVICE (/dev/sdb) anwählen.
    Bei Raspian Lite bietet sich PiShrink an. Raspian benötigt ja nur einen kleinen Teil einer 32GB Speicherkarte; der Rest kann problemlos geshrinkt werden.
    Andersherum funktioniert es auch: Ist das Image kleiner als die Speicherkarte, wird diese vollständig gefüllt.

  41. Hallo,
    wenn ich mehrere Diesnte habe, die ich stoppen / starten möchte, wie muß
    die Variable “DIENSTE_START_STOP” dann aussehen ?
    Mit Komma oder Leerzeichen separieren ?
    Gruß
    Hugo

  42. Moin!

    Topp, danke für die Inspiration und die einfache Anleitung!

    Bzgl. des MOUNTEN habe ich eine Frage:

    Spricht etwas dagegen, das MOUNTen _nicht_ in den Systemstart (/etc/fstab) aufzunehmen sondern stattdessen im Script ein MOUNT und UMOUNT unterzubringen?

    Somit besteht die Verbindung nur für den Zweck und Zeitraum des Backups.
    Und falls das NAS (in meinem Fall) zwischendurch mal neu gestartet wird, dann würde sich das nicht auf diese Verbindung auswirken.

    Nach “# ENDE VARIABLEN” folgendes einbauen:

    # Laufwerk mounten
    sudo mount -t cifs -o username=,password=,vers=1.0 //192.168.x.x/Pfad1/ /${BACKUP_PFAD}

    Und am Ende das einfügen:

    # Laufwerk unmounten
    sudo umount //192.168.x.x/Pfad1/

  43. Hallo,

    Gibt es hier zu eine Antwort? Habe das gleiche Problem. Muss ich beide sichern?

    Super Anleitung, vielen Dank für die Mühe.

    Eine kleine Frage, ich habe einen Pi4 und alles umgestellt auf SSD.
    Heißt, mein Raspain läuft auf einer gebooteten SSD. Im Script steht ja was von dev/mmcblk0p1 das findet er nicht. Hab mal mit sudo fdisk -l nachgeschaut und bei mir steht da:

    Device Boot Start End Sectors Size Id Type
    /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA)
    /dev/sda2 532480 234441647 233909168 111,5G 83 Linux

    Muss ich da jetzt /dev/sda2 nehmen? Die sda1 brauche ich nicht?

    Danke und Grüße
    René

Schreibe einen Kommentar

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