当前位置:首页>Linux>【Linux面试题】: 在做OTA升级时双分区切换时你所做的可靠性保障措施有哪些?

【Linux面试题】: 在做OTA升级时双分区切换时你所做的可靠性保障措施有哪些?

  • 2026-10-11 07:16:22
【Linux面试题】: 在做OTA升级时双分区切换时你所做的可靠性保障措施有哪些?
Hello,大家好,我是程序媛MM。

本文约1200字,结合我所做过的项目经验加AI补全的(低电压禁止写入)的保障措施来整理这道面试题的答法。

关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。


我分四层说下双分区 OTA 切换整套可靠性保障措施,从下载、校验、写入、切换回滚完整流程。

1. 下载阶段:防止固件包损坏、中途断连

  • 传输校验:OTA 包本身带 MD5 / SHA256 哈希,下载完先校验MD5/哈希,不对直接丢弃报错。
  • 断点续传:不用每次从头下,网络波动不用重来。
  • 包大小校验:提前比对预期固件长度,避免半截残缺包写入备用分区,报错直接提示大小不对。

2. 写入备用分区:防止写坏 Flash、断电变砖

  • 写之前擦除完整备用分区,不覆盖正在运行的主分区,系统全程跑旧分区,业务不中断
  • 写入过程按块分步写,每写一块做块校验
  • 底层加硬件保护:
    • NAND 用 UBI/UBIFS 自带坏块检测,写到坏块自动跳过
    • eMMC 开启硬件 ECC 纠错
  • 全程监控供电,低电压直接终止写入,禁止低压刷写

3. 切换标记 + 校验:不轻易切分区,多重验证再生效

固件完整写入备用分区后,不立刻切系统,做三层校验:

  1. 分区文件系统自检:UBIFS / SquashFS 超级块、索引完整性检查
  2. 内核镜像校验:zImage / Image 自带签名校验,防止篡改固件
  3. 产品自定义签名校验:后台固件带 RSA 签名,私钥服务器加密、设备公钥校验,拦截恶意包

三层全部通过后,只在独立分区(环境变量分区)写一个升级就绪标记,不改动正在跑的主分区。

4. 启动切换与自动回滚(最核心防砖机制)

设备重启进 U-Boot,先读升级标记:

  1. 标记存在,尝试启动备用新分区
  2. 启动新增看门狗 + 启动重试计数:
    • 启动成功、上层应用完全跑起来后,内核 / 应用清除升级标记、重置重试计数
    • 一旦备用分区启动失败(内核崩溃、挂载失败、看门狗超时),重试次数用完,U-Boot 直接清空升级标记,永久切回原主分区,下次开机直接跑旧系统
  3. 分区互斥逻辑:主、备分区永远只激活一个,不会出现两个分区同时激活错乱
  4. 回滚不删旧固件:回滚后主分区完好可用,不用重新下载旧包

5. 兜底附加保障

  • 独立小分区存升级状态标记,不和根文件系统共用,根分区损坏也能读切换标识
  • 写标记做双重备份,避免写标记时断电丢失状态
  • 业务层增加升级风险提示:升级中途禁止关机、插拔电源
  • 日志全留存:下载、写入、校验、启动失败日志存 Flash,出问题可定位哪一步失效

收尾总结

整套逻辑核心就是:

不动正在运行的系统、多重校验再标记、启动失败自动回滚

全程任意阶段断电、包损坏、固件异常都不会变砖。


精简口述短版(面试官让简短回答时用)

双分区 OTA 可靠性主要靠五步闭环保障:

  1. 下载完MD5/哈希、签名双重校验,过滤损坏和恶意固件
  2. 只写入备用分区,全程不改动当前运行系统,写的时候分块校验、底层屏蔽 Flash 坏块
  3. 写完合格才写独立分区的升级就绪标记,不直接切换
  4. U-Boot 启动时做重试计数,新分区启动失败自动切回旧分区回滚
  5. 单独分区存升级状态,配合看门狗、低压保护、升级日志兜底,任何环节断电都不会变砖

附加说明:在双分区切换机制策略中,也可设计成运行分区损坏,从备份分区搬运数据到运行分区,确保系统可正常运行。不用从运行分区和备份分区来回切换的方法。

往期文章(欢迎订阅技术分享栏目全部文章):

【项目实战】Linux 下 OTA 升级系统成砖问题排查与解决 (第一次遇见的现象,不要错过)
【项目实战】SPI Nor Flash下OTA升级概率失败导致系统成砖问题的排查和解决方法
Linux文件读写原理、分片策略、异常处理及 OTA 低内存落地实践

“谢谢你看到这里”

这里是女程序员的笔记本

 15年+嵌入式软件工程师兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

最新文章

随机文章