Netwerk booten van een Raspberry 4

Door synoniem op vrijdag 13 december 2019 22:20 - Reacties (4)
Categorie: Raspberry Pi, Views: 2.477

Mijn eerste post gaat over het netwerkbooten van de Raspberry Pi 2B, 3B en 3B+. Ik had op dat moment nog geen Raspberry Pi 4B en ik werd er al snel op gewezen dat voor de 4B het op een andere manier werkt. Inmiddels is de Sint langs geweest en heb ik een Pi 4B ontvangen hoog tijd voor een aanvulling dus.

In tegenstelling tot de voorgaande Pi's heeft de 4B geen One Time Programmable geheugen maar een echte EEPROM waarin firmware en configuratie in opgeslagen kunenn worden. Alleen had de Pi 4 bij de lancering nog geen mogelijkheid om van het netwerk te booten. Dat is pas mogelijk met de beta firmware vanaf 26 september 2019. Koop je nu op het moment dat ik dit schrijf een Pi 4B dan is de firmware hoogst waarschijnlijk nog niet up to date.

Wat heb je nodig: server
Voor de inrichting van de tftp- en nfsserver veranderd er feitelijk niets ten opzichte van mijn eerste post. Het grote verschil is dat de Pi 4 niet het bestand bootcode.bin gebruikt maar het bestand start4.elf. Daarnaast bepaald een instelling in de bootconfiguratie van de Pi waar het bestand start4.elf verwacht wordt. Standaard is dat weer in een directory met als naam het serienummer van de Pi.

Wat heb je nodig: client
Voor de client is er wat meer nodig om het werkend te krijgen. Om de firmware bij te werken en configuratie aan te passen moet je altijd eerst twee keer met een SD-kaart opstarten. En in het geval dat je Raspbian/Debian gebruikt moet dat versie 10 (Buster) zijn. Oudere versie werken volgens opgave van Raspbian niet en dit keer ben ik niet zo eigenwijs geweest het toch te proberen. Na de image op de gebruikelijke wijze op een SD-kaart gekopieerd te hebben en de Pi geboot is, werken we het systeem bij en installeren de rpi-eeprom software.
code:
1
2
3
$ sudo apt update
$ sudo apt full-upgrade
$ sudo apt install rpi-eeprom

Standaard staat rpi-eeprom zo ingesteld ingesteld dat deze alleen naar kritieke updates kijkt. Zoals gezegd is de nieuwe firmware nu nog beta en wijzigen we /etc/default/rpi-eeprom-update:
code:
1
2
3
4
5
FIRMWARE_RELEASE_STATUS="critical"

in

FIRMWARE_RELEASE_STATUS="beta"

Daarna is het tijd om de updates te controleren met in mijn geval deze mededeling:
code:
1
2
3
4
5
$ sudo rpi-eeprom-update

*** UPDATE REQUIRED ***
CURRENT: Tue 10 Sep 10:41:50 UTC 2019 (1568112110)
LATEST: Mon Nov 18 11:06:55 UTC 2019 (1574075215)

Tijd voor een update want deze versie heeft zeker nog geen netboot ondersteuning.
code:
1
2
3
4
$ sudo rpi-eeprom-update -a

*** INSTALLING REQUIRED UPDATE ***
Bootloader EEPROM update pending. Please reboot to apply the update.

Doe een reboot en controleer of Pi nu up to date is.
Dan is nu de firmware up to date maar de bootconfiguratie is nog niet veranderd. Afhankelijk of je voor de eeprom het critical of beta update channel ingesteld hebt, ga je naar /lib/firmware/raspberrypi/bootloader/critical/ of /lib/firmware/raspberrypi/bootloader/beta/. Vanaf hier gaan we eerst de huidige configuratie achterhalen, deze aanpassen naar netwerkboot en dan weer terugschrijven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ cd /lib/firmware/raspberrypi/bootloader/beta/
$ sudo cp pieeprom-2019-11-18.bin new-pieeprom.bin
$ sudo rpi-eeprom-config new-pieeprom.bin > bootconf.txt
$ cat bootconf.txt

