Raspberry PI 4 - FreeBSD PXE boot konfigurálás

Fórumok

Sziasztok!

FreeBSD szerverről szeretnék bebootolni netboot-tal (PXE) egy Raspberry PI-t, amin szintén FreeBSD futna.

A következőket csináltam:

1. Bootloader frissítés

A "Raspberry Pi Imager"-rel kiírtam a network boot-os bootloadert egy sd kártyára, és feltettem a raspberry pi-re.

2. Router konfigurálás

Egy Mikrotik routerem van, és ott a DHCP beállításoknál megadtam az adott klienshez a 66-os, és 67-es opciót, ami elvileg kell a netboot-hoz:

66 s'192.168.4.200'
67 s'bootcode.bin'

És a networks-nél beállítottam a next-server-t a 192.168.4.200-ra. (megj.: ha a next-server-t nem állítom be, akkor később a routerről akarja letölteni a fájlokat, miután az uboot elindult (de nem tudom, hogy miért))

3. Elindítottam a TFTP-t a FreeBSD szerveren

/etc/inetd.conf: 

tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot

(a sorból kiszedtem a commentezést)

Létrehoztam egy /tftpboot könyvtárat:

mkdir /tftpboot

az inetd-t bekapcsoltam:

/etc/rc.conf:

inetd_enable="YES"

inetd szolgáltatás elindítása:

service start inetd

4. Letöltöttem a Raspberry PI image-et, és kicsomagoltam

cd ~
wget https://download.freebsd.org/releases/arm64/aarch64/ISO-IMAGES/14.2/FreeBSD-14.2-RELEASE-arm64-aarch64-RPI.img.xz
xz -d FreeBSD-14.2-RELEASE-arm64-aarch64-RPI.img.xz

A boot particiót bemásoltam a /tftpboot könyvtárba:

