SD-Card Backup vom Raspberry im Livebetrieb

Was wäre schlimmer, ein in mühenvoller Zeitarbeit erstelltes Linuxsytem auf dem Raspberry durch einen Defekt der SD Card zu verlieren. Daher sollte man in gewissen Zeitabständen die komplette SD sichern. Der normale Vorgang (so mache ich das auch in der Regel), wäre das System herunterzufahren, Stromkabel ziehen und die SD Card zu entnehmen. Anschließend mit dem USB Image Tool oder Win32DiskImager die Card sichern. Auf Dauer immer etwas lästig, da ja schnell mal weiteres eingerichet oder installiert wird.

So kann man mit einem BackupScript im „Livebetrieb“ mit dd die komplette SD Card sichern. Voraussetzung hierfür ist im Idealfall das Booten von der SD Card. Beim Raspberry Pi3 gibt es ja noch andere Bootvarianten.

Um das ganze nun zu realisieren, nutze ich im Test das Bash-Script raspiBackup von hier:
https://www.linux-tips-and-tricks.de/de/raspibackup/

Vielen Dank in diesem Zusammenhang an framp für das Script und die ausführlichen Anleitungen.

Voraussetzung für das Ganze ist, das das Raspian System komplett von der SD Card bootet. Um per Console ( SSH ) Zugriff zum Raspberry zu haben, nutze ich Putty.

Vorbereitung:

Im Beispiel soll das Backup auf ein gemountetes NAS (Netzwerkspeicher) gesichert werden. Natürlich kann auch ein angeschlossener USB-Stick verwendet werden. Dieser sollte natürlich auch vorher ordnungsgemäß gemountet (eingehangen) sein.

1. Freigabe auf dem NAS einrichten ( vorausgesetzt das ist alles fehlerfrei erledigt)
( prüfen kann man das von der Console aus auf dem Raspberry auch mit: )

showmount -e 192.168.178.24

showmount -e 192.168.178.24 Code über die Console ausführen
IP Adresse vom NAS (192.168.178.24) – dort sollte z.B. gelistet werden:

root@Raspberry-Server:~# showmount -e 192.168.178.24
Export list for 192.168.178.24:
/mnt/HD/HD_a2/NI/raspiserver-backup *
root@Raspberry-Server:~#
2. Mountpoint auf dem Raspberry erstellen und Rechte setzen mit:

sudo mkdir -p /backups

sudo mkdir -p /backups Code über die Console ausführen
mit Root-Zugriff ist sudo nicht nötigt

sudo chmod 0777 /backups

sudo chmod 0777 /backups Code über die Console ausführen

Hier im Test habe ich volle Schreibrechte gesetzt, 0755 sollte auch reichen

3. Mountfreigaben definieren mit fstab, dazu den Editor auf der Console öffnen mit:

sudo nano /etc/fstab

sudo nano /etc/fstab Code über die Console ausführen

Im Editor geben wir am Ende die Freigaberegel (Mount) ein:

Beispiel hier:

192.168.178.24:/mnt/HD/HD_a2/NI/raspiserver-backup /backups nfs rw,auto,hard,relatime 0 0

Die fstab sollte so ähnlich aussehen:

proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
tmpfs /tmp tmpfs nodev,nosuid,relatime,size=50M 0 0
tmpfs /var/log tmpfs nodev,nosuid,relatime,size=40M 0 0
192.168.178.24:/mnt/HD/HD_a2/NI/raspiserver-backup /backups nfs rw,auto,hard,relatime 0 0


Mit StrG O, Enter und StrG X speichern und verlassen wir den Editor. Die Mountfreigabe ist nun abgeschlossen. Um das anschließend sicher zu testen, den Server (NAS) und den Clienten (Raspi) rebooten. Bei NAS reicht eigentlich auch den NFS Server neu zu starten. Dies erledigt man in der Regel im WebIF vom Netzwerkspeicher.

Danach das ganze mal testen mit:

df -h

df -h Code über die Console ausführen

Dort sollte nun z.B. stehen:
192.168.178.24:/mnt/HD/HD_a2/NI/raspiserver-backup 2,7T 1,9T 843G 70% /backups

Zusätzlich kann man noch auf der Console mit -> mount -l kontrollieren.

192.168.178.24:/mnt/HD/HD_a2/NI/raspiserver-backup on /backups type nfs (rw, relatime, vers=3, rsize=16384, wsize=16384,namlen=255, hard, proto=tcp, timeo=600, retrans=2, sec=sys, mountaddr=192.168.178.24, mountvers=3, mountport=35220, mountproto=udp,local_lock=none, addr=192.168.178.24)

Wird das so gelistet, ist alles in Ordnung! Kopiert eine beliebige Textdatei in den Freigabeordner auf dem NAS, so müsst hier auf dem Raspi im Verzeichnis /backups diese Datei wiederfinden. Umgekehrt ebenso. Löscht ihr diese in /backups, verschwindet die Datei auf dem NAS. Prüfung ist abgeschlossen.

