一、AB分区系统概述

什么是AB分区

AB分区,说白了就是把系统存储区一分为二。

一块叫A分区(slot A),一块叫B分区(slot B)。两个分区里都装着完整的系统镜像——内核、驱动、文件系统、应用,一个都不少。你想想看,这就像你家里备了两把钥匙,一把丢了还有另一把。

我最早接触AB分区是在做某款车载设备的时候。客户要求设备在OTA升级过程中不能黑屏超过3秒。嗯,传统的单分区方案根本做不到,AB分区几乎是唯一的选择。

核心概念:AB分区不是把系统拆成两半,而是两个完整的系统副本。A区和B区各自独立,互不干扰。

AB分区的优势

为什么越来越多的设备采用AB分区?我总结了三个最实在的好处:

优势 说明 我见过的坑
无缝升级 升级在后台进行,用户无感知 某次升级中用户正在玩游戏,传统方案直接重启,被投诉到产品经理那里
安全回滚 升级失败自动切回旧分区 曾经有个项目,升级到一半断电,AB分区自动切回旧系统,设备完好无损
降低变砖风险 始终有一个可启动的系统 单分区设备刷机失败就是真砖,AB分区至少还能进recovery

我个人习惯把AB分区比作「飞机的双引擎」。一个引擎出问题了,另一个还能撑住。单分区就像只有一个引擎的螺旋桨飞机——出点事就往下掉。

AB分区的工作原理

工作原理其实不复杂。我画了一张图,你看完就明白了:

AB分区升级工作流程 当前运行:A分区 空闲:B分区 空闲 下载升级包 写入B分区 校验完整性 标记B分区为活动 重启 → B分区启动 关键点:升级期间A分区仍在运行 用户正常使用设备,完全感知不到升级 如果B分区写入失败,A分区继续运行 设备永远不会进入不可用状态 升级失败 → 自动回退到A分区

流程其实就这几步:

  1. 设备在A分区正常运行——用户该干嘛干嘛
  2. 后台下载升级包到B分区——完全不影响A分区
  3. 写入并校验B分区——确保数据完整
  4. 标记B分区为活动分区——告诉bootloader下次从B启动
  5. 重启设备——从B分区启动,升级完成

我的经验:校验这一步千万别省。我曾经遇到过一个案例,升级包下载过程中网络波动导致数据损坏,但因为校验机制完善,系统自动丢弃了损坏的包并重新下载。如果没做校验,刷进去就是一块砖。

分区布局与元数据

AB分区不只是两块存储区域。每个分区还附带一个元数据区域,里面存着关键信息:

元数据字段 作用 取值示例
分区状态 标记分区是否可启动 active / inactive / unbootable
升级计数 记录尝试启动次数 0 ~ 7(超过阈值回滚)
版本号 标识系统版本 v2.1.0 / v2.2.0
校验哈希 验证分区完整性 SHA256 值

bootloader在启动时会读取这些元数据。如果当前活动分区启动失败,计数会递增。超过阈值后,bootloader自动切换到另一个分区。

注意:元数据区域通常放在独立的小分区里(比如misc分区),或者放在分区末尾的预留空间。千万不要把元数据和系统数据混在一起,否则格式化系统分区时会把启动信息一起干掉。我见过有人这么干过,后果很惨。

AB分区 vs 传统单分区

做个对比,你就知道为什么AB分区是趋势了:

对比项 传统单分区 AB分区
升级方式 覆盖写入,必须重启进入recovery 后台写入,重启即切换
升级耗时 设备不可用期间(5~15分钟) 几乎为零(重启时间)
失败恢复 需要人工干预或进recovery刷机 自动回滚,无需用户操作
存储占用 1份系统镜像 2份系统镜像(约多占1~2GB)
适用场景 低端设备、存储受限设备 中高端设备、车机、IoT网关

嗯,这里要注意。AB分区不是银弹。如果你的设备存储空间只有4GB,硬上AB分区会导致用户可用空间被严重压缩。我建议存储低于8GB的设备慎重考虑。

小结

AB分区的核心思想就一句话:用空间换可靠性。多占一份存储,换来的是无缝升级和自动恢复能力。在车机、医疗设备、工业控制这些「不能挂」的场景里,AB分区几乎是标配。

我个人做过的项目里,AB分区帮我救过至少三次场。一次是升级包在传输过程中被截断,一次是文件系统写入时掉电,还有一次是内核新驱动有bug导致无法启动。三次都是AB分区自动回滚,设备完好如初。要是单分区,这三台设备都得返厂。