Raspberry Pi Backup Image mit PiShrink verkleinern

Mein Backup Image eines 16GB USB-Sticks einer Raspbian Installation kann nicht auf einen anderen 16GB USB-Stick wiederhergestellt werden.
Der andere Stick (gleiches Modell) hat leider ein paar Byte weniger Speicherkapazität, geht also nicht! :(

Die Lösung für das Problem ist PiShrink, damit lassen sich erstellte Image Dateien problemlos verkleinern.
PiShrink ist ein Bash Skript, das automatisch ein Raspberry Image auf eine minimale Größe schrumpft.

PiShrink installieren

Das Skript lade ich mir nach /opt/pishrink.

$ mkdir /opt/pishrink
$ cd /opt/pishrink
$ wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
$ chmod +x pishrink.sh

# das Programm mal aufrufen
$ ./pishrink.sh
pishrink.sh v0.1.2
Usage: sudo pishrink [-sdrpzh] imagefile.img [newimagefile.img]
  -s: Don't expand filesystem when image is booted the first time
  -d: Write debug messages in a debug log file
  -r: Use advanced filesystem repair option if the normal one fails
  -p: Remove logs, apt archives, dhcp leases and ssh hostkeys
  -z: Gzip compress image after shrinking

Image erstellen

Den Gerätenamen des USB-Sticks ermitteln. In meinem Fall ist er sdc.

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 238,5G  0 disk 
├─sda1   8:1    0   128M  0 part 
├─sda2   8:2    0   450M  0 part 
├─sda3   8:3    0   100M  0 part /boot/efi
├─sda4   8:4    0 115,3G  0 part 
└─sda5   8:5    0 122,5G  0 part /
sdc      8:32   1  14,7G  0 disk
├─sdc1   8:33   1   256M  0 part 
└─sdc2   8:34   1  14,1G  0 part /run/media/butch/rootfs

Ein Image des USB-Sticks erstellen und ihn danach wieder auswerfen.

$ dd if=/dev/sdc status=progress of=pi-backup-16gb.img
15719055872 bytes (16 GB, 15 GiB) copied, 152 s, 103 MB/s 
30883840+0 Datensätze ein
30883840+0 Datensätze aus
15812526080 bytes (16 GB, 15 GiB) copied, 152,928 s, 103 MB/s

Das erstellte Image jetzt mit PiShrink verkleinern.

$ ./pishrink.sh pi-backup-16gb.img pi-backup-16gb-shrinked.img
pishrink.sh v0.1.2
Copying pi-backup-16gb.img to pi-backup-16gb-shrinked.img......
Gatherin data...
Creating new /etc/rc.local
Checking filesystem...
rootfs: 44665/884112 Dateien (0.1% nicht zusammenhängend), 396376/3686400 Blöcke
resize2fs 1.44.6 (5-Mar-2019)
Shrinking filesystem...
resize2fs 1.44.6 (5-Mar-2019)
Die Größe des Dateisystems auf /dev/loop0 wird auf 494174 (4k) Blöcke geändert.
Start von Durchgang 2 (max = 24592)
Blöcke werden verschoben XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Start von Durchgang 3 (max = 113)
Die Inode-Tabelle wird gelesen XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Start von Durchgang 4 (max = 4352)
Die Inode-Referenzen werden aktualisiert XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Das Dateisystem auf /dev/loop0 is nun 494174 (4k) Blöcke lang.

Shrinking image...
Shrunk pi-backup-16gb-shrinked.img from 15G to 2,2G...

Ergebnis: von 15 Gig auf 2,2 Gig geschrumpft, perfekt! :)

$ ls -lh
-rw-r--r--. 1 root  root   15G 19. Aug 17:22 pi-backup-16gb.img
-rw-r--r--. 1 root  root  2,2G 19. Aug 17:29 pi-backup-16gb-shrinked.img

Zippen wir die Image Datei jetzt noch, wird sie nochmal kleiner.

