启动排障手册
本文对应 成长路径 高优先级项:从加电到用户态 shell 各阶段失败时的 现象 → 分层 → 命令 速查。
总览:启动阶段与「最后一条日志」
| 阶段 | 你能看到的最后线索 | 优先工具 |
|---|---|---|
| BootROM / SPL | 无任何字符 / 乱码 | 串口线、波特率、JTAG |
| U-Boot | 停在 => 或重复复位 | U-Boot 命令、printenv |
| 内核 early | Starting kernel ... 后黑屏 | bootargs、initrd、dtb |
| 内核 late | Kernel panic / VFS | cmdline、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 TTL 与 RS232 不可混接。
二、U-Boot 阶段问题
2.1 无法打断自动启动
- 确认按键与
bootdelay环境变量(printenv bootdelay)。 bootdelay=0时可在defconfig或saveenv改为>=1。
2.2 无法加载镜像
| 日志关键词 | 方向 |
|---|---|
MMC init failed | 供电、模式、dtb mmc、走线 |
Failed to load / File not found | 分区、路径、文件名大小写 |
Wrong Image Format | booti 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 /chosen3.2 Kernel panic(摘录型)
| panic 信息 | 常见原因 |
|---|---|
Unable to handle kernel paging request | 驱动访问非法地址、dtb reg 错误 |
VFS: Cannot open root device | root= 错误、驱动未编译、分区不存在 |
No init found | rootfs 无 /sbin/init、权限错误 |
request_module 失败 | 根文件系统缺模块、内核模块未装 |
保留完整 panic 栈:开启 earlyprintk、ignore_loglevel,或启动参数加 loglevel=8。
3.3 设备树相关
of_flat_dt/compatible不匹配 → 驱动未 probe → 设备节点不存在。- 用
/proc/device-tree(启动成功后)或 U-Bootfdt print对照原理图。
四、rootfs 挂载失败
4.1 Waiting for root device
root=与/dev/mmcblkXpY、PARTUUID=、LABEL=一致。- 内核 块设备驱动、
CONFIG_MMC、分区表是否可见:cat /proc/partitions(若曾进到 initramfs shell)。
4.2 VFS: Unable to mount root fs
- 文件系统类型:
ext4/squashfs/ubifs与rootfstype=一致。 - 只读根 + 首次启动未
mkfs。 - UBI/UBIFS:未
attach、ubinize参数与 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 行串口日志」 备查