Dies ist eine Zusammenfassung bestehender Artikel (Quellen: siehe unten) mit dem Ziel auf einem Raspberry Pi 4 von einer Festplatte via USB zu starten.
Ausgangsbasis ist ein frisches Raspbian Image auf einer Speicherkarte und ein Ubuntu Image auf einer USB Platte.
Einspielen der letzten Updates, auch das neueste EEPROM image
—-
pi@raspberry:~ $ sudo su -
root@raspberry:~ # apt update
root@raspberry:~ # apt upgrade -y
root@raspberry:~ # rpi-update
root@raspberry:~ # shutdown -r now
Nach dem Neustart wird jetzt der Bootloader auf die aktuellste Version ausgetauscht.
pi@raspberry:~ $ sudo apt install rpi-eeprom -y
Ändern der Preferenzen bzgl. der Firmware
pi@raspberry:~ $ sudo sed -i `s/critical/stable/g` /etc/default/rpi-eeprom-update
Installation des neuesten Bootloaders
pi@raspberry:~ $ sudo sed -i `s/critical/stable/g` /etc/default/rpi-eeprom-update
pi@raspberry:~ $ sudo reboot
Nach dem Neustart mit dem neuen Bootloader kann man den aktuellen Status überprüfen.
pi@raspberry:~ $ vcgencmd bootloader_version
(Hier wird in der ersten Zeile das Datum der Erstellung des Bootloaders ausgegeben. Jul 16 2020)
pi@raspberry:~ $ vcgencmd bootloader_config
(Hier ist vor allem die letzte Zeile interessant. Sie gibt Auskunft über die Startreihenfolge. Sie sollte im konkreten Fall 0xf41 sein. Mehr dazu in der Doku)
Einhängen der USB Platte in das aktuelle Dateisystem und kopieren der relevanten Daten.
pi@raspberry:~ $ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2
Wir brauchen sda1 – das ist die Boot Partition des USB Ubuntu und sda2 ist die Basis Partition des USB Ubuntu. Zuerst müssen die entsprechenden Verzeichnisse auf der Speicherkarte vorbereitet werden und dann kann eingehängt und kopiert werden.
pi@raspberry:~ $ sudo mkdir -p /mnt/usb/base
pi@raspberry:~ $ sudo mount /dev/sda1 /mnt/usb
pi@raspberry:~ $ sudo mount /dev/sda2 /mnt/usb/base
pi@raspberry:~ $ sudo cp /boot/*.elf /mnt/usb
pi@raspberry:~ $ sudo cp /boot/*.dat /mnt/usb
Im nächsten Schritt müssen wir die Umgebung noch etwas vorbereiten, damit ein Start auch wirklich automatisch geht. Entpacken des Kernels
pi@raspberry:~ $sudo zcat /mnt/usb/vmlinuz > /mnt/usb/vmlinux
Anpassen der Konfiguration (/mnt/usb/config.txt)
[pi4]
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel
Im Verzeichnis /mnt/usb noch ein Skript zum automatischen packen und entpacken der verschiedenen Kernelversionen.
pi@raspberry:~ $sudo vi /mnt/usb/auto_decompress_kernel
#!/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
Das Skript muss ausführbar gemacht werden
pi@raspberry:~ $ sudo chmod +x /mnt/usb/auto_decompress_kernel
Ein kleines Startscript zur Starthilfe brauchen wir auch noch.
pi@raspberry:~ $ sudo vi /mnt/usb/base/etc/apt/apt.cond.d/999_decompress_rpi_kernel
(Pfad aktualisiert: 20200813 – ssc)
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };
Damit das Skript auch läuft
pi@raspberry:~ $ sudo chmod +x /mnt/usb/base/apt/apt.conf.d/999_decompress_rpi_kernel
Nach einem Neustart ohne Speicherkarte ist ein frisches Ubuntu verfügbar.
——
Quellen:
https://www.raspberrypi.org/forums/viewtopic.php?t=278791
https://tynick.com/blog/05-22-2020/raspberry-pi-4-boot-from-usb/
https://github.com/raspberrypi/rpi-eeprom
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md