$ zip pi-backup-16gb-shrinked.img.zip pi-backup-16gb-shrinked.img
adding pi-backup-16gb-shrinked.img (deflated 66%)

$ ls -lh
-rw-r--r--. 1 root  root  2,2G 19. Aug 17:29 pi-backup-16gb-shrinked.img
-rw-r--r--. 1 root  root 747M 19. Aug 17:35 pi-backup-16gb-shrinked.img.zip

Image zurückschreiben

Das Image schreibe ich jetzt mit dd wieder auf den “etwas kleineren” 16GB Stick. ;)

$ dd if=pi-backup-16gb-shrinked.img status=progress of=/dev/sdc bs=1M; sync
1203765248 bytes (1,2 GB, 1,1 GiB) copied, 1 s, 1,2 GB/s
2194+1 Datensätze ein
2194+1 Datensätze aus
2300961280 bytes (2,3 GB, 2,1 GiB) copied, 1,40107 s, 1,6 GB/s

Der Pi bootet anstandslos vom erstellten Stick.

Das Image läßt sich auch mit dem Win32 Disk Imager oder Etcher auf einen USB-Stick oder microSD Karte übertragen.
Nach dem ersten booten, wird das System wieder automatisch vergrößert. (getestet mit Raspbian Buster)

Vorsicht!

Gibt man mit dd nicht das richtige Device an, hat man sich schnell die falsche Festplatte überschrieben. (z.B. sda anstelle von sdc)
Ich will es nur gesagt haben. ;)

6 Gedanken zu „Raspberry Pi Backup Image mit PiShrink verkleinern“

  1. Hi.

    Sehr interessanter Artikel, danke!
    Ich werde das demnächst selbst mal ausprobieren.

    Eine Frage hätte ich da noch:
    Kann das geschrumpfte Image auch in Windows per Win32 Disk Imager oder Etcher auf die SD Karte gespielt werden?
    Oder geht das Wiederherstellen nur über den beschriebenen Weg?

    Antworten
  2. Funktioniert und funktioniert nicht.
    Habe 4 Tage an Ostern mit der Ursache verbracht: Wer NOOBS oder PINN als Multiboot und Repair Plattform nutzen wird, kann sich das hier ersparen. Es gibt den Fehler overlapping partitions und skript steigt aus. Betrifft alle Pi Modelle und mit 5 SD Karten probiert.

    Ich hatte meinen 2018 erworbenen Vorrat an 8 GB SD Karten aufgebraucht und war nun mit neuen SD Karten auf die Schnauze gefallen, weil beim Image auf SD Karte kopieren der Fehler kam, die neue sei minimal zu klein. Resultat war die Suche nach einem Image Shrinker, denn mein 8 GB Image war nur zu 80% gefüllt, aber es es scheiterte an ein paar KB.

    Von daher mit großen Hoffnungen gestartet, mein altes Image so zu verkleinern, dass es auch auf meine neuen 8GB SD Karten passt, doch nach über 30 Stunden mit Fehlversuchen und Ursachensuche bleibt festzuhalten, dass es mit RASPBIAN installiert via NOOB oder PiNN nicht klappen wird. Und die beiden Lösungen bieten halt vieles, was dem RASPBIAN fehlt u.a. eine Recovery Shell und parallel Installationen wie auf unserem TV Pi, der zum einen als Libre Elec KODI meistens läuft und nur manchmal im Raspbian bootet.

    Dennoch Danke – mag sein, dass sich pishrink und Pinn Autoren noch um eine Lösung kümmern, da ich den Fehler dort “eingetütet” habe, obschon vermutlich NOOBS zu ändern ist, was wiederum von der Raspberry Foundation kommt, die sich wohl nicht an Regeln hielt. PiNN ist eine Weiterentwicklung von NOOBS, aber basiert eben auch in Kernfunktionen auf NOOBS.
    Von daher besteht noch Hoffnung.

    Antworten

Schreibe einen Kommentar zu Peter Antworten abbrechen