[Trick] Backup einer SD-Karte mit möglichst wenig Speicherplatzverbrauch.

  • Hallo Leute,

    heute möchte ich euch einen Trick vorstellen, wie ihr ein möglichst kleines Image, von eurer SD-Karte erstellen könnt.


    Vorbemerkung

    Ich wollte meine Raspbian-Installation sichern. Der wohl einfachste Weg ist es, ein Image von der SD-Karte zu erstellen. Dazu nutzt man unter Linux den dd-Befehl und unter Windows kann man das Programm "Win32 Disk Imager" verwenden (Link siehe unten). Mein Problem ist, dass ich eine 16 GB SD-Karte verwende (hatte leider keine kleinere gefunden) und obwohl ich davon nur 1,9 GB verwende ist das erstellte Image (Prinzip bedingt) trotzdem 16 GB groß. Was auf einer SSD schon weh tut ;-)

    Ich hatte versucht das Image mit "zip" zu komprimieren - doch die erzeugte zip-Datei war trotzdem 13,7 GB groß. Aber mit einem Trick konnte ich die Zip-Datei auf 1,4 GB verkleinern.


    Hintergrundwissen

    Wenn ihr auf der Platte eine Datei löscht, dann ist sie nicht wirklich weg - sie wird nur aus dem Verzeichnis der verfügbaren Dateien gelöscht - sämtliche Daten sind noch vorhanden (diese Tatsache nutzen auch die ganzen Wiederherstellungsprogramme). Beim späteren zip-Prozess ist es dem zip-Programm aber egal, ob die Daten zu einer verfügbaren Datei gehören oder nicht. Es sieht nur Bits und Bytes und versucht sie so gut wie möglich zu komprimieren.

    Der Trick ist nun, den freien Speicherplatz mit Nullen aufzufüllen, dies kann dann das Zip-Programm beim späteren Zip-Prozess, sehr gut komprimieren.


    Vorbereitung auf dem Pi

    Als erstes wollen wir feststellen wie viel freien Speicherplatz wir noch haben. Das können wir mit dem Befehl df -h erreichen. Bei mir sieht es wie folgt aus:

    Code
    1. pi@raspberrypi:~ $ df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/root 15G 1.9G 13G 14% /
    4. devtmpfs 214M 0 214M 0% /dev
    5. tmpfs 218M 0 218M 0% /dev/shm
    6. tmpfs 218M 17M 201M 8% /run
    7. tmpfs 5.0M 4.0K 5.0M 1% /run/lock
    8. tmpfs 218M 0 218M 0% /sys/fs/cgroup
    9. /dev/mmcblk0p1 63M 22M 42M 34% /boot


    Man sieht also, dass ich unter root "/" noch 13 GB freien Speicherplatz habe. Den möchte ich nun so gut wie möglich mit Nullen auffüllen. Dazu erzeuge ich eine möglichst große Datei, die nur aus Nullen besteht. Die Datei darf aber nicht den ganzen freien Speicher verbrauchen, sonst kann das System einfrieren oder abstürzen. Die Datei erzeuge ich mit dem Befehl dd. Ich habe mich für eine Dateigröße von 12 GB entschieden - um noch genügend Luft zu haben - bezüglich auch der GB <> GiB Konvertierung.

    Der dazugehörender Befehl lautet (der Vorgang dauerte bei mir auf dem Pi 1 und einer rel. schnellen Sandisk SD-Karte ca. 15 Minuten):

    Code
    1. dd if=/dev/zero of=remove.me bs=200M count=60


    Der Befehl erzeugt eine Datei, bestehend aus Nullen, mit einer Blockgröße von 200 MB und insgesamt 60 Blöcken.

    Kontrolle: 200 MB x 60 = 12000 MB = 12 GB


    Dies kann man auch mit dem Befehl ls -lh überprüfen. Es sieht dann so aus:

    Code
    1. pi@raspberrypi:~ $ ls -lh remove.me
    2. -rw-r--r-- 1 pi pi 12G Oct 10 16:39 remove.me


    Anmerkung: je größer die Blockgröße, desto schneller wird die Datei erzeugt. Jedoch ist die Blockgröße durch den Hauptspeicher begrenzt. Heißt: bei meinem Pi 1, mit 512 MB Ram, ist 200 MB ein guter Wert. Wer aber 1 GB Ram hat, der kann auch bs=500M probieren und dann eben den count Parameter auf 24 reduzieren. -> 500 MB x 24 = 12000 MB = 12 GB


    Überprüfen wir mal jetzt den freien Speicherplatz:

    Code
    1. pi@raspberrypi:~ $ df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/root 15G 14G 322M 98% /
    4. devtmpfs 214M 0 214M 0% /dev
    5. tmpfs 218M 0 218M 0% /dev/shm
    6. tmpfs 218M 17M 201M 8% /run
    7. tmpfs 5.0M 4.0K 5.0M 1% /run/lock
    8. tmpfs 218M 0 218M 0% /sys/fs/cgroup
    9. /dev/mmcblk0p1 63M 22M 42M 34% /boot


    Nur noch 322 MB frei :conf: Also war das mit 1 GB Luft doch keine so blöde Idee ;-)


    Da wir die erzeugte Datei nicht wirklich brauchen, löschen wir sie gleich wieder - mit:

    Code
    1. rm remove.me


    aber mit dem Vorteil, dass der Speicherplatz, den die Datei verbraucht hat, jetzt aus Nullen besteht und somit sehr gut komprimierbar ist.


    Image-Datei von der SD-Karte erzeugen.

    Nun können wir eine Image Datei von der SD-Karte erzeugen. Das geht unter Linux ganz bequem mit dem "dd"-Befehl. Der Befehl den ich benutze lautet:

    Code
    1. sudo dd if=/dev/mmcblk0 of=backup-10.10.2018-raspbian-jessie-lite-16GB.img status=progress conv=fsync


    Dabei ist /dev/mmcblk0 mein SD-Karten-Device und backup-10.10.2018-raspbian-jessie-lite-16GB.img der Image-Dateiname.


    Anmerkung: den SD-Karten-Device kann man mit dem Befehl lsblk oder mit dem Befehl sudo fdisk -l herausfinden.


    Unter Windows kann man das Image mit dem Programm "Win32 Disk Imager" erzeugen. Die entsprechende Anleitung werde ich unten verlinken.


    Das so erzeugte Image lässt sich nun mit zip sehr gut komprimieren.

    Unter Ubuntu reicht dazu ein Rechtsklick auf die Datei und dann "Komprimieren" auswählen, unter Windows wird es wahrscheinlich auch nicht viel anders sein ;-)

    Wie ich anfangs erwähnt hatte, konnte ich so das 16 GB Image auf 1,4 GB komprimiert.


    Links

    Win32 Disk Imager:

    https://sourceforge.net/projects/win32diskimager/


    Anleitung: SD-Karten-Image unter Windows erzeugen

    https://www.randombrick.de/ras…einer-sd-karte-erstellen/


    Abschließende Worte

    Ich bin selbst kein Fachmann - wollte nur die von mir gewonnene Erkenntnis mit euch teilen. Den Trick mit der "Null"-Datei, hatte ich bis jetzt in keiner der vielen Anleitungen im Netz gefunden. Über sachliche Korrekturen und Tipps würde ich mich freuen.



    Gruß

    Waldemar

  • Anstatt df -h vielleicht df -BM benutzen? Erwähnen das das voll machen mit Dateien nicht unbedingt förderlich ist für die Haltbarkeit der SD Karte. Alternative rsync Backup.


    Ich meine die Prozedur wurde hier im Forum schon erwähnt.