LubanCat RK3588 实时 Linux 开发(九):从 U-Boot 到 initramfs 的串口启动故障分析

摘要:按照 U-Boot、内核、initramfs 和 systemd 四个阶段阅读串口日志,快速区分启动、根分区和网络问题。

适用对象:遇到黑屏、SSH 不通、initramfs 命令缺失或启动停滞的嵌入式 Linux 开发者。本文以串口日志为主要证据,不把单条 HDMI 警告直接当成根因。

文章目录

本篇要解决什么问题

"SSH 连不上"并不等于"系统没启动"。串口排障最重要的能力,是先判断系统停在哪个阶段,再决定查哪一类问题。

串口停留位置 说明 优先排查
U-Boot 前后无内核输出 内核可能未被正确加载 启动介质、脚本、kernel/DTB 路径
Kernel 有输出,随后进入 initramfs 内核和 initrd 已运行 root=、LABEL/PARTUUID、块设备
能看到 login: 基本用户空间已经起来 IP、路由、sshd、网卡状态
大量外设 warning 但继续启动 不一定是主因 先看是否影响关键启动链路

本次最关键的实测证据

首次失败时,启动参数里的 PARTUUIDblkid 读取到的真实根分区标识不一致。最终使用与分区实际标签匹配的 root=LABEL=writable 后,问题才回到正确的根分区定位路径上。这个案例说明:看到 initramfs 后不要猜,先做标识交叉验证。

一、启动日志应该怎么看

串口日志可以按四段阅读:

  1. U-Boot:读取启动脚本、内核、initrd 和设备树;
  2. Kernel earlycon:确认内核是否真正启动;
  3. initramfs:查找和挂载 rootfs;
  4. systemd/login:启动服务并提供登录界面。

看到 lubancat login:,说明系统至少已经完成内核、根文件系统和基本用户空间启动。

二、检查启动参数

进入目标系统后:

bash 复制代码
cat /proc/cmdline

重点检查 root=rootfstype=rootwaitconsole= 和设备树相关参数。本次首次失败时,两个关键值如下:

来源 根分区标识
/proc/cmdline root=PARTUUID=614e0000-0000
blkid /dev/mmcblk0p2 PARTUUID=a75e6771-0e02-4512-9ba0-b6163f829d6eLABEL=writable

二者明显不一致,因此 initramfs 无法按启动参数找到 rootfs。最终改为 root=LABEL=writable,与分区标签一致。

这里的结论来自"命令行标识"和"块设备实际标识"的交叉验证,不是看到 initramfs 就直接猜测存储损坏。

三、initramfs 中的检查命令

如果启动失败进入 (initramfs),可使用:

text 复制代码
blkid
ls -l /dev/mmcblk*
cat /proc/cmdline

blkid 能显示分区 LABEL、UUID 和 PARTUUID;ls -l /dev/mmcblk* 能确认块设备节点是否存在。BusyBox 不是完整 Ubuntu shell,命令选项和工具数量都有限。

本次设备识别结果中,/dev/mmcblk0p1 是 FAT 启动分区,/dev/mmcblk0p2 是标签为 writable 的 ext4 根分区。需要只读检查文件时,可先挂载:

sh 复制代码
mkdir -p /mnt/root /mnt/boot
mount -o ro /dev/mmcblk0p2 /mnt/root
mount -o ro /dev/mmcblk0p1 /mnt/boot
ls -l /mnt/root/boot
ls -l /mnt/boot

修复前先只读挂载,确认目标无误后再决定是否重新以读写方式挂载。

例如 BusyBox ls 不支持 -h

text 复制代码
ls -lh   # 可能报 invalid option
ls -l    # 使用兼容写法

本次 initramfs 中还出现过 tar: not found。这表示当前救援环境没有打包工具,不应继续照抄完整 Ubuntu 下的 tar 命令;应改用带完整工具的恢复系统,或把分区挂载到另一台 Linux 主机处理。

四、常见启动判断

  • 没有任何内核输出:检查串口参数、启动介质和 U-Boot;
  • 有内核输出但找不到 rootfs:检查 root=、分区 LABEL、initramfs;
  • 能进入 initramfs:说明内核和 initrd 已执行,但挂载 rootfs 失败;
  • 能进入 login 但 SSH 不通:优先检查网络地址、路由和 sshd,而不是重装内核。

五、为什么 HDMI 日志可能拖慢启动

如果串口反复出现:

text 复制代码
dwhdmi-rockchip ... i2c read err!
ddc read failed

