Dieser Post beschreibt, wie Sie einen laufenden Raspberry Pi automatisch als Image-Datei auf einem NAS im Netzwerk sichern.
Für mehr Posts über den Raspberry Pi siehe: Raspberry Pi
Einer meiner Raspberry Pis ist essentiell in meinem Home-Setup. Er hostet git, meinen Jenkins, meinen VPN Server und vieles mehr. Ich würde Tage brauchen (zum Beispiel falls die SD-Karte versagt) alles wieder zum Laufen zu bringen. Also habe ich ein automatisches Backup eingerichtet, das den aktuellen Stand als Image-Datei auf mein NAS kopiert. Damit kann ich im Notfall eine neue SD Karte flashen und alles funktioniert wieder.
Das Backup läuft einmal pro Woche, ausgelöst durch meinen Jenkins-Server. Aber ein Cronjob würde es auch tun.
Page Contents
Das Script
Alles wird in einem Skript erledigt, das von jenkins gestartet wird, der Inhalt ist folgender:
sudo mount -t nfs -o soft 192.168.2.132:/path/on/nas /home/user1/nas
sudo dd if=/dev/mmcblk0 of=/home/user1/nas/pi.img bs=1M
sudo pishrink.sh -z /home/user1/nas/pi.img
sudo mv /home/user1/nas/pi.img.gz /home/user1/nas/pi_`date +"%F"`.img.gz
umount -f -l /home/user1/nas
Die erste Zeile mountet einen Ordner um das Image zu speichern auf dem NAS. Wenn das NAS dauerhaft auf dem Pi gemountet ist kann dieser Schritt übersprungen werden.
Die zweite Zeile kopiert die gesamte SD Karte in ein Image in den gemounteten Ordner. Dies würde bereits für die Sicherungs- / Wiederherstellungsprozedur ausreichen.
Die dritte Zeile verkleinert das neu erstellte Image mit einem netten Script, das hier verfügbar ist: https://github.com/Drewsif/PiShrink
Dadurch wird das Image deutlich kleiner.
In the fourth line the newly created verkleinerte Image umbenannt damit es das Backup Datum enthält.
Finally the nas mount is removed again.
Das Verfahren ist das gleiche, wenn Sie ein Image für eine schnellere Einrichtung von Raspberry Pis erstellen möchten, siehe auch Erstelle dein eigenes Image für den Raspberry Pi.
Verhalten
Der PI enthält eine 64 GB SD-Karte, von der derzeit 12 GB verwendet werden. Die Größe des verkleinerten Images beträgt 5,9 GB.
Die Ausführung des Skripts dauert ungefähr 58 Minuten (dies kann für die Jenkins-Timeout-Konfigurationen wichtig sein).
You could dramatically improve efficiency and more than half total bits transferred over the network by piping the workload with the following command to replace the last 3 lines in your original script:
dd if=if=/dev/mmcblk0 | bzip2 –best > /home/user1/nas/pi_`date +”%F”`.img.bz2
or if you are more fond of gzip (for lesser but faster compression) by:
dd if=if=/dev/mmcblk0 | gzip –fast > /home/user1/nas/pi_`date +”%F”`.img.gz
Good luck and let me know how you fare?
I tried that: it took around 30% less time (45 minutes compared to 65 minutes) but the image takes around 900MB more space (6.6 GB vs. 7.5 GB).
I have not yet tested how it will behave when image is used for SD card flash
Oops I made a type “if=if=” should be just one time “if=”.
Interesting read about how much gzip streaming zip reduces total transfer time (wire time):
http://henry.precheur.org/web/http_compression
It’s about 36%.
Hi Benni,
I revisited your imaging script which is started by Jenkins.
My previous advice will not work with “prishrink.sh”. It shrinks the filesystem in the image filedown to the actually populated part of the the filesystem. It can’t do that on a gzip’ed image file. Therefor your image took around 900MB more space.
I assume that the script is executed on your RPi and I assume it’s a multicore Pi (version 4?).
Is that correct?
The best strategy to speed things up is to reduce wire time (bits in transit over the 100Mbit network connection to the NAS).
Does your Pi have enough storage space (flash drive etc.) to operate on the image of your entire microSD card?
Let me know, then I can work out a faster strategy.