[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.

  • Hallo, ich bin neu hier und habe eine Frage.


    Habe mir vor kurzen eine Retropiebox bestellt da ich selber nicht der Computerfachmann bin. Alles soweit so gut passt auch alles jetzt wollte ich mir aber vorsichtshalber doch eine Kopie der SD Karte auf den Pc hinterlegen (Sollte doch mal was sein). Mein Problem ist das ich es nicht schaffe, da er immer die SD Karte überschreiben will.

    Ich steck die SD Karte rein danach fragt er mich formatieren ich drück auf abbrechen.

    Dann starte ich Win32 Disk Imager und danach komm ich nicht weiter.


    Ich habe mir zwar am Pc einen Ordner erstellt wo ich das ganze reinkopieren will kann aber nur Daten auswählen und wenn ich die SD Karte wähle frägt er mich ob ich überschreiben will. Aber ich will ja nichts überschreiben ich will nur ein Abbild der SD Karte am PC.


    Kann mir bitte jemand helfen?

  • Ich nehme mal an, Du hast am PC Windows? Da es ein Linux Dateisystem ist, kann die SD Karte nur Teilweise gelesen werden (die Partitionen die zB FAT sind). Wenn Du ein Linux verwendest, sollte es besser klappen. Du kannst auch Linux Live CDs verwenden...

    ...wenn Software nicht so hard-ware ;-) ...

    Freue mich über jeden like :thumbup:

  • Ich steck die SD Karte rein danach fragt er mich formatieren ich drück auf abbrechen.

    Dann starte ich Win32 Disk Imager und danach komm ich nicht weiter.

    Die Frage nach dem Formatieren beantwortest Du bitte mit „Abbrechen“, Windows ist nur zu doof, auf die Daten der ext4 Partition(en) zuzugreifen.

    Du startest Win32DiskImager, wählst im Dateifeld den Ort und Dateinamen der zu erstellenden Sicherungsdatei (bitte ein „.img“ -ohne Anführungszeichen- ans Ende, das macht’s nicht selbst) und drückst auf „Read“. Jetzt wird eine Imagedatei erzeugt mit dem kompletten Inhalt der mSD Karte. Die kannste dann am Ende mit z.b. 7zip packen, im Original ist sie genau so groß wie die SD Karte - egal wieviel Platz darauf tatsächlich genutzt ist.

  • Das geht schon auch unter Windows mit dem Win32 Disk Imager. Auf die richtige Bedienung kommt es an! Man muss nur rechts oben sein Device auswählen – also den Laufwerksbuchstaben unter dem die Karte eingehängt ist. Dann noch einen Namen für das Backup-Image vergeben und unten auf "Read" klicken.


    Da war jemand schneller … ^^

  • Hi,

    vielen Dank für den interessanten Artikel.


    Mein Raspberry erstellt ebenfalls mitten in der Nacht seine Backups.


    Dazu gehört auch ein Komplettbackup vom SD-Karten-Image.

    Als Backup nutze ich Subversion, welches von Haus aus incremental arbeitet.

    Da meine SD-Karte im Wesentlichen nur das System, aber keine User-Daten trägt, sind die täglichen Änderungen minimal.

    So ist auch das gesamte Archiv verhältnismäßig gering, dennoch kann ich auf die täglichen Backups der letzten zwei Jahre zurückgreifen.


    Aber da ich das Image archiviere, werden tatsächlich auch gelöschte Bereiche archiviert. Diesen Gedanken hatte ich noch gar nicht...

    Da gefällt mir die Idee, alles was gelöscht ist, mit Nullen zu überschreiben. Diese Idee werde ich dankenswerterweise übernehmen.


    Aber um die SD-Karte zu schonen, ist meine spontane Idee, zuerst ein Image der SD-Karte auf meine HDD zu kopieren,

    das Image dann zu mounten, und dann dieses Image mit Nullen aufzufüllen. Das beschäftigt dann nur die HDD, der Schreiboperationen egal sind.


    Inzwischen bin ich begeistert von Subversion als Backup. Subversion bietet aufgrund der incrementellen Speicherung den Charm,

    über einen langen Zeitraum jeden Zustand wieder herstellen zu können.

    Das Erstbackup ist sicherlich nicht so speichersparend wie ZIP, das Speichern sämtlicher täglichen Zip-Dateien würde dagegen

    ein Vielaches des Speicherplatzes benötigen.

  • Inzwischen bin ich begeistert von Subversion als Backup. Subversion bietet aufgrund der incrementellen Speicherung den Charm,

    über einen langen Zeitraum jeden Zustand wieder herstellen zu können.

    Hm... Subversion als Backup-Programm... kann man machen :-)


    Subversion ist ein VCS (Version-Control-Software).


    Meine eigentliche Frage: Warum Subversion und nicht Git?

  • Kann man bei der ersten vom Thread-Starter vorgeschlagenen Variante mit DD nicht folgendes machen?


    Erstellung von sda (z.B. mit Ubuntu Live Stick):

    Code
    1. sudo su
    2. dd if=/dev/sda | gzip > ./datei_name.img.gz


    Herstellung von sda (z.B. mit Ubuntu Live Stick):

    Code
    1. sudo su
    2. gzip -cd ./Datei_name.img.gz | dd of=/dev/sda

    Das eigentliche 64GB Laufwerk wurde hier auf eine ~ 11GB Datei geschrumpft.


    Gruß

  • Hallo migoelo,


    willkommen im Forum!


    Je nachdem wie voll das Laufwerk ist und wie komprimierbar die Daten darauf sind ist die Aussage 64 GB auf 11 GB imho nicht sehr aussagekräftig.


    Hier im Topic oder bei pishrink sind die Ergebnisse auch von der Datenmenge abhängig. Da zitiere ich mich mal selbst:

    Das hatte ich am Wochenende erledigt: 12 Images ~ 160 GB vorher, jetzt ~ 35 GB

    Und das sind noch unkomprimierte Ergebnisse, die man dann noch "zippen" könnte. ;)

    "Alles, was wir sind, ist Sand im Wind, Hoschi."

  • Ja Sorry, die Angabe der Größe war hier etwas nichtssagend, ich wollte hier eigentlich den Schalter gzip hervorheben, im Zusammenhang mit DD.