ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

配电终端安全启动与OTA升级:国产化平台下的可靠固件方案

配电终端安全启动与OTA升级:国产化平台下的可靠固件方案 去年做配网终端项目的时候我最怕的不是主站通信协议调不通也不是485抄表偶尔丢帧而是凌晨两点被电话叫醒“XX台区的终端离线了可能固件挂了你们派人带电脑去现场刷机。”配电终端这行当设备散在户外、无人值守环境说不上好固件升级却只能靠人工。后来我们换了思路把安全启动和OTA一次做进产品里再配合国产化主控平台总算把“刷机”这件事从现场搬到了远程而且能抗住断网、断电、人为误操作这些乱七八糟的意外。这篇文章围绕“配电终端安全启动OTA国产化方案”这个主题把我在基于米尔-全志系列核心板的实际项目中做过的设计、踩过的坑、改过的代码完整梳理一遍。内容包括安全启动的信任根体系怎么建立、密钥和eFuse怎么管、OTA怎么设计双分区回滚、国产化平台怎么选怎么裁以及最后落地时经常遇到的一堆问题。适合正在做配网终端、充电桩、光伏网关等设备的嵌入式开发者也适合想了解工业级安全启动和OTA到底怎么落地的朋友。1. 配电终端的安全与升级痛点到底卡在哪1.1 户外无人值守环境对固件提出的两个硬性要求配电终端跟消费电子产品最大的区别是它几乎不存在“人在现场”这个前提。设备挂在台区变压器旁边、环网柜里、电缆分支箱里一年到头没人碰它但它的重要性却不低——继电保护、漏电监测、负荷控制都靠它跑。环境还要面对雷雨、凝露、粉尘、高温通讯倒是其次固件本身能不能稳定跑上好几年才是底线。这就引出了两个交集需求。第一个需求是安全固件必须只运行被信任的镜像不能让任意一段被篡改的代码在终端上执行。第二个需求是可靠升级固件总会有修bug、加功能的时候而升级过程如果因为断网、断电卡在中间设备就变砖了。户外场景下“变砖”意味着必须派人带着串口线和烧录器去现场拆机成本极高而且故障窗口期内这台终端就是失控状态。安全启动和OTA本质上就是在回答这两个问题。安全启动保证“跑起来的代码是我签过名的”OTA保证“升级失败了还能退回来”。两者最好一起设计因为一旦引入远程升级通道攻击面就扩大了如果升级通道本身没有安全防护攻击者就可能伪造升级包直接拿下设备。所以OTA必须跟安全启动共用一套信任体系而不是各做各的。1.2 传统本地升级方式为什么越来越走不通早些年配电终端的固件升级方式很朴素串口、JTAG、SD卡拷贝甚至直接拆flash芯片用编程器读写。这些方式在设备数量少、功能简单的时候勉强能用但现在的问题是数量上去了部署点分散而且还有信息安全审计要求谁在什么时间升了什么版本必须能追溯。本地升级操作过程很难留痕现场人员水平也参差不齐升错文件、升到一半拔线的情况我见过不止一次。另外本地升级本身没有完整性校验。串口烧写经常出现一个字节错误导致整体起不来而过程中几乎没有任何提示。就算烧写成功也很难确认写入的镜像是不是正是该版本。对比下来OTA加安全校验是一条更稳的路升级包有签名、有哈希、有版本控制升级过程有状态记录失败有回滚全部可追溯。还有一个很现实的问题很多终端部署时根本没有预留本地升级接口。为了防水防尘外壳一封串口都不引出来。这种情况下远程升级不是可选项而是唯一选项。1.3 国产化从选做题到必答题平台怎么选在芯片供应紧张的背景下“国产化”已经不是口号而是实打实的工程约束。我经历过进口主控芯片交期从8周拉到40周甚至更久项目排期直接崩掉的痛苦。后来采购团队给的压力越来越大技术侧也必须给出国产化平台方案。这里要区分一个误区国产化不是说把所有进口芯片换成国产芯片就完事而是整条供应链、工具链、软件栈都要可控。主控用国产芯片只是第一步引导程序、内核、文件系统、开发工具这些是否完整、能否长期维护同样关键。我在这几个维度上筛过好几家最后落在米尔-全志系列核心板上。全志的T507/T113等平台在工业控制领域出货量大米尔又做了完整的核心板、底板参考设计、系统镜像和文档开发门槛比直接从原厂SDK开始低很多。后面第4章我会详细展开选型逻辑这里先立个结论国产化平台要选“芯片模组软件生态”整体成熟的而不是只看芯片本身。2. 安全启动全链路从信任根到镜像验签2.1 安全启动到底在防什么和PC安全启动有什么区别很多人一听到安全启动就联想到PC上的Secure Boot觉得网上下一个“安全启动证书补丁”就能搞定。其实嵌入式设备的安全启动跟PC完全是两回事。PC的安全启动依赖UEFI固件里预置的证书数据库系统启动时校验引导加载程序的签名这套体系建立在BIOS厂商的信任链上。而嵌入式安全启动的信任根在芯片内部——也就是SoC出厂固化的Boot ROM它不可写、不可改是整条信任链的源头。那安全启动到底在防什么最核心的是防“固件被替换”。攻击者如果拿到了终端的物理访问权或者通过网络漏洞往flash里写入了恶意镜像下次启动时整机就跑的是攻击者的代码设备就彻底失守了。安全启动通过逐级验签来解决这个问题Boot ROM校验SPL和U-BootU-Boot再校验内核和根文件系统任何一级签名不对就拒绝启动。在配电终端这个场景里还有一个更现实的意义满足信息安全审计要求。电网侧的设备资产清单里固件版本、启动方式、校验策略都要可查没有安全启动的终端在入网审查时基本过不去。所以不要把它理解成“可选的安全功能”在很多项目里它是硬门槛。2.2 密钥体系怎么搭根密钥、镜像密钥和eFuse安全启动的信任链最终要落到密钥上。实际项目中我用的是一套三级密钥体系根密钥、中间密钥、镜像密钥。根密钥是整个体系的最高权限只在生产环境中使用平时锁在保险柜里。中间密钥负责签发下一级镜像密钥则专门用来对bootloader、内核、文件系统镜像签名。eFuse是存放信任根信息的地方。这是芯片内部一次性可编程存储烧进去之后没法改。全志平台一般会把根密钥的公钥哈希烧到eFuse中启动时Boot ROM对比镜像签名的公钥是否匹配匹配才往下走。这里必须强调一个容易出大事故的点eFuse烧录不可逆一旦烧错或者密钥丢失主板直接报废。我在生产导入时吃过这个亏后面专门写了一套双人复核机制烧录命令执行前必须经过第二个人确认hash值。密钥管理上还有几个不能省的操作。一是私钥绝不能出现在开发机上更不能提交到代码仓库里。二是开发环境、测试环境、量产环境的密钥必须分开开发板用一套测试密钥产线烧录用另一套真密钥。三是私钥备份必须有冗余至少三个介质、存放在不同的人手里丢失任何一个都能恢复出私钥但同时必须有明确的使用记录制度。下面是一个典型的密钥生成流程用RSA-2048做示例# 生成根密钥对 openssl genrsa -out root_private.pem 2048 # 生成中间密钥对 openssl genrsa -out intermediate_private.pem 2048 # 生成镜像密钥对 openssl genrsa -out image_private.pem 2048 # 提取公钥后续用于eFuse烧录和镜像验签配置 openssl rsa -in root_private.pem -pubout -out root_public.pem openssl rsa -in intermediate_private.pem -pubout -out intermediate_public.pem openssl rsa -in image_private.pem -pubout -out image_public.pem公钥生成后需要把根公钥的哈希值整理成固定格式通过全志平台提供的安全烧写工具写入eFuse。这个过程不是简单的文件拷贝需要进入量产模式具体的工具和命令在不同型号上有差异操作前一定把原厂文档对着看一遍。2.3 基于米尔-全志核心板的安全启动落地配置上面讲的都是理论和框架实际在米尔-全志系列核心板上配置安全启动大概分成五步。这套流程我在T507和T113两套平台上都跑通过和米尔官方SDK能对应上。第一步编译带安全启动支持的U-Boot。需要打开CONFIG_SECURE_BOOT相关的配置同时把验签密钥的公钥编进U-Boot镜像中。注意这里用的公钥必须与eFuse中烧录的根密钥匹配否则就算镜像签名正确也过不了Boot ROM的校验。第二步生成签名镜像。Boot ROM验签SPL、U-Boot的过程以及U-Boot验签内核和DTS的过程使用的是同一套签名工具链。签名动作通常在编译服务器上完成签名时会把bootloader镜像、内核镜像、设备树文件一起打包先把多个二进制整理成固定格式再用镜像私钥计算签名并追加到镜像尾部。签名后的镜像才允许烧入启动介质。第三步烧录eFuse。这一步我只建议在产线阶段做开发阶段完全可以用跳线或测试密钥跳过。烧录前要确认主板型号对应的eFuse地址映射以及当前是否已经烧过——已经烧过的板子再烧会直接报废。烧录完成之后板子就被“锁定”在安全启动模式下了后续任何启动介质上的镜像都必须是签名过的。第四步烧录签名镜像并验证启动。U-Boot烧到SD卡或eMMC对应分区上电后通过串口日志观察Boot ROM打印的验证信息。正常启动会有类似“SPL验证通过”“U-Boot验证通过”的提示如果不是就要根据错误码定位是哪一级验签失败了。第五步配置强制验签策略。默认配置下U-Boot可能会允许“如果DTS校验失败则继续启动”这在开发时方便量产时必须关掉。同时把网络启动、USB下载等后门入口全部关掉防止有人通过U-Boot命令行绕过安全策略。一个很容易忽略的细节安全启动不仅仅是启动阶段的一次验签。U-Boot启动内核后如果内核无法校验rootfs那整个信任链就断了。所以在根文件系统层面也要做校验要么把整个rootfs做成签名镜像由U-Boot加载前验签要么启用内核的IMA/EV机制对关键文件做实时度量。我在配网终端上选择的是前者——启动时一次性校验整个rootfs镜像实现简单性能开销也小。3. OTA升级设计全量包、双分区与失败回滚3.1 配电终端的OTA和手机/路由器的OTA有什么不同消费领域的OTA大家都很熟悉手机有新系统推送路由器有固件升级点击一下等几分钟就完成。但配电终端的OTA不能照着这个思路做。最大的区别在于“重启预算”——手机重启几次没人管但配电终端每次重启都可能造成一次控制中断尤其是升级过程中发生了保护命令下发设备却不在服务状态后果会很严重。所以配电终端的OTA有几个硬约束。第一升级窗口要可控一般放在夜间低谷或者调度允许的检修窗口而且要支持主站远程指定升级时间。第二重启次数要尽可能少理想情况下一次升级只重启一次。第三升级失败不能“变砖”必须能自动回滚到上一个可用版本。第四通信链路不稳定配网终端很多通过4G或载波通信接入带宽小、时延大动不动还断线OTA通道必须支持断点续传和超时重试。另外配电终端的OTA协议一般不能直接走互联网那一套公网推送而是要从主站系统主动下发终端只作为被动接收方。这个架构上和手机厂商的推送服务差异很大OTA指令、升级包、确认消息都嵌入到已有的配电通信协议里或者走一个单独的业务端口与电网业务流量隔离。网上那些“OTA提取器”“OTA镜像工具”之类的基本是手机圈玩法工业终端用不上工具链完全不一样。你要的不是从系统里提取升级包而是自己构建一条完整的升级包生成、签名、下发、验证、激活链路。3.2 全量包还是增量包这里做个取舍OTA升级包有两种基本形态全量包和增量包。全量包就是完整的新版本镜像体积大但简单可靠下载完直接写到备份分区不依赖当前固件的状态。增量包是计算新旧版本之间的差异生成一个diff文件比如用bsdiff这类算法体积小很多但目标设备必须知道自己当前版本而且diff文件的合成过程容易受设备端文件差异影响一旦设备文件被改动过增量包可能无法应用。配电终端这种场景我的建议是无脑选全量包。原因有几个终端本身的镜像大小不算夸张一个包括内核和rootfs的完整镜像一般几十MB到一百多MB在4G网络下即便慢一点也能在可接受时间内完成更重要的是全量包逻辑简单不容易出幺蛾子。增量包省下的那点流量在配网通信环境里意义不大但引入的复杂度非常大需要设备端维护准确的版本基线还要处理补丁应用失败的情况对无人值守设备来说风险不值得冒。不过全量包不代表不做优化。升级包内部仍建议对rootfs做压缩比如squashfs、ext4镜像压缩后传输到设备端边解压边写入这样可以显著缩小传输体积。另外断点续传必须做终端记录已下载的偏移量通信恢复后从断点继续下载而不是从头再来。我实测在4G信号不太稳定的台区没有断点续传时一个大包往往要拉四五次才能完整下来有了续传后一次断线也能续上。3.3 A/B双分区方案与U-Boot回滚逻辑双分区OTA是嵌入式行业里被验证过很多次的方案。简单说系统里跑两个完整的系统分区一个active区一个standby区。平时终端从active区启动收到升级包后写入standby区写入完成并通过校验后把启动标识切换到standby区重启完成切换。如果新系统启动失败U-Boot会自动切回老的active区。分区规划的典型布局大概是这样的/dev/mmcblk0p1 bootloader (SPL U-Boot需签名) /dev/mmcblk0p2 rootfs_a (active系统) /dev/mmcblk0p3 rootfs_b (standby系统) /dev/mmcblk0p4 data (配置、日志、临时文件) /dev/mmcblk0p5 ota_meta (OTA状态、启动计数)注意bootloader分区本身不在双区覆盖范围内。bootloader是整个OTA流程的裁判员它必须在任何情况下都能正常启动而且不能因为升级半截断电就损坏。所以bootloader分区升级需要特别谨慎或者不做OTA覆盖只通过安全启动的签名校验保证其可信要么使用更高级的“A/B bootloader”方案——但这样复杂度和风险都会上升一般配电终端做到rootfs双区就够了。U-Boot里的回滚逻辑也不复杂大致是这样一个流程if [ $upgrade_available 1 ]; then # 如果存在升级标记说明上次升级未确认或未完成 setenv boot_part standby if mmc read ... standby_part bootm; then # 新系统启动成功由应用层确认后清除标记 setenv upgrade_available 0 saveenv else # 新系统启动失败回滚到active区 setenv boot_part active setenv upgrade_available 0 saveenv bootm fi fi关键是“upgrade_available”这个标记。新系统启动后业务进程要主动向主站确认版本信息和运行状态确认正常后才清除标记。如果业务进程没起来或者状态上报异常标记就一直保留下次重启又会触发回滚。这里要配合看门狗应用层在启动后若干秒内必须喂狗否则硬件看门狗触发复位U-Boot重新判断标记并回滚。这样即使升级后的系统内核能启动但应用卡死也能自动退回老版本。3.4 一份能落地的OTA升级包完整流程长什么样把升级包的生命周期完整列一遍从构建到生效大概有七个阶段。阶段一构建环境生成新版本镜像。在可信的编译环境上产出rootfs_a或rootfs_b对应的完整镜像这个镜像必须先通过安全启动的签名流程。阶段二制作升级包描述文件。描述文件是设备的“操作说明书”包含硬件版本、源版本、目标版本、镜像镜像的哈希值、目标分区编号、升级后是否需要清空数据等字段。阶段三签名和封装。用镜像私钥对描述文件和镜像哈希做签名把描述文件、签名、镜像文件一起打包成升级包。阶段四上传到OTA服务器。这里是主站侧的软件平台配电项目里一般就是运维主站的升级服务模块负责给终端下发升级任务和传输升级包。阶段五终端下载并校验。终端通过HTTP或私有协议下载升级包下载过程中实时计算哈希并支持断点续传。下载完成后先用内置公钥验证签名再用描述文件里的哈希比对镜像全部通过才允许进入写入阶段。这一步绝对不能省否则伪造升级包直接就能打进设备。阶段六写入standby分区。解压镜像后逐块写入rootfs_b或者rootfs_a取决于当前active是哪个写入过程中每写完一个块可以回读校验一次防止eMMC坏块导致数据不一致。写入完成后更新ota_meta里的升级标记执行一次sync强制落盘然后重启。阶段七切换确认。U-Boot根据标记和boot_part跳到新分区启动新系统的业务进程起来后主动上报版本主站确认运行正常终端再清除升级标记整次升级正式生效。一台终端从开始下载到新系统上线整个过程正常情况在10到30分钟内完成主要取决于网络速度。如果中途断电重启后看门狗和升级标记会引导系统回滚或重新进入升级流程不会出现永久变砖。4. 国产化平台的选型、系统裁剪与可靠性验证4.1 米尔-全志系列核心板为什么适合配网终端选型这件事我在前面已经提到过结论这里把判断依据展开。配电终端的主控选型有几个硬指标工业级温度范围、足够的接口资源、长期供货保障、完善的BSP支持。全志T507是四核Cortex-A53主频1.5GHz左右带GPU和硬件编解码对于配网终端常见的本地显示、通信协议处理、边缘计算任务都够用。T113则是双核Cortex-A7定位更轻量适合功能相对简单的采集终端。米尔把全志芯片做成核心板价值在于把最考验硬件设计能力的部分——DDR走线、电源时序、EEPROM、时钟、最小系统——都提前做好了而且通过了工业级验证。我只需要把核心板通过邮票孔或者板对板连接器焊到自己的底板上把外围接口电路画好就行。这样不仅开发周期大幅缩短硬件稳定性也有了保底。软件生态上米尔提供的SDK包含交叉工具链、U-Boot源码、内核源码、文件系统构建脚本并且有比较完善的中文文档和售后支持。这对国产化方案的落地非常重要遇到问题能找到人问而不是对着英文论坛和上游社区自己啃。而且米尔在全志平台上长期做迭代很多坑他们已经踩过了用户不需要重复踩。还有一点是长期供货。配电终端的生命周期通常是5到10年中间不能因为主控停产就重新设计。工业级核心板在这方面有明显优势供货周期和产品生命周期都会拉得比较长这是方案选型时必须考虑的隐性成本。4.2 系统裁剪、分区规划与启动链适配国产化平台拿到手第一件事不是急着写业务代码而是把系统裁到一个可维护的规模。底层的Yocto或Buildroot构建环境里默认会编出一堆用不上的模块。我在配网终端上做裁剪时基本原则是“只留业务需要的东西”。比如剪掉蓝牙、Wi-Fi驱动、桌面环境、不必要的音频编解码以及各种杂七杂八的虚拟文件系统工具。裁剪一方面减小了镜像体积更重要的方面是减少了攻击面系统里少一个服务就少一个可能被利用的漏洞。分区规划也要在裁剪阶段同步确定。如果整个rootfs做成只读的squashfs写操作全部放到独立的data分区那运行时文件被篡改的概率会小很多。OTA升级时直接换一个只读rootfs镜像不需要担心文件系统的脏状态。不过只读rootfs会影响一些需要写/etc的软件需要把/etc、/var等目录重定向到overlayfs这个细节很容易被忽略处理不好会导致升级后配置丢失。启动链适配是另一个关键环节。米尔核心板的默认SDK里U-Boot配置通常是面向开发板的要在量产的配电终端上跑需要做几个调整把启动参数中的串口调试关闭或重定向到受控日志接口禁止进入U-Boot命令行配置默认bootcmd直接加载签名后的内核和DTS设置启动延时尽量短减少无谓的等待时间。这些改动看起来不大但在无人值守设备上都很关键——任何一条暴露出来的调试入口都可能成为被利用的窗口。4.3 安全与可靠性验证不只跑通还要扛住方案设计得再好没有足够的可靠性验证上量之后就是灾难。我自己的经验是安全启动和OTA的验证分为四层。第一层是功能验证也就是证明确实能启动、能升级这层在开发阶段就能完成。第二层是异常验证重点模拟各种故障场景升级包签名错误、哈希不匹配、下载中断、写入半截断电、新系统启动后应用崩溃。每一种情况都要跑一遍确认不会变砖。第三层是环境可靠性验证也就是高低温、浪涌、ESD这些标准测试配电终端还要额外考虑交流失电、电压跌落、频率偏差等电力现场特有的工况。OTA过程中的断电测试尤其重要我在测试时专门用一个可控继电器在升级的任意阶段随机切断电源跑了上百次循环确保任何时间点断电后设备都能靠回滚机制恢复。第四层是信息安全验证。这层要验证的不是“能不能启动”而是“非法的东西进不来”没有签名的镜像不能启动、篡改过的镜像不能启动、旧版本的升级包不能重放。上面提到的版本管理和重放防护在这里就要发挥作用的升级脚本里必须检查目标版本号不能低于当前版本除非是明确标记的回退操作。5. 实操复现与高频问题排查5.1 从零跑通一次带安全启动的OTA分步演示这节写下我在开发板上从零搭建一套demo的完整过程大家可以照着操作实际项目里把路径换成量产配置即可。准备工作一块米尔-全志系列核心板加底板、一条USB转串口线、一张用于启动的SD卡或eMMC以及编译服务器上搭好的SDK。首先在SDK里编译好U-Boot、内核、rootfs生成签名完成的镜像。然后做分区。在开发环境里用fdisk或gpt工具将SD卡分成五个分区bootloader、rootfs_a、rootfs_b、data、ota_meta。rootfs_a/b各分配足够空间建议至少比rootfs镜像大20%预留一些余量。接着烧录签名后的bootloader和rootfs_a到对应分区同时把包含镜像密钥公钥的U-Boot配置编译进去。上电后从串口观察启动日志确认第一个bank能正常进入系统。再制作一个测试升级包。我在演示时通常会写一个简单的脚本把新rootfs镜像打包成OTA文件用openssl对描述文件和镜像哈希做签名。升级包生成之后在设备上启动OTA客户端脚本从本地搭建的HTTP服务下载升级包再按照描述文件里的目标分区把镜像写入rootfs_b写入完成设置升级标记并reboot。重启后观察U-Boot日志执行双区切换逻辑登录系统后运行业务进程确认其正常运行最后执行确认命令清除升级标记。到这一步一次完整的OTA演示就结束了整个过程里如果任何一个环节失败都应该看到回滚到rootfs_a的行为。5.2 高频问题排查速查表实际调试过程中遇到的问题很多这里整理一个速查表多数是我自己踩过或者帮同事排查过的。现象可能原因排查思路解决方案上电后无任何输出LED不亮bootloader存储介质损坏、eFuse被烧坏检查拨码开关、重新烧录bootloader如果eFuse已烧坏则只能换板SPL启动正常U-Boot验签失败镜像签名不匹配、eFuse中的公钥与镜像公钥不一致对比eFuse密钥与镜像签名公钥重新生成匹配的签名镜像U-Boot能启动内核加载失败内核或DTS签名错误、设备树与内核版本不一致检查签名工具输出的日志重新签名内核和DTSOTA下载到一半断线通信链路不稳定、没有实现断点续传查看终端日志中下载偏移量实现HTTP Range断点续传写入standby分区后重启仍启动老系统升级标记没有设置成功、U-Boot环境变量保存失败检查ota_meta和U-Boot的env变量重新设置升级标记并sync新系统启动后卡死回滚失效看门狗未启动、标记清除逻辑有bug检查应用层喂狗行为确保看门狗在应用启动后自动介入升级包校验失败但签名正确下载过程中文件损坏、哈希算法不一致重新计算哈希值比对增加下载后全量哈希校验多次升级后eMMC出现坏块写入过于频繁、没有坏块管理查看eMMC健康状态开启eMMC坏块管理或更换工业级eMMC5.3 几个只有下过现场才懂的经验最后分享几条我个人比较深的体会。密钥管理这件事再怎么谨慎都不为过。我曾经因为测试密钥和生产密钥混用导致一批开发板升级记录对不上排查了很长时间。后来规范了密钥编号和签发记录制度才彻底解决。eFuse烧录前一定要双人复核这不是流程形式是真能救命的。OTA脚本一定要设计成幂等的。重复下发同一个升级包、升级包版本低于当前版本、ota_meta状态错乱这些情况都要能正确处理。我见过某些OTA实现里重复下发会导致分区反复切换设备在A、B分区之间来回重启完全失去控制。这种情况其实在脚本逻辑上多判断几行就能避免。还有一点是关于版本号的。版本号必须包含硬件适配信息因为同一款终端可能有多个硬件改版不同改版对应的镜像可能不兼容。升级包描述文件里必须写清适用的硬件版本号设备端下载后先检查这个字段不匹配就直接拒绝应用。这个坑我是在售后反馈“升级后功能异常”的问题时才发现的——某个硬件改版换了颗外设芯片对应的驱动和配置不同结果主流升级包把它的配置覆盖了。回滚机制不是一个U-Boot环境变量就能解决的它需要硬件看门狗、业务启动确认、主站状态上报一起配合。我在一个项目里发现新系统虽然启动了但业务进程因为配置文件错误一直没起来U-Boot却已经认为“启动成功”并清除了标记。加了业务层启动确认和看门狗联动之后这个问题才真正闭环。我自己的习惯是每次OTA之后从主站拉取设备上报的版本号和运行状态确认与升级包目标版本一致才算一次升级真正完成。这一步看着多余但在无人值守设备上它能帮你避免很多“感觉升完了其实没升完”的隐性故障。
返回列表