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
Usage: pishrink.sh [-sd] imagefile.img [newimagefile.img]

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
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 pi-backup-16gb-shrinked.img.zip
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

Das Image schreibe ich jetzt 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.

Der Haken…

Das zurückgeschriebene verkleinerte System wird leider nicht automatisch vergrößert. Das ist nur für eine frische Installation auf eine SD-Karte gedacht.
Lässt sich z.B. mit GParted aber schnell korrigieren, damit der komplette Speicherplatzt des Sticks wieder genutzt werden kann. (Partition vergrößern)

Vorsicht!

Mit dd und gparted, gibt man hier 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. ;)

Schreibe einen Kommentar