启动排障手册

本文对应 成长路径 高优先级项:从加电到用户态 shell 各阶段失败时的 现象 → 分层 → 命令 速查。


总览:启动阶段与「最后一条日志」

阶段你能看到的最后线索优先工具
BootROM / SPL无任何字符 / 乱码串口线、波特率、JTAG
U-Boot停在 => 或重复复位U-Boot 命令、printenv
内核 earlyStarting kernel ... 后黑屏bootargsinitrd、dtb
内核 lateKernel panic / VFScmdline、root=、驱动
用户态Waiting for root device分区、文件系统、init

原则:先确认 串口 console 全程可用,再缩小到 哪一行之后不再输出


一、串口完全无输出

1.1 硬件与终端

  • 线序:TX/RX 交叉,GND 共地;USB 转串口驱动正常。
  • 参数:与 BSP 一致(常见 115200 8N1);部分 ROM 阶段为 57600
  • 尝试 另一个 UART(debug 口 vs 正式 console 引脚)。

1.2 软件尚未跑到 U-Boot

  • 确认 启动介质(拨码、eMMC / SD、SPI NOR)与烧录内容一致。
  • SPL 失败时常 无任何输出 或只重复复位:用 JTAG / 厂商 USB 下载模式 恢复。
  • 检查 电源、时钟、DDR 初始化(新板 bring-up 高发区)。

1.3 有乱码

  • 波特率不匹配 或时钟误差。
  • 电平:3.3V TTLRS232 不可混接。

二、U-Boot 阶段问题

2.1 无法打断自动启动

  • 确认按键与 bootdelay 环境变量(printenv bootdelay)。
  • bootdelay=0 时可在 defconfigsaveenv 改为 >=1

2.2 无法加载镜像

日志关键词方向
MMC init failed供电、模式、dtb mmc、走线
Failed to load / File not found分区、路径、文件名大小写
Wrong Image Formatbooti vs bootz vs bootm 与镜像类型

参考:U-Boot 实操指南

2.3 环境变量异常

  • 升级 U-Boot 后 env 版本不兼容:按厂商说明擦除 env 分区或 env default -a 后重配。
  • saveenv 失败:检查 env 分区是否只读、是否写保护。

三、内核启动失败

3.1 停在 Starting kernel ...

常见原因:

  • dtb 地址错误 或与内核解压区域 重叠
  • Image 损坏 或架构不匹配(ARM64 Image vs zImage)。
  • bootargs 过长 超出预留缓冲区。

排查:

=> iminfo ${loadaddr}          # 查看镜像信息
=> fdt addr ${fdt_addr}; fdt print /chosen

3.2 Kernel panic(摘录型)

panic 信息常见原因
Unable to handle kernel paging request驱动访问非法地址、dtb reg 错误
VFS: Cannot open root deviceroot= 错误、驱动未编译、分区不存在
No init foundrootfs 无 /sbin/init、权限错误
request_module 失败根文件系统缺模块、内核模块未装

保留完整 panic 栈:开启 earlyprintkignore_loglevel,或启动参数加 loglevel=8

3.3 设备树相关

  • of_flat_dt / compatible 不匹配 → 驱动未 probe → 设备节点不存在。
  • /proc/device-tree(启动成功后)或 U-Boot fdt print 对照原理图。

四、rootfs 挂载失败

4.1 Waiting for root device

  • root=/dev/mmcblkXpYPARTUUID=LABEL= 一致。
  • 内核 块设备驱动CONFIG_MMC、分区表是否可见:cat /proc/partitions(若曾进到 initramfs shell)。

4.2 VFS: Unable to mount root fs

  • 文件系统类型:ext4 / squashfs / ubifsrootfstype= 一致。
  • 只读根 + 首次启动未 mkfs
  • UBI/UBIFS:未 attachubinize 参数与 flash 不符(见文件系统专题笔记)。

4.3 initramfs 过渡

  • 生产常用 initramfs 做 fsck / 解密 / 找 root;若卡在 initramfs shell,检查 /init 脚本逻辑。

五、建议携带的启动参数(调试)

在 U-Boot 临时 setenv bootargs 或追加:

console=ttyS0,115200 earlyprintk loglevel=8 ignore_loglevel

需要保留现场时:

panic=10          # panic 后重启前等待,便于读串口

注意:量产固件勿长期开启过高 loglevel。


六、排障流程(SOP 简版)

1. 串口是否可靠?(波特率、线序)
2. 最后一条日志属于哪一阶段?(ROM / U-Boot / kernel / init)
3. 该阶段输入是否完整?(bootcmd、bootargs、镜像、dtb)
4. 存储与分区是否一致?(fdisk / PARTUUID / 烧录包)
5. 内核配置与模块是否包含所需驱动?
6. 换已知好镜像 / 好 dtb 做 A/B 对比

更完整的工具链见 系统调试 专题(perf / 反汇编等)。


实践清单

  • 故意写错 root=,观察 Waiting for root device 并改回
  • 在 U-Boot 用 booti 手动启动一次,确认与 bootcmd 一致
  • 记录一张本板 「正常启动最后 20 行串口日志」 备查

延伸阅读