4. Backupscript raspiBackup installieren mit:

curl -s -L -O https://www.linux-tips-and-tricks.de/raspiBackupInstall.sh && sudo bash raspiBackupInstall.sh -c -l DE

curl -s -L -O https://www.linux-tips-and-tricks.de/raspiBackupInstall.sh && sudo bash raspiBackupInstall.sh -c -l DE Code über die Console ausführen

Das Script raspiBackup.sh wird nach usr/local/bin installiert, zusätzlich eine raspiBackup.conf nach usr/local/etc . Diese muss noch entsprechend angepasst werden. Eine bereits von mir eingerichtete .conf ist hier schon beigefügt und kann verwendet werden. Diese dann nach individueller Anpassung nach usr/local/etc kopieren. Die Datei ist mit entsprechenden Kommentaren vermerkt.

Download: raspiBackup-Script

5. Aufruf (Backup starten) ohne Crontab über die Console:

sudo /usr/local/bin/raspiBackup.sh -a „:“ -o „:“ /backups

sudo /usr/local/bin/raspiBackup.sh -a ":" -o ":" /backups Code über die Console ausführen


Laufen keine Dienste die vor Backupstart gestoppt werden müssen, kann man mit diesen beiden Optionen das Backup anstossen.

6. Zusätzliche Einstellungen und raspiBackup.conf anpassen:

Download: raspiBackup.conf // (bereits angepasste .conf Datei)

Folgende Daten müssen mit euren eigenen Werten angepasst werden:

# Pfad wo das Backupfile gespeichert wird (hier ist der Mountpoint vom Raspi gemeint)
DEFAULT_BACKUPPATH=“/backups“

# Anzahl der zu vorhaltenden Backups
DEFAULT_KEEPBACKUPS=“3″

# Typ des Backups: dd, tar, xbmc or rsync
DEFAULT_BACKUPTYPE=“dd“

# zip tar oder dd backup (0 = nein, 1 = ja)
DEFAULT_ZIP_BACKUP=“0″

# Durch & getrennte Befehle, die vor dem Starten des Backups auszuführen sind
DEFAULT_STOPSERVICES=““

# Durch & getrennte Befehle, die nach dem Starten des Backups auszuführen sind
DEFAULT_STARTSERVICES=““

# emailadresse die das Backupergebnis erhält
DEFAULT_EMAIL=“deine@domain.de“

# Weitere Parameter für das eMail programm (Optional -E)
DEFAULT_EMAIL_PARMS=“-f absender@smart-mail.de -s smtp.smart-mail.de:587 -o tls=no -xu smtpusername -xp passwort -m Von der SD Card (Raspberry) wurde im Livebetrieb erfolgreich ein Image erstellt.“

# Log level (0 = keiner, 1 = debug)
DEFAULT_LOG_LEVEL=0

# log Ausgabe ( 0 = /var/log/syslog, 1 = /var/log/raspiBackup/.log, 2 = /raspiBackup.log, 3 = ./raspiBackup.log )
DEFAULT_LOG_OUTPUT=2

# Message level (0 = minimal, 1 = detailed)
DEFAULT_MSG_LEVEL=“1″

# mailprogram
DEFAULT_MAIL_PROGRAM=“sendEmail“

Ich nutze zum Test das Emailscript: sendEmail. Trage dort deine Werte ein. Zusätzlich müssen weitere Parameter unter „DEFAULT_EMAIL_PARMS=““ “ ergänzt werden. Einen Email-Provider ohne TLS Verschlüsselung ist am besten, hier im Beispiel smart-mail. Eine genaue Anleitung der sendEmail Variablen in der console unter sendEmail –help.
7. Backup Scriptvorgang automatisieren mit raspiBackupWrapper (vielen Dank wieder an framp)

Mit den zusätzlichen Script wird die Befehlskette in der Console zum Starten des Backups verkürzt. Entsprechend wird der Cronjob auch dann darüber gestartet. Einfach das Script hier laden und nach usr/local/bin kopieren (Rechte 0755). Eventuelle Anpassungen der Dienste durchführen (siehe Hinweis)

Download: raspiBackupWrapper

Zwischen Zeile 82 und 97 könnt ihr eure laufenden Dienste über das Script automatisch stoppen und nach dem Backupvorgang wieder starten. Bei mir laufen apache2, mysql und samba nicht, daher habe ich das auskommentiert. Passt die Datei einfach euren Wünschen an.
8. Cronjob einrichten mit:

sudo crontab -e

sudo crontab -e Code über die Console ausführen

Dort tragen wir ein, wenn z.B. das Script automatisch jeden Sonntag 03:00 Uhr ein komplettes Backup der SD Card erstellen soll:

00 03 * * 0 /usr/local/bin/raspiBackupWrapper.sh > /dev/null 2>&1

