U-Boot 是很多嵌入式 Linux 系统的启动核心。它决定从哪里加载 kernel、dtb、rootfs,也决定 OTA A/B 分区如何切换。理解 U-Boot 环境变量和启动脚本,是排查启动问题和做升级回滚的基础。
一、常用命令
进入 U-Boot 命令行后:
1 | printenv |
查看存储:
1 | mmc list |
网络启动常用:
1 | ping |
二、关键环境变量
常见变量:
1 | bootcmd |
bootcmd 是自动启动命令,bootargs 会传给 Linux kernel。
示例:
1 | console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw |
如果 console 配错,系统可能启动了但你看不到日志。
三、boot script
复杂启动逻辑不要全部塞进环境变量,可以使用 boot script。
典型职责:
- 判断当前启动分区。
- 加载 kernel。
- 加载 dtb。
- 设置 bootargs。
- 启动内核。
OTA A/B 场景里,boot script 还要处理:
- 当前 slot。
- 尝试次数。
- rollback 标记。
- upgrade testing 状态。
四、环境变量保存风险
saveenv 会写入 Flash 或 eMMC 的环境区域。频繁写环境变量会有风险:
- Flash 磨损。
- 断电导致环境损坏。
- 多版本环境不兼容。
升级状态可以尽量放到 data 分区,由启动脚本或早期用户态配合处理。确实需要 U-Boot 判断的状态,再写环境变量。
五、排查启动问题
重点看:
1 | printenv bootcmd |
再确认:
- kernel 文件是否存在。
- dtb 是否存在。
- rootfs 分区是否正确。
- rootwait 是否需要。
- console 是否正确。
- A/B slot 是否切错。
启动问题不要只看 Linux,很多根因在 U-Boot 阶段。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_27_UBoot_Env_Bootscript/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。