我在 Ubuntu 22.04 上使用 PXE 启动时遇到了困难,并且已经尝试解决这个问题一年了。
主要存在两个问题:
- 第一个是漏洞自 2007 年以来,NFS 版本 4 的支持已中断。有关此问题的进一步讨论,请参见这里,但值得庆幸的是,至少版本 3 可以运行。
- 第二个问题是我无法克服的,涉及缺少文件夹
/lib/systemd
和/lib/udev
initramfs。
我不确定在哪里可以找到这些丢失文件夹的原因,并希望得到任何建议。
我怀疑 Ubuntu 22.04 存在特定问题,因为 Ubuntu 20.04 可在 RPI3B 和 RPI4B 上运行。
对于 Ubuntu 20.04 LTS(initrd.img-5.4.0-1097-raspi):
・✅ SD 卡启动至 NFS 版本 3
・❌ SD 卡启动至 NFS 版本 4
・✅ RPI4B PXE 启动(无需 SD 卡)
・✅ RPI3B PXE 启动(bootcode.bin 需要 SD 卡)
在 PXE 启动期间,Raspberry Pi 从 TFTP 服务器检索 initrd.img。但是,由于缺少/lib/systemd
和/lib/udev
,导致没有 eth0,因此网络启动失败。我保证 initramfs 是正确的 initrd.img,因为我已修改/bin/nfsmount
以支持 NFS4,解决了我提到的 bug(2007)。从 SD 卡启动时不会发生此故障。
对于 Ubuntu 22.04 LTS(initrd.img-5.15.0-1044-raspi):
・✅ SD 卡启动至 NFS 版本 3
・✅ SD 卡启动至 NFS 版本 4(nfsmount 替换为 mount.nfs)
・❌ RPI4B PXE 启动(无需 SD 卡)
・❌ RPI3B PXE 启动(bootcode.bin 需要 SD 卡)
SD 卡启动至 NFS 的最低文件要求是:
bootcode.bin
config.txt
start.elf
fixup.dat
initrd.img
bcm2837-rpi-3-b.dtb
overlays/overlay_map.dtb
overlays/dwc2.dtbo
cmdline.txt
vmlinuz
cmdline.txt(为了更好的可读性,它应该是一行):
dwc_otg.lpm_enable=0
console=serial0,115200
console=tty0 console=tty1
console=ttyS0,115200
root=/dev/nfs nfsrootdebug
nfsroot=192.168.9.10:/rpi3b/,vers=4
rw ip=dhcp rootwait fixrtc roottimeout=3
debug break=bottom loglevel=7
用于break=bottom
调试,稍后应删除。
对于 rpi4bnfsroot=192.168.9.10:/srv/nfs/rpi4b8g/,vers=3
initramfs 调试日志(/lib/systemd/systemd-udevd: not found
由于全部/lib/systemd
丢失):
(initramfs) cat /run/initramfs/initramfs.debug
+ unset log_output
+ maybe_break top
+ run_scripts /scripts/init-top
+ initdir=/scripts/init-top
+ '[' '!' -d /scripts/init-top ]
+ shift
+ . /scripts/init-top/ORDER
+ /scripts/init-top/00_mount_efivarfs
+ '[' -e /conf/param.conf ]
+ /scripts/init-top/all_generic_ide
+ '[' -e /conf/param.conf ]
+ /scripts/init-top/blacklist
+ '[' -e /conf/param.conf ]
+ /scripts/init-top/udev
/scripts/init-top/udev: line 24: /lib/systemd/systemd-udevd: not found
+ '[' -e /conf/param.conf ]
+ /scripts/init-top/framebuffer
+ '[' -e /conf/param.conf ]
+ /scripts/init-top/console_setup
+ '[' -e /conf/param.conf ]
root@iot:/srv/nfs/rpi3b/root/initrd# ls -al lib/
total 132
drwxr-xr-x 3 root root 4096 Jan 1 01:54 aarch64-linux-gnu
drwxr-xr-x 2 root root 4096 Jan 1 01:54 cryptsetup
drwxr-xr-x 6 root root 4096 Jan 1 01:54 firmware
drwxr-xr-x 3 root root 4096 Jan 1 01:54 initramfs-tools
-rwxr-xr-x 1 root root 91080 Jan 30 2022 klibc-SVGXxscWf9nOevB_HZqdYeSV05I.so
lrwxrwxrwx 1 root root 39 Jan 1 01:54 ld-linux-aarch64.so.1 -> aarch64-linux-gnu/ld-linux-aarch64.so.1
drwxr-xr-x 2 root root 4096 Jan 1 01:54 modprobe.d
drwxr-xr-x 3 root root 4096 Jan 1 01:54 modules
drwxr-xr-x 3 root root 4096 Jan 1 01:54 systemd
drwxr-xr-x 3 root root 4096 Jan 1 01:54 udev
(initramfs) ls -al lib/
drwxr-xr-x 3 0 aarch64-linux-gnu
drwxr-xr-x 2 0 cryptsetup
drwxr-xr-x 6 0 firmware
drwxr-xr-x 3 0 initramfs-tools
-rwxr-xr-x 1 91080 klibc-SVGXxscWf9nOevB_HZqdYeSV05I.so
lrwxrwxrwx 1 39 ld-linux-aarch64.so.1 -> aarch64-linux-gnu/ld-linux-aarch64.so.1
drwxr-xr-x 2 0 modprobe.d
drwxr-xr-x 3 0 modules
配置.txt
[all]
kernel=vmlinuz
cmdline=cmdline.txt
initramfs initrd.img followkernel
[pi4]
max_framebuffers=2
arm_boost=1
[all]
# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these
# parameters related to the base device-tree they must appear *before* any
# other dtoverlay= specification
dtparam=audio=on
dtparam=i2c_arm=on
dtparam=spi=on
# disable rainbow square
#disable_splash=1
# Comment out the following line if the edges of the desktop appear outside
# the edges of your display
disable_overscan=1
# If you have issues with audio, you may try uncommenting the following line
# which forces the HDMI output into HDMI mode instead of DVI (which doesn't
# support audio output)
#hdmi_drive=2
# Enable the serial pins
enable_uart=1
# Autoload overlays for any recognized cameras or displays that are attached
# to the CSI/DSI ports. Please note this is for libcamera support, *not* for
# the legacy camera stack
camera_auto_detect=1
display_auto_detect=1
# Config settings specific to arm64
arm_64bit=1
dtoverlay=dwc2
[pi3]
#device_tree=bcm2837-rpi-3-b.dtb
#dtoverlay=dwc2,pi3-enable-wifi
[cm4]
# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into
# such a board)
dtoverlay=dwc2,dr_mode=host
[all]