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:

1FIRMWARE_RELEASE_STATUS="stable"
Note

Die vorherige Einstellung, critical, installiert nicht die neueste Firmware!

Anschließend kann die neue Firmware installiert werden:

1# rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
Note

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:

1$ 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$_}' )
Note

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:

1$ cd mountpoint
2$ 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:

1[pi4]
2kernel=uboot_rpi_4.bin
3max_framebuffers=2
4dtoverlay=vc4-fkms-v3d
5boot_delay
6kernel=vmlinux
7initramfs initrd.img followkernel

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

 1#!/bin/bash -e
 2
 3# set Variables
 4BTPATH=/boot/firmware
 5CKPATH=$BTPATH/vmlinuz
 6DKPATH=$BTPATH/vmlinux
 7
 8# check if compression needs to be done.
 9if [ -e $BTPATH/check.md5 ]; then
10  if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
11    echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
12    exit 0
13  else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
14  fi
15fi
16
17# backup the old decompressed kernel
18mv $DKPATH $DKPATH.bak
19
20if [ ! $? == 0 ]; then
21  echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
22  exit 1
23else echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
24fi
25
26# decompress the new kernel
27echo "Decompressing kernel: "$CKPATH".............."
28
29zcat $CKPATH > $DKPATH
30
31if [ ! $? == 0 ]; then
32  echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
33  exit 1
34else echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
35fi
36
37#hash the new kernel for checking
38md5sum $CKPATH $DKPATH > $BTPATH/check.md5
39
40if [ ! $? == 0 ]; then
41  echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
42else echo -e "\e[32mMD5 generated Succesfully\e[0m"
43fi
44
45# exit
46exit 0

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

1$ 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:

1$ cat /etc/apt/apt.conf.d/999_decompress_rpi_kernel
2# content 999_decompress_rpi_kernel
3DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };
4
5$ chmod +x $_

Anschließend sollte Booten kein Problem mehr sein.

Übersetzungen: