驱动、bootloader、文件系统

嵌入式 Linux 系统工程 120:整机验收与故障报告

展开合集目录
  1. 嵌入式 Linux 系统工程 001:Linux 系统分层与资源地图
  2. 嵌入式 Linux 系统工程 002:主机、目标板与交叉开发
  3. 嵌入式 Linux 系统工程 003:架构、ABI、大小端与工具链
  4. 嵌入式 Linux 系统工程 004:Shell、管道、重定向与退出码
  5. 嵌入式 Linux 系统工程 005:BusyBox 与 GNU 工具差异
  6. 嵌入式 Linux 系统工程 006:目录结构与虚拟文件系统
  7. 嵌入式 Linux 系统工程 007:串口、SSH 与开发网络
  8. 嵌入式 Linux 系统工程 008:建立开发板信息与版本基线
  9. 嵌入式 Linux 系统工程 009:从 Boot ROM 到用户空间
  10. 嵌入式 Linux 系统工程 010:U-Boot 环境与内核启动参数
  11. 嵌入式 Linux 系统工程 011:内核配置、编译与模块
  12. 嵌入式 Linux 系统工程 012:设备树编译、加载与生效确认
  13. 嵌入式 Linux 系统工程 013:根文件系统与 initramfs
  14. 嵌入式 Linux 系统工程 014:BusyBox init、启动脚本与 systemd
  15. 嵌入式 Linux 系统工程 015:Buildroot 工程构建与定制
  16. 嵌入式 Linux 系统工程 016:Yocto 的 layer、recipe 与镜像
  17. 嵌入式 Linux 系统工程 017:读懂 procfs 的系统与进程信息
  18. 嵌入式 Linux 系统工程 018:sysfs:设备、属性与拓扑
  19. 嵌入式 Linux 系统工程 019:设备节点、设备号与动态管理
  20. 嵌入式 Linux 系统工程 020:debugfs、tracefs 与配置依赖
  21. 嵌入式 Linux 系统工程 021:内核日志、用户日志与时间线
  22. 嵌入式 Linux 系统工程 022:uptime、负载与基础状态
  23. 嵌入式 Linux 系统工程 023:系统快照与版本对照
  24. 嵌入式 Linux 系统工程 024:工具、权限和内核能力的辨别
  25. 嵌入式 Linux 系统工程 025:进程生命周期与状态
  26. 嵌入式 Linux 系统工程 026:线程、TID 与共享资源
  27. 嵌入式 Linux 系统工程 027:调度策略、nice 与实时优先级
  28. 嵌入式 Linux 系统工程 028:CPU 亲和性与多核
  29. 嵌入式 Linux 系统工程 029:上下文切换、抢占与唤醒延迟
  30. 嵌入式 Linux 系统工程 030:信号与有序退出
  31. 嵌入式 Linux 系统工程 031:僵尸进程与子进程回收
  32. 嵌入式 Linux 系统工程 032:高 CPU、低 CPU 卡顿与 D 状态
  33. 嵌入式 Linux 系统工程 033:虚拟地址、物理内存与映射
  34. 嵌入式 Linux 系统工程 034:栈、堆、malloc 与 mmap
  35. 嵌入式 Linux 系统工程 035:RSS、PSS 与共享内存统计
  36. 嵌入式 Linux 系统工程 036:页缓存、回收、swap 与内存压力
  37. 嵌入式 Linux 系统工程 037:slab 与内核内存
  38. 嵌入式 Linux 系统工程 038:CMA、保留内存与厂商缓冲池
  39. 嵌入式 Linux 系统工程 039:OOM、碎片与分配失败
  40. 嵌入式 Linux 系统工程 040:内存泄漏、越界与峰值
  41. 嵌入式 Linux 系统工程 041:文件描述符与打开文件状态
  42. 嵌入式 Linux 系统工程 042:权限、属主、umask 与链接
  43. 嵌入式 Linux 系统工程 043:VFS、挂载点与文件系统
  44. 嵌入式 Linux 系统工程 044:块设备、分区、eMMC 与 SD
  45. 嵌入式 Linux 系统工程 045:MTD、NOR、NAND、UBI 与 UBIFS
  46. 嵌入式 Linux 系统工程 046:SquashFS、OverlayFS 与只读系统
  47. 嵌入式 Linux 系统工程 047:缓冲写入、fsync 与掉电一致性
  48. 嵌入式 Linux 系统工程 048:空间满、inode 耗尽与 I/O 慢
  49. 嵌入式 Linux 系统工程 049:阻塞、非阻塞与短读写
  50. 嵌入式 Linux 系统工程 050:select、poll 与 epoll
  51. 嵌入式 Linux 系统工程 051:pipe、FIFO 与 Unix socket
  52. 嵌入式 Linux 系统工程 052:共享内存与消息队列
  53. 嵌入式 Linux 系统工程 053:mutex、条件变量与信号量
  54. 嵌入式 Linux 系统工程 054:原子操作、内存序与数据竞争
  55. 嵌入式 Linux 系统工程 055:eventfd、timerfd 与 signalfd
  56. 嵌入式 Linux 系统工程 056:死锁、优先级反转与队列背压
  57. 嵌入式 Linux 系统工程 057:device、driver、bus 与绑定
  58. 嵌入式 Linux 系统工程 058:platform、设备树与 probe
  59. 嵌入式 Linux 系统工程 059:模块、固件加载与版本匹配
  60. 嵌入式 Linux 系统工程 060:MMIO 与资源申请
  61. 嵌入式 Linux 系统工程 061:IRQ、软中断与工作队列
  62. 嵌入式 Linux 系统工程 062:GPIO、pinctrl 与有效电平
  63. 嵌入式 Linux 系统工程 063:clock、reset、regulator 与生命周期
  64. 嵌入式 Linux 系统工程 064:DMA、IOMMU 与缓存所有权
  65. 嵌入式 Linux 系统工程 065:UART、termios 与串口使用
  66. 嵌入式 Linux 系统工程 066:I²C 设备、事务与访问工具
  67. 嵌入式 Linux 系统工程 067:SPI、spidev 与传输
  68. 嵌入式 Linux 系统工程 068:GPIO 字符设备与事件
  69. 嵌入式 Linux 系统工程 069:PWM、定时器与控制输出
  70. 嵌入式 Linux 系统工程 070:ADC、传感器与 IIO
  71. 嵌入式 Linux 系统工程 071:input、按键与触摸事件
  72. 嵌入式 Linux 系统工程 072:CAN、SocketCAN 与错误状态
  73. 嵌入式 Linux 系统工程 073:USB 枚举、描述符与端点
  74. 嵌入式 Linux 系统工程 074:USB Host、Gadget 与 UVC
  75. 嵌入式 Linux 系统工程 075:PCIe 枚举、BAR、MSI 与 DMA
  76. 嵌入式 Linux 系统工程 076:V4L2 采集与缓冲队列
  77. 嵌入式 Linux 系统工程 077:Media Controller 与摄像头拓扑
  78. 嵌入式 Linux 系统工程 078:ALSA、PCM 与音频欠载
  79. 嵌入式 Linux 系统工程 079:DRM、KMS 与显示缓冲
  80. 嵌入式 Linux 系统工程 080:厂商视频 SDK 与 NPU 资源
  81. 嵌入式 Linux 系统工程 081:网卡、MAC、PHY 与链路状态
  82. 嵌入式 Linux 系统工程 082:IP、子网、路由与邻居表
  83. 嵌入式 Linux 系统工程 083:DHCP、DNS 与时间同步
  84. 嵌入式 Linux 系统工程 084:TCP、UDP 与 socket 缓冲
  85. 嵌入式 Linux 系统工程 085:ss、抓包与协议分析
  86. 嵌入式 Linux 系统工程 086:吞吐、重传、MTU 与延迟
  87. 嵌入式 Linux 系统工程 087:Wi-Fi、蜂窝模块与重连
  88. 嵌入式 Linux 系统工程 088:防火墙、转发、NAT 与隔离
  89. 嵌入式 Linux 系统工程 089:交叉编译、sysroot 与 pkg-config
  90. 嵌入式 Linux 系统工程 090:Make、CMake 与可重复构建
  91. 嵌入式 Linux 系统工程 091:ELF、库与动态加载器
  92. 嵌入式 Linux 系统工程 092:程序无法启动的分层排查
  93. 嵌入式 Linux 系统工程 093:配置、日志与错误处理
  94. 嵌入式 Linux 系统工程 094:服务管理、依赖与恢复
  95. 嵌入式 Linux 系统工程 095:capabilities 与设备访问
  96. 嵌入式 Linux 系统工程 096:软件包、升级与回退
  97. 嵌入式 Linux 系统工程 097:strace 定位系统调用问题
  98. 嵌入式 Linux 系统工程 098:GDB 与 gdbserver
  99. 嵌入式 Linux 系统工程 099:core dump、符号与回溯
  100. 嵌入式 Linux 系统工程 100:ASan、UBSan 与内存错误
  101. 嵌入式 Linux 系统工程 101:perf 与采样分析
  102. 嵌入式 Linux 系统工程 102:ftrace、tracepoints 与时序
  103. 嵌入式 Linux 系统工程 103:eBPF 的用途、条件与替代方案
  104. 嵌入式 Linux 系统工程 104:联合定位性能瓶颈
  105. 嵌入式 Linux 系统工程 105:Oops、panic 与内核调用栈
  106. 嵌入式 Linux 系统工程 106:hung task、soft lockup 与 hard lockup
  107. 嵌入式 Linux 系统工程 107:锁检查与内核调试配置
  108. 嵌入式 Linux 系统工程 108:PREEMPT_RT 与实时延迟
  109. 嵌入式 Linux 系统工程 109:时钟源、时间戳与对齐
  110. 嵌入式 Linux 系统工程 110:频率、温度与降频
  111. 嵌入式 Linux 系统工程 111:suspend、runtime PM 与唤醒
  112. 嵌入式 Linux 系统工程 112:watchdog、pstore 与故障现场
  113. 嵌入式 Linux 系统工程 113:cgroups、限制与资源压力
  114. 嵌入式 Linux 系统工程 114:namespaces、容器与设备访问
  115. 嵌入式 Linux 系统工程 115:案例:启动和根文件系统失败
  116. 嵌入式 Linux 系统工程 116:案例:摄像头无图、花屏与丢帧
  117. 嵌入式 Linux 系统工程 117:案例:NPU 变慢与缓冲分配失败
  118. 嵌入式 Linux 系统工程 118:案例:网络视频卡顿与帧龄
  119. 嵌入式 Linux 系统工程 119:案例:长期运行的内存与句柄增长
  120. 嵌入式 Linux 系统工程 120:整机验收与故障报告
