定义
A/B Partition(A/B 分区)将设备存储分为 A、B 两套分区,当前运行分区与待升级分区分离。OTA 升级时写入空闲分区,重启后切换,失败时可快速 Rollback 回滚,实现无缝升级。
工作原理
A/B 分区采用双系统槽位(Slot A 与 Slot B)设计。设备运行时仅激活其中一个分区作为主系统,另一分区保持空闲或作为备份。当发起 FOTA 固件升级时,新固件被下载并写入空闲分区,校验通过后更新启动标志,下次重启时从新分区启动。若新固件运行异常,可通过启动标志快速切回原分区,实现秒级回滚,无需重新下载或刷写。
技术优势
相比单分区升级,A/B 分区具有以下优势:升级过程不破坏当前运行系统,降低变砖风险;回滚无需重新下载,仅需切换启动分区;支持原子化切换,业务中断时间可控制在一次重启内;适用于对可用性要求高的工业设备、车载终端、智能表计等场景。
存储与实现考量
A/B 分区需要设备具备至少双倍系统分区存储空间,对 eMMC、NOR Flash 等存储介质有明确容量要求。实现时需与 Bootloader、分区表(如 GPT)及 OTA 客户端协同设计,确保分区边界、启动逻辑与 Firmware Signature 校验流程一致。
槽位切换何时才允许发生
A/B 分区的技术含义,是引导程序在任意时刻只承认一个活动槽,另一个槽专门承接这次升级。空闲槽写完新镜像之后,不能立刻把它当成已生效的系统;必须同时满足镜像校验通过、版本号可读、启动标志已经指向新槽,下一次复位才会改从新槽启动。因此它只适合系统镜像能够完整放进单个槽、存储介质还能再留出同等容量、并且业务允许一次重启的终端。闪存已经被现有系统占满,或者控制回路不能接受重启的设备,不具备划出对等槽的条件。规划容量时还要把证书、启动日志和只读资源算进单槽体积,否则写入会在空闲槽中途因为空间不足停住。
落地前要让引导程序、分区表和升级客户端对槽位编号使用同一套约定。写入期间活动槽保持可启动,空闲槽才是唯一允许擦写的区域。独立的数据分区和配置分区不要划进 A 槽或 B 槽,否则回切系统时会把现场参数一起丢掉。旧槽在新系统被确认稳定之前必须保留,回滚才只是改启动标志,而不必重新下载整包。OTA 任务若要求中途断电也能退回旧系统,就要把“先确认再回收旧槽”写进升级状态机,不能把下载完成当成可以擦掉退路的信号。
启动标志和镜像校验对不上
常见错误是把增量包的差异块直接写入空闲槽,设备上却没有先合成完整镜像。引导程序只能启动完整系统,残缺槽一旦被标成可启动,复位后新槽进不去,旧槽也可能因为标志已经改掉而不再被选中。另一类错误是云端、升级客户端和引导程序各记一套槽位号:任务显示写入成功,设备实际仍从旧槽运行,下一轮升级就会把正在运行的槽当成空闲槽覆盖。槽位号如果从零开始和从一开始混用,这种错位在小批量试产时不一定暴露,批量推送后才会成片出现。
整槽刷写还会放大闪存磨损。版本发布很密时,应先判断差异是否适合在设备侧合成,而不是默认每次都擦写整槽。写槽过程中掉电,应当只作废空闲槽,运行槽保持可启动;若程序为了腾空间先擦掉运行槽,双槽就失去退路。新槽启动后若只跑了很短时间就回收旧槽,随后暴露的配置不兼容将无法回切。确认稳定的条件应来自设备自己上报的运行结果,例如关键服务已拉起、配置可读,而不是云端下载进度走到百分之百。电源、看门狗和引导重试次数也要一起设计,避免新槽反复崩溃却没有机会把启动标志改回去。
旧槽被提前回收之后
双槽设计里,旧槽是唯一不依赖网络的退路。新槽只要还没有用真实业务跑过一个完整周期,旧槽就不该被下一次升级或日志清理擦掉。有的实现把启动成功理解成引导程序刚交出控制权的那一瞬间,于是新系统刚挂上文件系统、应用尚未读到原有配置,云端已经允许回收旧槽。随后应用因为配置不兼容退出,看门狗复位,引导程序却发现旧槽已被标成无效,设备就停在两边都起不来的状态。判断稳定应当来自设备上报的应用级结果,例如关键任务已运行、能读到原有配置、能再次与平台握手,而不是下载进度或引导程序的第一行日志。
容量规划时还要给回滚留出擦写余量。若空闲槽的剩余空间只够这次镜像、不够保留校验数据和启动标志的备份,掉电会把标志写成半截,下次上电无法判断该信哪一个槽。试验室用较大的存储通过,量产换成容量刚好的型号,就只会在量产批次上出现。升级状态机应把可回滚、已确认、允许回收分成三步,每一步都有失败后的停留状态,不允许从下载完成直接跳到回收。现场抽查时,至少要能看到当前活动槽、另一槽是否仍完整,以及上一次切换是因为升级成功还是因为新槽启动失败。