Linux OSBN/Ubuntuusers Planet XING / LinkedIn / Amazon

Raspberry Pi 4: Ubuntu 20.04 via USB booten

Seit einiger Zeit ist der Raspberry Pi 4 in der Lage auch via USB zu booten und somit die fehleranfällige SD-Karte als System-Medium zu umgehen. Im Mai stand die Funktion erstmals als Beta zur Verfügung, seit September gilt sie stabil nutzbar.

Der Boot von Raspberry Pi OS (ehemals Raspbian) über USB gelingt auf Anhieb, während es bei der aktuellen Ubuntu LTS-Version 20.04 noch einige Kniffe zu beachten gilt.

Bevor eine Ubuntu-Installation über USB gebootet werden kann, muss das EEPROM des Einplatinenrechners über eine Raspberry Pi OS-Installation aktualisiert werden. Hier sollten zunächst alle verfügbaren Updates installiert und das Gerät neugestartet werden, bevor die Konfigurationsdatei /etc/default/rpi-eeprom-update angepasst wird:

FIRMWARE_RELEASE_STATUS="stable"
Die vorherige Einstellung, critical, installiert nicht die neueste Firmware!

Anschließend kann die neue Firmware installiert werden:

# rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
Zum Zeitpunkt der Erstellung des Artikels war die Firmware vom 03.09.2020 aktuell.

Nach einem weiteren Neustart ist die neue Firmware aktiv.

In der Zwischenzeit kann das Ubuntu 20.04-Abbild für den Raspberry Pi auf ein USB-Gerät übertragen werden, beispielsweise mit balenaEtcher oder Win32DiskImager. Bevor das Medium jedoch bootfähig ist, müssen noch fehlende Bootloader-Dateien ergänzt werden. Diese können wie folgt heruntergeladen werden:

$ wget $( wget -qO - https://github.com/raspberrypi/firmware/tree/master/boot | perl -nE 'chomp; next unless /[.](elf|dat)/; s/.*href="([^"]+)".*/$1/; s/blob/raw/; say qq{https://github.com$_}' )
Kudos an Richard Tirtadji für den Einzeiler und das folgende Skript!

Anschließend werden die *.dat und *.elf Dateien auf die FAT-Partition des USB-Geräts kopiert (wird später als /boot/firmware) eingehängt.

Bei dieser Gelegenheit wird das komprimierte Kernel-Abbild entpackt, da die Raspberry Pi-Firmware derzeit nur von unkomprimierten Images booten kann:

$ cd mountpoint
$ zcat vmlinuz > vmlinux

Im gleichen Ordner muss auch noch die Datei config.txt angepasst werden, damit das Abbild gefunden wird. Für meine Installation waren dafür die folgenden Zeilen vonnöten:

[pi4]
kernel=uboot_rpi_4.bin
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

In diesem Zug wird auch gleich ein Skript (auto_decompress_kernel) erstellt, welches automatisch komprimierte Images entpackt:

#!/bin/bash -e

#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux

#Check if compression needs to be done.
if [ -e $BTPATH/check.md5 ]; then
	if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
		echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
		exit 0
	else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
	fi
fi

#Backup the old decompressed kernel
mv $DKPATH $DKPATH.bak

if [ ! $? == 0 ]; then
	echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
	exit 1
else echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi

#Decompress the new kernel
echo "Decompressing kernel: "$CKPATH".............."

zcat $CKPATH > $DKPATH

if [ ! $? == 0 ]; then
	echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
	exit 1
else echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi

#Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5

if [ ! $? == 0 ]; then
	echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
else echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi

#Exit
exit 0

Damit das Skript auch ausgeführt werden kann, werden die Dateiberechtigungen angepasst:

$ chmod +x auto_decompress_kernel

Am sinnvollsten ist es, das Skript nach dem ersten Boot mit der apt-Paketverwaltung zu verknüpfen, damit ausgelöste Kernel-Updates das neue Abbild automatisch entpackt. Hierzu wird eine Datei /etc/apt/apt.conf.d/999_decompress_rpi_kernel erstellt und ausführbar gemacht:

$ cat /etc/apt/apt.conf.d/999_decompress_rpi_kernel
# content 999_decompress_rpi_kernel
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };

$ chmod +x $_

Anschließend sollte Booten kein Problem mehr sein.

Sharing is caring

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.