嵌入式 Linux 系统工程 120:整机验收与故障报告的封面

第 120 / 120 课 · 隔离与综合工程案例。返回课程合集。

机制与资源关系

验收将功能、性能和恢复能力放在明确条件下测试。固定固件、硬件、模型和配置,定义吞吐、尾延迟、资源上限、温度及恢复时间。未执行的板端实验不能记为通过。

整机验收与故障报告的观察路径

实际用法与观察入口

以下是操作说明;先确认执行环境、工具帮助和目标对象。设备名、PID、地址及项目名示例需要按实际替换,不能将整段命令当通用板端脚本执行。

# 本课包含报告模板、资源索引和有界只读采集脚本
sh collect.sh

输出解读与排查顺序

每个结论关联原始证据及条件,区分已验证、条件有限和未执行。保存最小复现输入和修改前后对照;恢复成功仍需说明根因是否消除。

情境推演

修复后只跑一次启动成功不足以覆盖原本三天后出现的故障。回归至少覆盖触发条件、错误恢复和资源趋势,并把未完成的长期验证保留为未执行。

练习与参考分析

用本课模板完成一个故障闭环:现象→影响→证据→假设→实验→修复→回归。参考结论:只写“重启后正常”属于恢复记录,尚未完成根因分析。

独立实验包

