技术笔记 | Ubuntu 系统 OTA 升级全流程详解

前言:在嵌入式系统设备管理中,OTA(Over-The-Air)升级是实现设备远程维护、功能迭代的核心能力。本文基于 Ubuntu 系统环境,详细拆解 updateEngine 工具的 OTA 升级方案,从配置开启、命令使用到实战案例与问题排查,为开发者提供一套可直接落地的操作指南

一、recovery配置updateEngine 支持

因OTA升级过程中需要进入到recovery模式下进行升级,因此需要确保recovery文件系统中存在updateEngine指令。

要使用 updateEngine 进行 OTA 升级,需先通过编译recovery配置开启相关功能。针对 Ubuntu 系统,需在recovery配置文件中添加以下参数:

复制代码
BR2_PACKAGE_RECOVERY=y  # 开启升级核心功能BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y  # 启用新升级程序,不配置则默认使⽤原有升级流程BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y  # 编译新升级程序文件BR2_PACKAGE_RECOVERY_NO_UI=y  # 关闭UI界面

上述配置的核心是通过USE_UPDATEENGINE指定使用新升级框架,确保后续命令可调用 updateEngine 工具完成升级操作。

Ubuntu 的updateEngine 工具请通过拉取源码进行编译生成。

二、updateEngine 命令详解

updateEngine 支持网络远程升级与本地固件升级,命令参数灵活且可按需组合,核心用法如下:

2.1****网络升级:从远程服务器拉取固件

复制代码
updateEngine --image_url=http://192.168.0.190/recovery/update.img \             --misc=update \             --savepath=/userdata/update.img \             --reboot &
  • --image_url:远程固件地址(HTTP/HTTPS 协议均可);

  • --misc=update:指定进入升级模式;

  • --savepath:固件本地保存路径(建议/userdata/update.img,与 recovery 模式默认挂载路径一致,避免检索失败);

  • --reboot:升级后自动重启进入 recovery 模式完成后续操作。

2.2本地升级:使用已下载的本地固件

本地升级无需网络传输,直接读取--image_url指定的本地固件路径,其他参数与网络升级一致。

2.3可缺省参数说明

  • --version_url:版本文件地址(远程 / 本地均可),用于升级前与/etc/version中的RK_VERSION比对,缺省时不进行版本校验;

  • --partition:指定升级分区(默认0x3FFC00),不⽀持升级parameter 和loader分区

  • --savepath:缺省时默认/tmp/update.img,但建议传入/userdata/update.img,避免 recovery 模式下无法读取固件;

  • --reboot:非必需,若无需自动重启,可省略此参数(需手动进入 recovery 模式)。

2.4****升级全流程

updateEngine 的升级流程可分为 6 个核心步骤,结合RK3568的日志输出更易理解和定位流程节点:

1.版本校验(可选):若指定--version_url,对比远程版本文件与本地/etc/version,确认是否需要升级;

2.固件获取:从--image_url下载(网络升级)或读取(本地升级)固件,保存至--savepath;

3.升级 recovery 分区:在 normal 模式下先更新 recovery 分区,为后续恢复模式操作做准备;

4.重启触发:通过--reboot参数自动重启设备;

5.recovery 模式升级:进入 recovery 模式后,按--partition指定的分区列表执行升级;

6.完成重启:升级成功后自动重启,进入 normal 系统。

三、分区升级逻辑

updateEngine主要包含升级分区和写Misc配置功能,⽀持命令参数如下:

