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.