有界只读采集和可填写模板;不执行板端压力、掉电、升级或可靠性测试。 默认入口、源文件和实际运行记录都在下载包中。

实验:整机验收与故障报告

查看完整代码:collect.sh
#!/bin/sh
set -eu
# /proc/self refers to each reader command, not a selected business process.
# Fixed allowlist: no environment, command lines, credentials or recursive traversal.
printf 'embedded Linux bounded read-only snapshot\n'
uname -srm
for file in /proc/uptime /proc/meminfo /proc/loadavg /proc/self/status /proc/self/limits /proc/self/cgroup /proc/net/dev; do
    printf '\nSOURCE %s (first 24 lines)\n' "$file"
    if [ -r "$file" ]; then
        sed -n '1,24p' "$file" || printf 'READ_FAILED %s\n' "$file"
    else
        printf 'UNAVAILABLE %s\n' "$file"
    fi
done
printf '\nEND snapshot; SDK, board revision and firmware manifest require manual entry\n'
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 sh collect.sh。

cd 'content/posts/驱动、bootloader、文件系统/嵌入式Linux系统工程/120-整机验收与故障报告/code' && sh collect.sh

Linux 资源速查表

资源 观察入口 使用与管理接口 常见故障与下一步
CPU/线程 /proc/PID/task、/proc/stat、top pthread、sched、affinity 热点/等待:分别取执行栈和阻塞证据
调度约束 /proc/PID/status、cgroup cpu.stat 调度策略、cpuset、cpu.max 空闲仍卡顿:查允许核和父组配额
用户内存 status、maps、smaps_rollup malloc/free、mmap/munmap 增长:关联对象数、共享页与平台期
内核内存 meminfo、slabinfo 驱动对象生命周期 持续增长:查看对象数与错误路径
连续与媒体内存 meminfo、reserved-memory、厂商统计 DMA API、dma-buf、SDK 缓冲池 分配失败:查区域、对齐、在途量与释放
文件句柄 /proc/PID/fd、limits、file-nr open/close、dup、CLOEXEC EMFILE:查句柄类型及关闭配对
存储 mounts、diskstats、df、/proc/mtd 文件系统/块层/MTD/UBI 慢或只读:查错误、写回与介质状态
设备绑定 /sys/bus、driver 链接、日志 驱动匹配、probe、资源管理 无节点:先查注册与绑定,再查 /dev 管理
MMIO/IRQ iomem、interrupts、softirqs 内核 MMIO、IRQ API 无完成:查提交、通知、清源和后续工作
GPIO/时钟/电源 gpioinfo、pinctrl/clk/regulator 调试信息 各内核资源框架 无响应:查复用、供应依赖及 runtime PM
网络 ip、ss、net/dev、抓包 socket、路由、过滤规则 逐层查链路、邻居、路由、连接及业务
视频/音频/显示 V4L2、media-ctl、ALSA、DRM 各子系统及厂商 SDK 查协商格式、队列所有权、时钟和呈现
电源与温度 cpufreq、devfreq、thermal、power PM 框架与策略 热态降速:对齐温度、频率和持续负载
故障现场 日志、core、pstore、符号产物 有界采集和受控调试 首错优先,保存精确构建和复现输入

