手动加载设备树overlay后Orange Pi Zero内核panic求助
Orange Pi Zero手动加载设备树Overlay后VFS挂载失败的解决方法
问题描述
使用Buildroot制作Orange Pi Zero镜像后,手动在U-Boot命令行加载设备树Overlay,执行以下命令:
load mmc 0:1 ${kernel_addr_r} /boot/zImage load mmc 0:1 ${fdt_addr_r} /boot/sun8i-h2-plus-orangepi-zero.dtb load mmc 0:1 ${fdtoverlay_addr_r} /boot/st7789opizero.dtb fdt addr ${fdt_addr_r} # 输出Working FDT set to 43000000 fdt resize 32000 # 按主设备树与overlay大小之和预留空间 fdt apply ${fdtoverlay_addr_r} bootz $kernel_addr_r - $fdt_addr_r
启动后出现内核panic,日志提示Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0),但系统自动启动(未手动干预加载Overlay)完全正常。
问题根源
自动启动时,U-Boot会从启动脚本(如boot.cmd生成的boot.scr)中读取完整的启动参数,其中包含根文件系统的挂载配置(如root分区路径、挂载属性等);而手动执行bootz命令时,未传递这些关键参数,导致内核无法定位根分区。
解决步骤
1. 获取自动启动的完整参数
在U-Boot命令行执行以下命令,查看系统默认的启动参数:
printenv bootcmd
若输出为bootcmd=run distro_bootcmd,继续执行:
printenv distro_bootcmd
或直接读取启动脚本内容:
load mmc 0:1 ${kernel_addr_r} /boot/boot.scr && imi ${kernel_addr_r}
找到包含bootargs的配置,核心参数类似:
bootargs=console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
其中root=/dev/mmcblk0p2是根分区路径,需根据你的Buildroot镜像实际分区调整(部分镜像可能为/dev/mmcblk0p1)。
2. 手动启动时补充根文件系统参数
有两种方式传递参数:
- 方式一:提前设置bootargs环境变量
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw bootz ${kernel_addr_r} - ${fdt_addr_r} - 方式二:直接在bootz命令后追加参数
bootz ${kernel_addr_r} - ${fdt_addr_r} console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
3. 验证Overlay是否生效
系统启动后,可通过以下命令确认设备树Overlay是否正确加载:
ls /proc/device-tree/ | grep st7789
若能看到相关节点,说明Overlay已成功应用。
可选:实现自动加载Overlay
将手动加载Overlay的命令写入启动脚本,实现自动启动:
- 创建或修改
boot.cmd文件:setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw load mmc 0:1 ${kernel_addr_r} /boot/zImage load mmc 0:1 ${fdt_addr_r} /boot/sun8i-h2-plus-orangepi-zero.dtb load mmc 0:1 ${fdtoverlay_addr_r} /boot/st7789opizero.dtb fdt addr ${fdt_addr_r} fdt resize 32000 fdt apply ${fdtoverlay_addr_r} bootz ${kernel_addr_r} - ${fdt_addr_r} - 用
mkimage生成可执行的启动脚本:mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Boot script with overlay" -d boot.cmd boot.scr - 将生成的
boot.scr复制到SD卡的/boot分区,重启系统即可自动加载Overlay并正常启动。
内容的提问来源于stack exchange,提问作者no more sigsegv
相关产品推荐
相关产品推荐

