You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动加载设备树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的命令写入启动脚本,实现自动启动:

  1. 创建或修改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}
    
  2. 用mkimage生成可执行的启动脚本:
    mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Boot script with overlay" -d boot.cmd boot.scr
    
  3. 将生成的boot.scr复制到SD卡的/boot分区,重启系统即可自动加载Overlay并正常启动。

内容的提问来源于stack exchange,提问作者no more sigsegv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:24:59