这些入口并非每个 BSP 都有;不存在、不可读与数值为零必须分别记录。查询其他进程需相应权限。可写属性不得当普通配置文件盲写。

按现象查证据

现象 首先保存 第一轮判断 后续课程
程序无法启动 原始错误、ELF、挂载与身份 是否进入程序,加载器是否存在 89~95
高 CPU 每线程占用、固定窗口采样 有效计算、重试还是忙轮询 25~32、97~104
低 CPU 卡顿 线程状态、等待位置、业务进度 等锁、等设备、等数据还是配额 29、32、56、113
内存持续增长 RSS/PSS、对象数、池块和时长 预热、队列积压、泄漏或内核占用 33~40、119
有空闲但申请失败 请求大小、对齐、错误码、区域 限制、碎片、地址空间或特定池 38~39、117
删除后空间不降 df/du、inode、deleted 句柄 打开引用、挂载遮蔽或统计口径 41~48
设备不出现 运行设备树、绑定和 probe 日志 描述、匹配、供应依赖或 /dev 管理 57~64
摄像头无图/花屏 sensor mode、格式、stride、IRQ、帧号 出流、接收、缓冲、缓存或消费 76~80、116
网络不通 地址、具体路由、邻居、连接状态 链路→IP→传输→应用逐层验证 81~88
NPU/视频慢 分段时间、温度、频率、队列深度 算力不足还是排队/搬运/降频 104、110、117~118
偶发重启 首错、复位原因、pstore、供电证据 软件异常、看门狗、温度或供电 105~112

