Das Raspbian bring von haus aus bereits alles mit, um die Root-Partition zu vergrössern.
Was aber, wenn ein Image z.B. von einer 32GB Karte auf eine 16GB Karte übertragen werden soll ?!?
Ich hab sowas schon öfter gemacht, Sektor Sizes, Beginn und Ende der Partitionen herumgerechnet, dann verkleinert, und schliesslich alles wieder zusammengesetzt. Aber es geht auch einfacher.
Der erste Trick versteckt sich im „-P“ Parameter. Dadurch werden auch für die Partitionen loop devices angelegt :
losetup /dev/loop0 -v -P EntpacktesImage.img
-> Jetzt gibt es ein loop0, loop0p1 und ein loop0p2 !!
Der nächste Trick besteht darin, dass mindestens eine Partition gemountet bleiben muss, sonst „verschwinden“ die Partition loop devices :
mkdir -p /mnt/1
mount /dev/loop0p1 /mnt/1
Danach erst darf die autogemountete 2. Patition ausgehängt werden :
umount /dev/loop0p2
Filesystem repair + Verkleinern :
e2fsck -f /dev/loop0p2
resize2fs /dev/loop0p2 10G
Loop Device wieder aushängen :
losetup -d /dev/loop0
Anmerkung :
1) Das Image kann dann – am besten unter Linux mit dd – auf eine kleinere Karte geschrieben werden.
Wie zu erwarten – tritt natürlich beim Schreiben eine Fehlermeldung auf „no space left on device“ …
Diese kann ignoriert werden. danach mit fdisk die root Partition wieder löschen und neu anlegen – auf die volle Grösse.
(oder alternativ – einfach den PI mit der neuen Karte starten, und dann mit raspi-config die Partition wieder vergrössern)
2) Unter Windows mit Win32Diskimager kann die Datei NICHT geschrieben werden. Denn das image hat noch die ursprüngliche Grösse, und dieses Programm lässt das nicht zu….