mdconfig -a -t vnode -f FreeBSD-14.2-RELEASE-arm64-aarch64-RPI.img 
mount -tmsdosfs /dev/md1s1 /mnt
cp -a /mnt/* /tftpboot/

umount /mnt

A root particiót bemásoltam a /tftpboot/rootfs könyvtárba:

mkdir /tftpboot/rootfs
mount /dev/md1s2a /mnt
cp -a /mnt/* /tftpboot/rootfs/

umount /mnt
mdconfig -d -u md1

5. NFS bekonfigolása:

/etc/rc.conf:

nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfs_server_flags="-u -t -n 4"
mountd_enable="YES"
rpcbind_enable="YES"

/etc/exports:
 

/tftpboot/rootfs -maproot=root -alldirs

NFS elindítása:

service start rcpbind
service start nfsd
service start mountd

6. Tesztelés, hogy eddig működik-e:

A root fájlrendszert (/tftpboot/rootfs) NFS-sel a gépemen (egy Fedora desktop) fel tudom mountolni. Tudok írni a fájlrendszerbe. - szerintem ez működik.

A TFTP működik, a Raspberry PI elkezdi letölteni a U-Boot-ot, ami szépen elindul a Raspberry PI-n.

tcpdump-pal megnézve, hogy mi történik:

 

# tcpdump -i re0 port 69

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on re0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:31:13.684042 IP 192.168.4.15.53678 > 192.168.4.200.tftp: TFTP, length 49, RRQ "d84f375f/start4.elf" octet tsize 0 blksize 1468
14:31:13.687051 IP 192.168.4.15.53679 > 192.168.4.200.tftp: TFTP, length 48, RRQ "d84f375f/start.elf" octet tsize 0 blksize 1468
14:31:13.689934 IP 192.168.4.15.53680 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:13.693358 IP 192.168.4.15.53681 > 192.168.4.200.tftp: TFTP, length 39, RRQ "vl805.sig" octet tsize 0 blksize 1468
14:31:13.695819 IP 192.168.4.15.53682 > 192.168.4.200.tftp: TFTP, length 42, RRQ "pieeprom.sig" octet tsize 0 blksize 1468
14:31:13.698766 IP 192.168.4.15.53683 > 192.168.4.200.tftp: TFTP, length 42, RRQ "recover4.elf" octet tsize 0 blksize 1468
14:31:13.701738 IP 192.168.4.15.53684 > 192.168.4.200.tftp: TFTP, length 42, RRQ "recovery.elf" octet tsize 0 blksize 1468
14:31:13.704156 IP 192.168.4.15.53685 > 192.168.4.200.tftp: TFTP, length 40, RRQ "start4.elf" octet tsize 0 blksize 1468
14:31:14.482638 IP 192.168.4.15.53686 > 192.168.4.200.tftp: TFTP, length 40, RRQ "fixup4.dat" octet tsize 0 blksize 1468
14:31:14.712457 IP 192.168.4.15.49153 > 192.168.4.200.tftp: TFTP, length 42, RRQ "recovery.elf" octet tsize 0 blksize 1468
14:31:14.714849 IP 192.168.4.15.49154 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:14.717775 IP 192.168.4.15.49155 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:14.720940 IP 192.168.4.15.49156 > 192.168.4.200.tftp: TFTP, length 41, RRQ "dt-blob.bin" octet tsize 0 blksize 1468
14:31:14.777910 IP 192.168.4.15.49157 > 192.168.4.200.tftp: TFTP, length 42, RRQ "recovery.elf" octet tsize 0 blksize 1468
14:31:14.780326 IP 192.168.4.15.49158 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:14.783019 IP 192.168.4.15.49159 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:15.237028 IP 192.168.4.15.49160 > 192.168.4.200.tftp: TFTP, length 41, RRQ "bootcfg.txt" octet tsize 0 blksize 1468
14:31:15.290138 IP 192.168.4.15.49161 > 192.168.4.200.tftp: TFTP, length 40, RRQ "u-boot.bin" octet tsize 0 blksize 1468
14:31:15.292956 IP 192.168.4.15.49162 > 192.168.4.200.tftp: TFTP, length 40, RRQ "u-boot.bin" octet tsize 0 blksize 1468
14:31:15.300129 IP 192.168.4.15.49163 > 192.168.4.200.tftp: TFTP, length 49, RRQ "bcm2711-rpi-4-b.dtb" octet tsize 0 blksize 1468
14:31:15.303253 IP 192.168.4.15.49164 > 192.168.4.200.tftp: TFTP, length 49, RRQ "bcm2711-rpi-4-b.dtb" octet tsize 0 blksize 1468
14:31:15.325274 IP 192.168.4.15.49165 > 192.168.4.200.tftp: TFTP, length 54, RRQ "overlays/overlay_map.dtb" octet tsize 0 blksize 1468
14:31:15.403776 IP 192.168.4.15.49166 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:15.406407 IP 192.168.4.15.49167 > 192.168.4.200.tftp: TFTP, length 40, RRQ "config.txt" octet tsize 0 blksize 1468
14:31:15.430249 IP 192.168.4.15.49168 > 192.168.4.200.tftp: TFTP, length 47, RRQ "overlays/mmc.dtbo" octet tsize 0 blksize 1468
14:31:15.433207 IP 192.168.4.15.49169 > 192.168.4.200.tftp: TFTP, length 47, RRQ "overlays/mmc.dtbo" octet tsize 0 blksize 1468
14:31:15.495247 IP 192.168.4.15.49170 > 192.168.4.200.tftp: TFTP, length 54, RRQ "overlays/disable-bt.dtbo" octet tsize 0 blksize 1468
14:31:15.497989 IP 192.168.4.15.49171 > 192.168.4.200.tftp: TFTP, length 54, RRQ "overlays/disable-bt.dtbo" octet tsize 0 blksize 1468
14:31:15.639655 IP 192.168.4.15.49172 > 192.168.4.200.tftp: TFTP, length 41, RRQ "cmdline.txt" octet tsize 0 blksize 1468
14:31:15.642530 IP 192.168.4.15.49173 > 192.168.4.200.tftp: TFTP, length 41, RRQ "cmdline.txt" octet tsize 0 blksize 1468
14:31:15.916083 IP 192.168.4.15.49174 > 192.168.4.200.tftp: TFTP, length 46, RRQ "armstub8-gic.bin" octet tsize 0 blksize 1468
14:31:15.919120 IP 192.168.4.15.49175 > 192.168.4.200.tftp: TFTP, length 46, RRQ "armstub8-gic.bin" octet tsize 0 blksize 1468
14:31:15.922126 IP 192.168.4.15.49176 > 192.168.4.200.tftp: TFTP, length 46, RRQ "armstub8-gic.bin" octet tsize 0 blksize 1468
14:31:15.925035 IP 192.168.4.15.49177 > 192.168.4.200.tftp: TFTP, length 46, RRQ "armstub8-gic.bin" octet tsize 0 blksize 1468
14:31:15.928720 IP 192.168.4.15.49178 > 192.168.4.200.tftp: TFTP, length 40, RRQ "u-boot.bin" octet tsize 0 blksize 1468
14:31:15.932184 IP 192.168.4.15.49179 > 192.168.4.200.tftp: TFTP, length 40, RRQ "u-boot.bin" octet tsize 0 blksize 1468
14:31:36.970228 IP 192.168.4.15.3526 > 192.168.4.200.tftp: TFTP, length 73, RRQ "pxelinux.cfg/01-dc-a6-32-11-d3-13" octet timeout 5 tsize 0 blksize 1468
14:31:36.993175 IP 192.168.4.15.3549 > 192.168.4.200.tftp: TFTP, length 61, RRQ "pxelinux.cfg/C0A8040F" octet timeout 5 tsize 0 blksize 1468
14:31:37.015680 IP 192.168.4.15.3571 > 192.168.4.200.tftp: TFTP, length 60, RRQ "pxelinux.cfg/C0A8040" octet timeout 5 tsize 0 blksize 1468
14:31:37.038105 IP 192.168.4.15.3594 > 192.168.4.200.tftp: TFTP, length 59, RRQ "pxelinux.cfg/C0A804" octet timeout 5 tsize 0 blksize 1468
14:31:37.060190 IP 192.168.4.15.3616 > 192.168.4.200.tftp: TFTP, length 58, RRQ "pxelinux.cfg/C0A80" octet timeout 5 tsize 0 blksize 1468
14:31:37.083776 IP 192.168.4.15.3640 > 192.168.4.200.tftp: TFTP, length 57, RRQ "pxelinux.cfg/C0A8" octet timeout 5 tsize 0 blksize 1468
14:31:37.105659 IP 192.168.4.15.3662 > 192.168.4.200.tftp: TFTP, length 56, RRQ "pxelinux.cfg/C0A" octet timeout 5 tsize 0 blksize 1468
14:31:37.127351 IP 192.168.4.15.3683 > 192.168.4.200.tftp: TFTP, length 55, RRQ "pxelinux.cfg/C0" octet timeout 5 tsize 0 blksize 1468
14:31:37.148962 IP 192.168.4.15.3705 > 192.168.4.200.tftp: TFTP, length 54, RRQ "pxelinux.cfg/C" octet timeout 5 tsize 0 blksize 1468
14:31:37.174139 IP 192.168.4.15.3730 > 192.168.4.200.tftp: TFTP, length 76, RRQ "pxelinux.cfg/default-arm-bcm283x-rpi" octet timeout 5 tsize 0 blksize 1468
14:31:37.200294 IP 192.168.4.15.3756 > 192.168.4.200.tftp: TFTP, length 72, RRQ "pxelinux.cfg/default-arm-bcm283x" octet timeout 5 tsize 0 blksize 1468
14:31:37.223482 IP 192.168.4.15.3779 > 192.168.4.200.tftp: TFTP, length 64, RRQ "pxelinux.cfg/default-arm" octet timeout 5 tsize 0 blksize 1468
14:31:37.245857 IP 192.168.4.15.3802 > 192.168.4.200.tftp: TFTP, length 60, RRQ "pxelinux.cfg/default" octet timeout 5 tsize 0 blksize 1468
14:31:37.275392 IP 192.168.4.15.3831 > 192.168.4.200.tftp: TFTP, length 52, RRQ "C0A8040F.img" octet timeout 5 tsize 0 blksize 1468

Tehát látszik, hogy a pxeconfig.cfg könyvtárból már nem tud semmit letölteni, és a C0A8040F.img-t sem. - De ez még rendben van ezen a ponton, azt most kell létrehoznom: 

Kérdések:

És itt vagyok elakadva, sok mindent kipróbáltam, de nem találok egy jó leírást.

Létrehozom a pxelinux.cfg-ben a default-ot:

/tftpboot/pxelinux.cfg/default:

DEFAULT FreeBSD

LABEL FreeBSD
    KERNEL rootfs/boot/kernel/kernel.bin
    APPEND -dhcp -v vfs.root.mountfrom="nfs:192.168.4.200:/tftpboot/rootfs" rootfs/boot/loader.conf

Az APPEND sorban már tuti hülyeség van, de sok mindent kipróbáltam.

A /tftpboot/cmdline.txt-be felvettem ezt:

vfs.root.mountfrom=nfs:192.168.4.200/tftpboot/rootfs

Ezt a sort /tftpboot/rootfs/boot/loader.conf-ba is felvettem:
 

vfs.root.mountfrom=nfs:192.168.4.200/tftpboot/rootfs

Tehát a teljes fájl tartalma:

# Configure USB OTG; see usb_template(4).
hw.usb.template=3
umodem_load="YES"
# Multiple console (serial+efi gop) enabled.
boot_multicons="YES"
boot_serial="YES"
# Disable the beastie menu and color
beastie_disable="YES"
loader_color="NO"
vfs.root.mountfrom=nfs:192.168.4.200/tftpboot/rootfs

Így most látszik a tcpdump kimenetében, hogy lölti a kernel.bin-t:

...
14:36:55.505766 IP 192.168.4.15.3801 > 192.168.4.200.tftp: TFTP, length 60, RRQ "pxelinux.cfg/default" octet timeout 5 tsize 0 blksize 1468
14:36:55.543131 IP 192.168.4.15.3839 > 192.168.4.200.tftp: TFTP, length 69, RRQ "rootfs/boot/kernel/kernel.bin" octet timeout 5 tsize 0 blksize 1468

Látszik a raspberry pi HDMI kimenetével, hogy el is indítja a kernel-t (Startint kernel... üzenet jelenik meg), majd teljesen sötét képernyőre vált, és minden kifagy.

A loader.conf-ot semmi nem tölti le (TFTP-vel).

 

Itt a vége fele már teljesen el vagyok veszve, mit hogyan kellene, nem igazán találok teljesen jó leírást, ami RPI alatt is működik, és FreeBSD-n van a PXE környezet.

Csinált esetleg valaki ilyet már FreeBSD-vel, és Raspberry PI-vel? 
Látszik, hogy a pxelinux.cfg/default-ba írok elérést, azt TFTP-n akarja elérni. Pontosan hova kellene tenni a tftpboot/rootfs/boot könyvtárat? 
Ezt TFTP-vel fogja elérni a boot, vagy NFS-sel?
A cmdline.txt fájl tartalma mi legyen?

Köszönöm előre is.
 

Hozzászólások

Szerkesztve: 2024. 12. 28., szo – 17:06

Ha a bootfile-nak a routerben az EFI/BOOT/bootaa64.efi-t adom meg, akkor bejön a freebsd-s menü, de a kernelt nem tudja betölteni. (persze ez már csak próbálkozás volt, nincs már ötletem)

Annak nincs értelme, hogy a boot könyvtár a tftpboot/rootfs könyvtáron belül van, ezt kimásoltam.

a cmdline.txt-ben, és a pxelinux.cfg/default-ban a paraméter rész szerintem nincs jól megadva.

Köszi szépen! Igen, ezt néztem már, de holnap végignézem megint. Kipróbálom ezt a ZFS-es NFS megosztást is. 

Érdekes amúgy, hogy itt a pxelinux.cfg könyvtárról egy szó sincs.

Szerintem nekem az okozza a problémát, hogy nem jól adom meg, hogy az nfs fájlrendszert csatolja fel + lehet, hogy nem a megfelelő binárist akarom elindítani. Leírások pxeboot bootfájlt is emlegetnek, nekem olyan nincs is.

Szerkesztve: 2024. 12. 29., v – 22:06

Tapasztalatok:

1. A /tftpboot könyvtár alá nem szükséges kimásolni a root fájlrendszerből a boot könyvtárat, és egy fájl sem kell belőle a /tftpboot-ba.

Tehát a /tftpboot-ba csak azt kell kimásolni a freebsd image-ből, ami a boot fájlrendszerben volt (aminek msdosfs a típusa). A tftpboot/rootfs-be pedig ami az image-ben a root fájlrendszerben volt.

2. A mikrotik routerben a dhcp beállítások:

A DHCP networknél:

  • Next server: 192.168.4.200
  • Boot File Name: EFI/BOOT/bootaa64.efi

A kliensnél a DHCP opciók:

  • Code: 17 Value: s'192.168.4.200:/tftpboot/rootfs'
  • Code: 66 Value: s'192.168.4.200'
  • Code: 67 Value: s'EFI/BOOT/bootaa64.efi'

A 17-es DHCP opció alapján a loader.efi fel fogja mountolni az NFS elérést.

3. A cmdline.txt-be nem kell semmi, 0 bájtos most.

4. Nem kell semmilyen pxelinux.cfg könyvtár.

5. A config.txt-be felvettem ezt (a rasperry pi-s freebsd wiki-ben volt: https://wiki.freebsd.org/arm/Raspberry%20Pi), így bootolás közben rendben van a képernyő felbontás:

hdmi_safe=0
armstub=armstub8-gic.bin
max_framebuffers=2
hdmi_force_hotplug=1
hdmi_group=1
hdmi_drive=2
hdmi_mode=16

6. A tftpboot/rootfs/boot/loader.conf-ba (ez szépen betöltődik, ahogy a loader is) felvettem ezt a sort, még nem tudom 100%-ra, hogy jó-e, vagy kell-e:

vfs.root.mountfrom="nfs:nfs://192.168.4.200/tftpboot/rootfs"

 

Hol tartok most:

Elindul a kernel, pörögnek a kernel üzenetek, ahogy bootoláskor szokott, majd egyszer csak feketére vált a képernyő, és látszólag kifagy minden (az eredeti config.txt-vel is).

Felvettem videóval, hogy a jó pillanatban meg tudjam állítani, megnézni, hogy mi volt az utolsó üzenet:

VT: Replacing driver "efifb" with new "fb"

Ezen még sajnos nem sikerült eddig fogást találnom, itt tartok most.

Valami bebootol, csak nem látom, vagy tényleg kifagy.

Szerkesztve: 2025. 01. 03., p – 19:21

Ebbe is sikeresen belefutottam netboot-os megoldás keresésekor: "genet0: gen_intr2" (ezt sokszor kiírja, és utána se jobbra, se balra)
https://forums.freebsd.org/threads/network-boot-fail-on-rpi4.78180/
és ezt nem sikerül megoldani.

Végül kipróbáltam egy sd kártyáról a bootolást, és ott ez a hiba jött:
https://forums.freebsd.org/threads/raspberry-pi-4b-reboot-process-stops…
Ezt a mountolás problémát végül a total_mem állítgatásával (lásd fórum thread) sikerült csak megoldani.

Mindegy, majd folytatom, most éppen működik SD kártyáról, és látszik, hogy több dolog előjöhet netboot során is. Az SD kártyás boot sem ment simán RPI4B+ 4Gb esetén.