复制代码
*** update_engine: Version V1.1.0 ***.--misc=now Linux A/B mode: Setting the current partition to bootable.--misc=other Linux A/B mode: Setting another partition to bootable.--misc=update Recovery mode: Setting the partition to be upgraded.--misc=wipe_userdata Format data partition.--update Upgrade mode.--partition=0x3FFC00 Set the partition to be upgraded.(NOTICE: OTA not supportupgrade loader and parameter)                      0x3FFC00: 0011 1111 1111 1100 0000 0000.                                uboot trust boot recovery rootfs oem                                uboot_a uboot_b boot_a boot_b system_a system_b.                      000000000000000000000000: reserved                      100000000000000000000000: Upgrade loader		0x800000                      010000000000000000000000: Upgrade parameter         0x400000                      001000000000000000000000: Upgrade uboot		0x200000                      000100000000000000000000: Upgrade trust		0x100000                      000010000000000000000000: Upgrade boot		0x80000                      000001000000000000000000: Upgrade recovery	0x40000   0x0100                      000000100000000000000000: Upgrade rootfs		0x20000   0x0010                      000000010000000000000000: Upgrade oem			0x10000                      000000001000000000000000: Upgrade uboot_a		0x8000                      000000000100000000000000: Upgrade uboot_b		0x4000                      000000000010000000000000: Upgrade boot_a		0x2000                      000000000001000000000000: Upgrade boot_b		0x1000                      000000000000100000000000: Upgrade system_a	0x800                      000000000000010000000000: Upgrade system_b	0x400                      000000000000001000000000: Upgrade misc		0x200                      000000000000000100000000: Upgrade userdata	0x100
--reboot 运⾏成功之后,机器重启--version_url=url 如果有传⼊路径,升级之前会与/etc/version ⽂件中的 RK_VERSION= 版本值进⾏--image_url=url 设置升级固件的路径,可为远程或本地路径。--savepath=url 设置保存固件的位置,如果没有传⼊且升级的固件路径为远程地址,则默认值为/tmp/update.img(无效 需设置否则下载会卡住)--update sdboot: 走sdboot升级流程,即直接对flash操作,没有分区概念。

updateEngine 通过--partition参数的十六进制值指定升级分区,每一位对应一个分区的 "升级开关"(1 = 升级,0 = 不升级)。

示例:默认值0x3FFC00对应 "uboot + trust + boot + recovery + rootfs + oem + uboot_a/b + boot_a/b + system_a/b" 的组合升级,覆盖主流核心分区。

四、分区单独升级操作实例

4.1****单独升级 kernel(boot 分区)

复制代码
updateEngine --image_url=http://192.168.0.190/recovery/update.img \             --misc=update \             --savepath=/userdata/update.img \             --partition=0x80000 \             --reboot &
  • 原理:0x80000对应 boot 分区,直接写入固件,无需进入 recovery 模式烧录;

  • 日志特征:会显示write boot to /dev/block/by-name/boot及 MD5 校验成功信息。

4.2独升级 kernel(boot 分区)

复制代码
updateEngine --image_url=http://192.168.0.190/recovery/update.img \             --misc=update \             --savepath=/userdata/update.img \             --partition=0x200000 \             --reboot &

•注意:u-boot 为引导核心分区,升级后需确保固件兼容性,避免设备无法启动。

4.3**********单独升级 rootfs(需同步升级 recovery)******

复制代码
updateEngine --image_url=http://192.168.0.190/recovery/update.img \             --misc=update \             --savepath=/userdata/update.img \             --partition=0x60000 \ # 0x20000(rootfs)+0x40000(recovery)的组合值             --reboot &

•特殊说明:rootfs 为运行中的文件系统,直接写入会导致异常,需同步升级 recovery 分区,通过 recovery 模式完成安全升级。

总结

updateEngine 为系统提供了灵活高效的 OTA 升级能力,通过合理配置、精准指定分区与规范操作流程,可实现从内核到文件系统的全场景升级。本文涵盖从基础配置到实战示例的完整演示,开发者可根据实际需求调整参数,快速落地设备升级方案。

想了解更多相关技术知识或产品信息,请关注眺望电子并联系我们,我们将竭诚为您服务!

相关推荐
heartbeat..14 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据16 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦17 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
YMatrix 官方技术社区18 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录18 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong19 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
欧亚学术20 小时前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表
黑白极客20 小时前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎
大厂技术总监下海20 小时前
数据湖加速、实时数仓、统一查询层:Apache Doris 如何成为现代数据架构的“高性能中枢”?
大数据·数据库·算法·apache
LeenixP21 小时前
RK3576-Debian12删除userdata分区
linux·运维·服务器·数据库·debian·开发板