[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=
TFTP_PREFIX=0
BOOT_ORDER=0x1
SD_BOOT_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
[none]
FREEZE_VERSION=0

$ sudo sed -i s/0x1/0x12/g bootconf.txt

$ sudo rpi-eeprom-config --out netboot-pieeprom.bin --config bootconf.txt new-pieeprom.bin
$ sudo rpi-eeprom-update -d -f ./netboot-pieeprom.bin

De bootvolgorde wordt bepaald aan de hand van de BOOT_ORDER variabele. 0x1 betekent boot van SD-kaart, 0x2 netboot. De waarde wordt van rechts naar links uitgelezen en in mijn geval wil ik eerst van het netwerk booten en dan eventueel van de SD-kaart. BOOT_ORDER wordt dan 0x12. Andersom, eerst SD-kaart en dan netwerk wordt 0x21 maar de wachttijd voordat er werkelijk gestart wordt vanaf het netwerk wordt dan behoorlijk langer.
TFTP_PREFIX bepaald waar er naar het bestand start4.elf gezocht wordt. De waarde 0 staat voor een directory met het serienummer. De waarde 2 voor een directory met het MAC adres van de netwerkinterface in de vorm van dc-a6-32-1c-5a-1a. En als laatste de waarde 1 gebruikt de tekst die je kan invullen bij TFTP_PREFIX_STR als waarde voor de directory.

Als alles goed gegaan is kun je je Pi 4 nu vanaf het netwerk booten.

Volgende: Pi Zero als smart USB-stick 4 27-12 Pi Zero als smart USB-stick 4
Volgende: Pi Zero als smart USB-stick 3 12-'19 Pi Zero als smart USB-stick 3

Reacties


Door Tweakers user i-chat, zaterdag 14 december 2019 12:49

Goede post ik ben er al een tijdje over aan het denken of netboot een alternatief is voor sd-boot omdat die vaak heel traag is en usb-boot ook geen optie is.

uiteindelijk bedacht ik me dat ik liever een bootloader van SDcard zou booten die dan vervolgens van usb zou chainloaden.

Het probleem is dat ik de kennis mis om zoiets te bouwen, het blindelings copiëren van /boot van een werkende image schijnt een oplossing te bieden maar dat vind ik een erg lelijke (en vermoedelijk erg onbetrouwbare) oplossing.

Door Tweakers user synoniem, zaterdag 14 december 2019 13:39

i-chat schreef op zaterdag 14 december 2019 @ 12:49:
Goede post ik ben er al een tijdje over aan het denken of netboot een alternatief is voor sd-boot omdat die vaak heel traag is en usb-boot ook geen optie is.

uiteindelijk bedacht ik me dat ik liever een bootloader van SDcard zou booten die dan vervolgens van usb zou chainloaden.

Het probleem is dat ik de kennis mis om zoiets te bouwen, het blindelings copiëren van /boot van een werkende image schijnt een oplossing te bieden maar dat vind ik een erg lelijke (en vermoedelijk erg onbetrouwbare) oplossing.
In de basis is dat vergelijkbaar met hoe je een Pi 2B laat netwerk booten met alleen bootcode.bin op een fat partitie. Ik heb het nog niet geprobeerd maar ik denk dat je genoeg hebt aan start4.elf, fixup4.dat, config.txt en de daarin genoemde dtb bestanden (op dit moment één) en cmdline.txt met daarin de verwijzing naar je nfs-server met kernel en gebruikersomgeving. Aan de andere kant is de hele bootpartitie (gemount onder /boot) bij mij niet groter dan 55 Mb. Lijkt me niet heel bezwaarlijk om die in zijn geheel te kopiëren.

[Reactie gewijzigd op zaterdag 14 december 2019 13:46]


Door Tweakers user i-chat, zaterdag 14 december 2019 14:00

synoniem schreef op zaterdag 14 december 2019 @ 13:39:
[...]

*............* Aan de andere kant is de hele bootpartitie (gemount onder /boot) bij mij niet groter dan 55 Mb. Lijkt me niet heel bezwaarlijk om die in zijn geheel te kopiëren.
als een pakket als NOOBS zoiets zou ondersteunen en ik zeker wist dat het ook steeds iedere update zou overleven zou ik die optie nog wel overwegen. maar in het huidige geval toch liever niet :

Door Tweakers user synoniem, dinsdag 17 december 2019 21:49

i-chat schreef op zaterdag 14 december 2019 @ 14:00
[...]
als een pakket als NOOBS zoiets zou ondersteunen en ik zeker wist dat het ook steeds iedere update zou overleven zou ik die optie nog wel overwegen. maar in het huidige geval toch liever niet :
Is BerryBoot niet wat je bedoeld/wilt?

Reageren is niet meer mogelijk