banner
NEWS LETTER

嵌入式 Linux 系列 27:U-Boot 环境变量和启动脚本

Scroll down

U-Boot 是很多嵌入式 Linux 系统的启动核心。它决定从哪里加载 kernel、dtb、rootfs,也决定 OTA A/B 分区如何切换。理解 U-Boot 环境变量和启动脚本,是排查启动问题和做升级回滚的基础。

一、常用命令

进入 U-Boot 命令行后:

1
2
3
4
5
printenv
setenv
saveenv
boot
reset

查看存储:

1
2
3
4
mmc list
mmc dev 0
fatls mmc 0:1
ext4ls mmc 0:2 /

网络启动常用:

1
2
ping
tftpboot

二、关键环境变量

常见变量:

1
2
3
4
5
6
bootcmd
bootargs
kernel_addr_r
fdt_addr_r
scriptaddr
bootdelay

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
2
printenv bootcmd
printenv bootargs

再确认:

  • kernel 文件是否存在。
  • dtb 是否存在。
  • rootfs 分区是否正确。
  • rootwait 是否需要。
  • console 是否正确。
  • A/B slot 是否切错。

启动问题不要只看 Linux,很多根因在 U-Boot 阶段。

其他文章
目录导航 置顶
  1. 1. 一、常用命令
  2. 2. 二、关键环境变量
  3. 3. 三、boot script
  4. 4. 四、环境变量保存风险
  5. 5. 五、排查启动问题
请输入关键词进行搜索