00 03 * * 0 /usr/local/bin/raspiBackupWrapper.sh > /dev/null 2>&1 Code über die Console ausführen

9. Testlauf ohne Erstellung eines Backups

Nun wollen wir das ganze mal Testen ohne ein Backup auf das NAS zu schreiben. Dies macht man über die Console mit:

raspiBackup.sh -a „:“ -o „:“ -F

raspiBackup.sh -a ":" -o ":" -F Code über die Console ausführen

Die Meldung im Log sieht dann z.B. so aus:

root@Raspberry-Server:~# raspiBackup.sh -a „:“ -o „:“ -F
— RBK0009I: Raspberry-Server: raspiBackup.sh V0.6.1.3b um Sa 11. Mär 10:56:55 CET 2017 gestartet
— RBK0128I: Logdatei ist /backups/Raspberry-Server/Raspberry-Server-dd-backup-20170311-105655/Raspberry-Server-backup.log
— RBK0116I: Konfigurationsdatei /usr/local/etc/raspiBackup.conf wird benutzt
!!! RBK0124W: Simulationsmodus an
— RBK0008I: Services werden gestoppt: ‚:‘
— RBK0081I: Backup vom Typ dd wird in /backups/Raspberry-Server/Raspberry-Server-dd-backup-20170311-105655 erstellt
— RBK0085I: Backuperstellung vom Typ dd läuft. Bitte etwas Geduld
— RBK0007I: Services werden gestartet: ‚:‘
— RBK0010I: Raspberry-Server: raspiBackup.sh V0.6.1.3b um Sa 11. Mär 10:56:58 CET 2017 beendet
— RBK0017I: Backup erfolgreich beendet
Mar 11 10:57:00 raspberry-server sendEmail[10320]: Email was sent successfully!
root@Raspberry-Server:~#
10. SD Card nun im Livebetrieb sichern mit Funktion -> dd

Durch den gesetzten Cronjob (siehe oben) wird nun jeden Sonntag gegen 03:00 Uhr ein Backup erstellt und auf den Netzwerkspeicher gespeichert. Nach Erstellung erhälst du eine Email über das Backupergebnis. Solltest du nun manuell ein Backup erstellen wollen, so über die Console ausführen mit:

raspiBackupWrapper.sh

raspiBackupWrapper.sh Code über die Console ausführen


Der Backupvorgang dauert in etwa 10-15 Minuten. Ob das Backup fehlerfrei ist, könnt ihr einfach testen. Das Image auf eine andere SD Card schreiben (Win32Diskmanager) und in den Raspi einlegen. Bei meine Tests hat dies nun mehrmals reibungslos funktioniert. Es kommt immer darauf an, wieviele Dienste laufen. Diese sollten eben gestoppt werden.

Meldung im Backup Log und/oder Console nach Beendigung des Backupvorgangs sollte so aussehen:

20170311-083303: MSG — RBK0009I: Raspberry-Server: raspiBackup.sh V0.6.1.3b um Sa 11. Mär 08:33:03 CET 2017 gestartet
20170311-083303: MSG — RBK0128I: Logdatei ist /backups/Raspberry-Server/Raspberry-Server-dd-backup-20170311-083302/Raspberry-Server-backup.log
20170311-083303: MSG — RBK0116I: Konfigurationsdatei /usr/local/etc/raspiBackup.conf wird benutzt
20170311-083303: MSG — RBK0008I: Services werden gestoppt: ‚:‘
20170311-083303: MSG — RBK0081I: Backup vom Typ dd wird in /backups/Raspberry-Server/Raspberry-Server-dd-backup-20170311-083302 erstellt
20170311-083304: MSG — RBK0085I: Backuperstellung vom Typ dd läuft. Bitte etwas Geduld
7969+1 Datensätze ein
7969+1 Datensätze aus
7969177600 Bytes (8,0 GB) kopiert, 940,538 s, 8,5 MB/s
20170311-084847: MSG — RBK0007I: Services werden gestartet: ‚:‘
20170311-084848: MSG — RBK0010I: Raspberry-Server: raspiBackup.sh V0.6.1.3b um Sa 11. Mär 08:48:48 CET 2017 beendet
20170311-084848: MSG — RBK0017I: Backup erfolgreich beendet
Mar 11 08:48:50 raspberry-server sendEmail[19149]: Email was sent successfully!
11. Erstelltes Backup (Image) über Windows wiederherstellen

Ich nutze dafür Win32DiskImager und schreibe das erstellte Image einfach wieder auf eine zweite oder andere SD Card. Vollständige Anleitung zum raspiBackup-Script gibt es hier.
1 Punkt2 Punkte3 Punkte4 Punkte5 Punkte (5 Votes, Durchschnitt: 4,80 von insgesamt 5)
Loading...      |      Thema wurde bisher 406 mal gelesen