Zum Inhalt springen

Raspbian rescue

Ich bin ein Spielkind. Wie heisst es so schön: „Kein Backup – kein Mitleid!“ Tatsächlich existierte zwar ein Backup, aber das war klassischerweise von der Marke uralt. Das System an sich hatte ich mir zerspielt und war in der Zwischenzeit teilweise von der ursprünglichen Buster-Installation zu einem Bookworm geworden. Dann hatte ich Probleme mit libatomic beim kompilieren und eine libatomic-devel gibt es beim Raspi nicht. Das wollte ich dann irgendwie geradeziehen in dem ich für die „-latomic“  bzw. „error: undefined reference to ‚__atomic_store_8′“ mir den gcc neu baue. Dabei habe ich mir dann die libc.6.so zerschossen und danach geht dann eigentlich so gut wie nichts mehr.

Ja, ja sowas macht man nicht. Jetzt ist es so, dass ein Raspberry-Image im Prinzip alle Daten löscht. Das fand ich äusserst unattraktiv. Auf dem System ist im Dualboot libreelec mit drauf und Noobs ist installiert. Noobs könnte zwar mit Shift Buster wieder drüberbügeln, aber auch das gefiel mir nicht.

Bullseye war in der Zwischenzeit seitdem 30.10.2021 offiziell geworden und damit gäbe es ja sauber Libraries um die zerschossen libc wieder gerade zu ziehen und alle Daten zu behalten. Nur wie rankommen?

2021-10-30-raspios-bullseye-armhf-full.img heruntergeladen  und dann:
udisksctl loop-setup –file ./ 2021-10-30-raspios-bullseye-armhf-full.img –read-only
lsblk -o name,label /dev/loop0
mount -o ro /dev/loop0p2 ./raspios/rootfs
mount -o ro /dev/loop0p1 ./raspios/boot

wunderbar alles da, was ich brauche um das System zu reparieren.
In meinem Fall liegt Raspiban in der Partition 6 und Partition 7 der SD-Karte. Unter Linux dann /dev/sdb6 für boot und /dev/sdb7 für root bzw. auf dem Raspi /dev/mmcblk0p6 und /dev/mmcblk0p7
Da lib und bin eh kaputt waren und das bei bullseye symbolische links auf /usr/lib und /usr/bin sind habe ich die dann nachdem ich root gemountet hatte einfach gelöscht.
mount /dev/sdb7 /var/media/root
cd /var/media/root
rm lib
rm bin
cd /raspios/rootfs
tar cf – * | (cd /var/media/root && tar xf -)

Danach ist bullseye auf der Platte, das startet aber dann noch nicht, weil die fstab überschrieben wurde. Dort steht für root die UUID vom Image drin. mit blkid die UUID von boot und root des Originalsystems ermitteln und die entsprechenden UUID in der fstab eintragen. boot habe ich gar nicht rüberkopiert, weil ich meine config.txt behalten wollte und eigentlich bootete das System noch flog aber wegen fehlender libc.6.so auf die Schnauze.

Nachdem ich das so gemacht hatte, bootete das System wieder und begrüsste mich mit einem Einrichtungsbildschirm. Aus welchen Gründen auch immer mochte er aber bluetooth dann nicht und mit einer Kabeltastatur hätte ich wohl auch ein Passwort setzen können usf. eine kabelgebundene Tastatur hatte ich ich aber gerade nicht parat. Da libreelec aber normal mit Tastatur bzw. ssh startete (ach ja mit dem wlan verband er sich nach dem drüberbügeln auch nicht weil die wpa_supplicant-Config natürlich auch überschrieben war)  – machte ich die restliche Konfiguration über chroot unter Libreelec.

Zunächst wollte das System nicht in chroot gehen, da lib nach usr/lib verlinkt ist statt auf ./usr/lib klappte aber dann nach Änderung des Links proc,sys,dev usf vorher von libreelec reingemounted also
mount /dev/mmcblk0p7 /storage/chrootedraspian
mount /dev/mmcblk0p6 /storage/chrootedraspian/boot
cd /storage/chrootedraspbian
mount -t devtmpfs devtmpfs dev 
mount -t proc proc proc
mount -t sysfs sysfs sys
mount -t tmpfs tmpfs run
mount -t devpts devpts dev/pts
mount -t tmpfs tmpfs sys/fs/cgroup 
mount -t mqueue mqueue dev/mqueue
mount -t tmpfs tmpfs tmp
chroot /storage/chrootedraspbian bash
mount -a
apt update
apt upgrade

und dann ein paar Configdateien editieren, die ich mir durch das drüberbügeln zerschossen habe wie die /etc/wpa_supplicant/wpa_supplicant.conf damit er beim Neustart dann auch gleich in das wlan geht.
System wiederhergestellt ohne die SD-Karte neu formatieren zu müssen und damit auch libreelec neu installieren zu müssen. Das war ja vollkommen in Ordnung und nur weil ich das eine System kaputtgespielt habe, wollte ich das anderes System nicht auch verlieren dadurch.