3. 启动日志基础

在OTA升级过程中,设备从断电到系统可用、再到升级服务启动,会持续产生大量文本记录,这些记录统称为启动日志。启动日志不是单一文件,而是由引导程序、内核、init进程、系统服务、升级代理等多个来源按时间顺序写入的集合。理解启动日志的定义、级别、格式,以及内核日志与应用日志的分工,是后续做升级失败定位、时序还原和自动化分析的基础。

一、启动日志的定义与来源

启动日志(Boot Log)指设备从上电复位开始,到系统进入稳定运行状态期间,由各启动阶段组件输出的诊断信息。它通常包含以下来源:

  • Bootloader日志:如U-Boot、LK,输出DDR初始化、分区表、镜像校验、启动槽选择等信息。
  • 内核日志:由Linux内核通过printk输出,记录驱动加载、设备探测、文件系统挂载、内存与CPU初始化。
  • init与系统服务日志:如systemd、Android init、rc脚本,记录服务启动、属性设置、挂载动作。
  • 应用与升级代理日志:OTA客户端、升级守护进程、网络模块输出的业务级信息。

这些日志可能分别落在串口、/dev/kmsg、dmesg、logcat、journalctl或厂商私有日志文件中。做OTA分析时,第一步往往是把多源日志按时间戳对齐,形成一条完整的启动时间线。

二、日志级别:从紧急到调试

日志级别用于表达事件的严重程度,决定日志是否被输出、是否触发告警。Linux内核与多数系统日志采用syslog级别,数值越小越严重:

级别数值含义OTA场景示例
EMERG0系统不可用内核panic,升级中断
ALERT1必须立即处理根分区损坏
CRIT2严重错误镜像校验失败
ERR3错误挂载失败、服务启动失败
WARNING4警告分区空间不足、版本回退
NOTICE5正常但重要切换到B槽启动
INFO6一般信息服务启动完成
DEBUG7调试信息驱动探测细节

实际分析中,ERR与WARNING是排查重点,但NOTICE级别的“槽位切换”“版本标记”往往才是OTA成功与否的关键证据。不能只盯错误级别,否则容易漏掉状态迁移信息。

三、日志格式:字段决定可分析性

典型内核日志格式如下:

[    2.345678] init: Starting service 'otad'...
[    2.346120] otad: [INFO] slot=B, retry=0, reason=boot_success
[    2.350991] EXT4-fs (mmcblk0p12): mounted filesystem
[    2.412003] otad: [ERROR] verify image failed, crc=0x8f2a expected=0x1c4d

可拆解为:时间戳(内核启动秒数或UTC时间)、来源标签(init、otad、内核子系统)、级别、消息体。应用日志如logcat还会带PID、TID、Tag。分析脚本通常用正则提取这些字段,再按时间排序、按Tag聚合。

建议在OTA升级前统一日志时间基准:内核日志用单调时间,应用日志用UTC,分析时通过一次“时间锚点”完成换算,避免跨源排序错乱。

四、内核日志与应用日志:区别与联系

二者最核心的区别在于运行空间与职责。内核日志运行在内核态,关注硬件、驱动、内存、文件系统等底层资源;应用日志运行在用户态,关注业务逻辑、升级流程、网络交互。内核日志一旦出错,往往导致系统无法启动;应用日志出错,通常表现为升级失败但系统仍可运行。

启动日志中内核日志与应用日志的分层与汇聚 内核日志(内核态) printk / dmesg / /dev/kmsg 驱动探测 · 分区挂载 · 内存初始化 级别:EMERG ~ DEBUG 应用日志(用户态) logcat / journalctl / 私有文件 OTA代理 · 网络 · 版本校验 级别:VERBOSE ~ FATAL 统一启动日志时间线 按时间戳对齐 · 按Tag聚合 · 提取槽位/版本/校验结果 OTA分析结论:启动阶段定位 → 失败原因归类 → 回滚/重试决策

二者的联系体现在因果链上:内核日志负责“系统能不能起来”,应用日志负责“升级有没有做成”。例如内核日志显示EXT4-fs error,应用日志随后出现verify image failed,说明根因在存储或镜像写入,而非网络下载。分析时必须把两类日志串起来看,不能孤立判断。

五、案例:一次OTA启动失败的日志复盘

某设备升级后反复重启,抓取日志片段:

[    1.982001] init: Starting service 'otad'...
[    2.010334] otad: [INFO] current slot=A, target slot=B
[    2.045120] otad: [ERROR] open /dev/block/by-name/misc failed: No such file
[    2.046001] init: Service 'otad' exited with status 1
[    2.050220] init: Rebooting into recovery...

复盘结论:应用日志明确报出misc分区节点缺失,属于用户态访问路径问题;内核日志中并无存储驱动报错,说明硬件与驱动正常。修复方向是检查by-name符号链接生成规则,而不是更换内核。这个案例说明:先看应用日志定位失败动作,再回内核日志排除底层故障,是高效的排查顺序。

常见误区:只保存dmesg而丢弃应用日志,或只保存应用日志而忽略内核日志。OTA失败往往需要两类日志交叉验证,缺失任何一类都会显著降低定位效率。

六、方法流程:从原始日志到可分析数据

  1. 采集:串口抓取全量启动输出,同时导出dmesg、logcat、journalctl。
  2. 归一:统一时间戳格式,标注来源与级别。
  3. 过滤:保留ERR/WARNING/NOTICE,以及含slot、version、verify、mount等关键词的行。
  4. 关联:按时间窗口把内核事件与应用事件配对,形成因果链。
  5. 归档:将本次升级的日志与版本号、槽位、结果一起入库,供后续对比。

掌握启动日志的定义、级别、格式以及内核与应用日志的分工,才能在OTA升级分析中快速判断“问题出在底层还是业务层”。这是后续日志解析、时序还原和自动化告警的共同基础。