每轮只改变一个变量;复现前约定停止条件、资源上限和恢复办法。未知项保持未知,不能把日志里没有某事件当作事件没有发生。

工具与环境适用表

环境 常见可用入口 需要确认的条件 缺失时的替代
BusyBox BSP Shell、基础 ps/top、/proc、/sys applet 与选项按实际构建 读固定 proc 项,交叉编译所需工具
systemd 发行版 systemctl、journalctl PID 1 和日志策略确为 systemd 查看实际 init 脚本及文件日志
Buildroot 构建配置、自有包、overlay 工具是可选包,内核独立配置 加入正式工程输入后重建
Yocto layer、recipe、image、SDK 分支、MACHINE、DISTRO 和版本匹配 查展开变量和任务日志
容器 容器自身 /proc、挂载、网络视图 namespace、capability、设备策略 在受控宿主采集对应视图
strace/GDB 用户程序调试 ptrace 权限、符号及架构 应用错误日志、离线 core 分析
perf CPU 事件和采样 PMU、配置、权限和符号 时间戳、用户态 profiling、tracepoints
ftrace 内核事件/函数 tracefs、配置、权限、缓冲 限量内核日志、应用埋点
eBPF 事件统计和动态观测 程序类型、helper、BTF、加载权限 已有 tracepoint 或用户态观测
硬件测量 波形、链路、电源证据 仪器、接法、带宽和额定范围 只能标未测,软件模型不能替代

不要把 GNU 命令选项直接套给 BusyBox。工具的 --help 与版本输出优先于照抄网页;内核文档也应切到目标 BSP 对应版本核对。

板端实验与故障报告模板

身份与条件

  • 硬件型号/修订/编号:待填
  • 内核、设备树、根文件系统、SDK、模型、配置校验:待填
  • 工具链及工具版本:待填
  • 输入、负载、温度、供电、运行时长:待填
  • 权限、内核配置与缺失功能:待填

实验协议

  • 目标与可证伪假设:待填
  • 操作步骤及只读/状态变更分类:待填
  • 预期结果、通过阈值、停止条件:待填
  • 恢复与回退方法:待填
  • 观测开销与时钟域:待填

证据与结论

项目 预期 实际 原始证据 状态
功能闭环 待定 未测 无 未执行
吞吐/尾延迟 待定 未测 无 未执行
内存/句柄/缓冲趋势 待定 未测 无 未执行
热稳态与长期运行 待定 未测 无 未执行
异常恢复/升级回退 待定 未测 无 未执行

状态只使用:已验证、条件有限、未执行、失败。假设、观察值和最终结论分开记录。

修复与回归

记录现象、影响、首次出现版本、最小复现、排除过程、根因证据、修复行为及回归范围。重启恢复不等于根因已修复。未完成的长期验证继续保留为未执行。

官方资料与版本边界

内核、工具和厂商 BSP 的支持范围需分别核对。参考资料可能对应较新版本;不要据此推定旧 BSP 支持所有接口。

上一课:案例:长期运行的内存与句柄增长