这说明 HDMI DDC 通信没有正常完成,可能与显示器、线缆、供电或显示 overlay 有关。它与根分区挂载是两个独立问题,但本次日志中与较长启动时间同时出现。当前尚未完成因果验证,不能直接断言它就是全部启动延迟的唯一原因;应记录显示器连接状态和 U-Boot 加载的 overlay,并做有/无显示设备的对照启动测试。

六、把"现象"转换成"下一条命令"

启动故障排查最重要的是减少猜测。可以按下面的判断链处理:

1. 能进入 (initramfs)

说明 CPU 已经执行了新内核,initrd 也已经被加载。此时优先确认块设备和 root 参数:

text 复制代码
cat /proc/cmdline
blkid
ls -l /dev/mmcblk*

不要一看到 initramfs 就重刷系统。

2. root= 指向 PARTUUID

把命令行中的值和 blkid 输出逐字符比较。PARTUUID 改变后,即使分区内容完全正常,initramfs 仍可能找不到根分区。

3. 改用 LABEL 时也要验证 LABEL 唯一且真实存在

本文实测使用 root=LABEL=writable 解决的是"启动参数与真实分区标识不一致"这一具体问题,并不代表 LABEL 永远优于 PARTUUID。工程上应选择稳定、可维护且与启动脚本一致的标识方式。

七、BusyBox 环境下为什么命令经常"不好使"

initramfs 中通常只有精简 BusyBox 工具集,因此:

  • 某些 GNU 命令根本不存在;
  • 同名命令支持的参数比完整 Ubuntu 少;
  • /boot/firmware 等完整系统路径可能尚未挂载;
  • 网络和 DNS 也未必可用。

所以救援时应先执行最小、只读、可确认目标的操作。能只读挂载就先只读挂载,能观察就先观察,再决定是否写入。

八、HDMI warning 应该怎么处理

HDMI DDC 错误可能需要处理,但它和 rootfs 挂载失败是两条不同链路。更严谨的做法是做对照实验:

  1. 记录连接显示器时的启动时间和日志;
  2. 记录断开显示器时的启动时间和日志;
  3. 对比 U-Boot overlay、kernel warning 次数和 systemd 到达 login 的时间。

只有有了对照数据,才能判断它是否是明显启动延迟来源。

九、本文验收清单

  • 能根据串口判断停在 U-Boot / Kernel / initramfs / systemd 哪一阶段;
  • 已比较 /proc/cmdlineblkid 的真实分区标识;
  • initramfs 中优先采用只读检查;
  • 没有把 BusyBox 当成完整 Ubuntu shell;
  • 没有把单条 HDMI warning 直接定性为启动失败主因;
  • 修复后能看到正常 login 或进一步进入用户空间。

小结

串口日志分析的核心是先定位启动阶段,再决定查看分区、设备树、驱动还是服务。不要把所有警告都当成导致启动失败的根因。

工作流实测截图

图1:串口 initramfs 环境中 blkid 和 mmc 设备节点输出。

图2:从 DDR 初始化到 systemd/SSH 就绪的阶段性日志。

专栏导航

专栏LubanCat RK3588 实时 Linux 开发实战(第 9/13 篇)

参考资料

文中的版本号、接口名、设备地址和测试数据均应以自己的板卡实测为准;引用命令前请先确认当前 SDK、内核和启动布局。

标签串口调试 U-Boot initramfs Linux启动 RK3588

相关推荐
kkkkkkkkkk_Z1 小时前
学嵌入式和Linux应用编程|学习日记:UDP协议与Wireshark抓包学习笔记
linux·笔记·学习
嵌入式小能手2 小时前
飞凌嵌入式ElfBoard-Shell编程应用实例-提取字符并设置rtc时间
linux
刃神太酷啦2 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
大卡片2 小时前
LCD相关知识
linux
闲云野鹤在人间2 小时前
Docker入门|第3章 镜像详解
linux·网络·docker·容器·centos·云计算·php
小卿噢2 小时前
malloc 成功 ≠ 你有内存:一次把 OOM 从头测到尾
linux·后端
团子股股东峥哥2 小时前
day38-RHEL-管理存储堆栈
linux·运维·服务器
闲云野鹤在人间3 小时前
Docker入门|第2章 容器架构详解
linux·运维·docker·容器·架构·云计算
张小姐的猫3 小时前
【AI大模型接入SDK】 —— SQLite上手
linux·开发语言·c++·人工智能·python·log4j