RPI3/4 PXE 启动在 ubuntu 20.04 上成功,但在 22.04 上失败,原因是 initramfs 中缺少 /lib/systemd

RPI3/4 PXE 启动在 ubuntu 20.04 上成功,但在 22.04 上失败,原因是 initramfs 中缺少 /lib/systemd

我在 Ubuntu 22.04 上使用 PXE 启动时遇到了困难,并且已经尝试解决这个问题一年了。

主要存在两个问题:

  1. 第一个是漏洞自 2007 年以来,NFS 版本 4 的支持已中断。有关此问题的进一步讨论,请参见这里,但值得庆幸的是,至少版本 3 可以运行。
  2. 第二个问题是我无法克服的,涉及缺少文件夹/lib/systemd/lib/udevinitramfs。

我不确定在哪里可以找到这些丢失文件夹的原因,并希望得到任何建议。

我怀疑 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 ]

initrd.img 转储与 initramfs

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]

相关内容