7.2.6 OTA
概 述
OTA :( Over-the-Air Technology,空中下载技术)是指通过无线网络实现远程软件升级的技术。最早由安卓系统引入到手机设备中, OTA 技术大幅简化了传统软件升级过程,无需通过计算机连接设备,用户可直接在设备上下载并安装更新。这一技术极大地方便了用户,提高了设备维护的效率。
- 在 OTA 的广义应用中,可以划分为云端和设备端两个主要组成部分。云端部分负责处理设备的升级请求,包括执行升级校验、下发升级包以及收集升级结果等任务。而设备端则主要依赖云端下发的升级包,完成系统软件( FOTA, Firmware Over-the-Air)或应用程序( SOTA, Software Over-the-Air)的更新与升级。
- 本文旨在提供底层设备端 OTA 的用户手册,详细阐述 OTA 在底层系统软件和应用程序升级中的机制及其实现方法,同时提供相关的开发指导。需要特别指出的是,通过 OTA 升级的系统软件与应用程序,主要是指更新存储在外部存储器(如 eMMC )中的数据。
- OTA 的对外交付物主要为一套 API 及其相应的实现库(如 libupdate.so),该库实现了底层烧写校验等关键功能。上层的 OTA 服务架构则由客户方实现,用以对接客户的云端服务。在成功从云端下载升级包后, OTA 服务会通过调用 libupdate.so 中的接口,实现版本的升级和校验等操作,从而确保设备能够顺利、安全地完成软件更新。
缩略语
缩略语 | 英文全称 | 中文解释 |
---|---|---|
SoC | System on Chip | 片上系统 |
BL[x] | Boot Loader Stage [x] | 启动的阶段 x |
SPL | Secondary Program Loader | 二级程序加载器 |
GPT | GUID Partition Table | GUID 磁盘分区表 |
GUID | Globally Unique IDentifier | 全局唯一标识符 |
RSA | RSA Algorithm | RSA 公开密钥密码体制 |
eMMC | embedded MultiMedia Card | 嵌入式非易失性存储器 |
系统分区表
OTA 时,将以分区为单位对目标分区进行更新,这些分区按照不同的类型做如下区分:
分区类型 | 属性 | 升级方式 | 举例 |
---|---|---|---|
持久化分区 | 参数分区:一般存储系统运行时需要加载的一些配置文件和参数等数据。如分区表中的 ubootenv 等 用户分区:指与系统启动无关的分区。一般在系统启动后才会被挂载,如 userdata 分区 | 单分区一般没有镜像, 分区数据需要长期保存, 不支持 OTA 升级。 | ubootenv, veeprom, userdata |
AB 分区 | 前缀同名且尾缀带 _a 和 _b 的分区称做 AB 分区。 | AB 分区交替升级。 | boot_a, boot_b |
BAK 分区 | 前缀同名且尾缀带bak 的分区称作 BAK 分区,主要构成为 1 个主分区和若干个备份分区。 | BAK 分区只升级主分区,主分区升级并验证成功后,将主分区内容同步到备份分区。 | SBL, SBL_bak |
开启OTA
RDK默认不开启OTA功能,如需开启请按如下流程操作:
-
开启OTA前,若未编译过工程,没有生成out目录则执行下列命令,必须先编译工程或者建立编译环境。
# 编译工程,生成镜像
sudo ./pack_image.sh
# 仅建立编译环境
sudo ./pack_image.sh -p -
将build_params目录下的
ubuntu-22.04_desktop_rdk-s100_beta.conf
和ubuntu-22.04_desktop_rdk-s100_release.conf
中的中的PARTITION_FILE配置为OTA版本(PARTITION_FILE="s100-ota-gpt.json); -
将source/bootloader/device/rdk/s100目录下的
board_s100_debug.mk
和board_s100_release.mk
文件中的RDK_OTA
变量配置为开启(export RDK_OTA="yes") -
编译
- 制作新的miniboot的deb包
./mk_debs.sh hobot-miniboot
- 重新编译本地镜像
sudo ./pack_image.sh -l
- 制作新的miniboot的deb包
OTA 打包工具
OTA 打包工具介绍
OTA打包工具位于”ota_tools/”路径下,该文件夹包含的内容如下:
tree
.
├── hdiffz // 差分工具,用于生成文件差异
├── hpatchz // 差分工具,用于应用文件差异
├── mk_otapackage.py // OTA 打包工具,用于生成 OTA 升级包
├── ota_pack_tool.sh // OTA 打包脚本,封装了 mk_otapackage.py 的功能
├── ota_process // OTA 升级过程中使用的二进制工具,包含在 OTA 包中
├── out // OTA 打包的输出文件夹
│ ├── deploy // 存放 OTA 包制作过程的中间文件
│ └── ota_packages // 存放制作好的 OTA 升级包
└── private_key.pem // 私钥文件,用于 OTA 包的签名
一般使用位于”ota_tools/”路径下的ota_pack_tool.sh制作所需的OTA升级包,支持OTA升级包解包,解包后重打包,制作升级包以及制作差分包等。
使用方法如下:
Usage: ./ota_pack_tool.sh [OPTIONS]...
Options:
-x, -unpack <ota_package> Unpack the given OTA package file.
-r, -repack Repack the files into a new OTA package.
-c, -create <pack_type> -d <source_dir>
Generate OTA package by source dir or img_packages.
<pack_type>: sys, sys_signed ... etc.
<source_dir>: sys and sys_signed require img dir.
(e.g.)run "./ota_pack_tool.sh -c sys -d ../out/product/img_packages/"
-i, -inc <pack_type> -old <old_pkg> -new <new_pkg>
Create an incremental OTA package.
<pack_type>: sys, sys_signed.
<old_pkg>, <new_pkg>: OTA pack, xxx.zip.
(e.g.)run "./ota_pack_tool.sh -i sys -old out/ota_packages/all_in_one_old.zip -new out/ota_packages/all_in_one_new.zip".
-h, -help Display this help message.
OTA 升级包解包与重打包
升级包解包指令为:
./ota_pack_tool.sh -x out/ota_packages/all_in_one.zip
- 升级包解包后,可以更新ota_tools/out/ota_unpack下的镜像,重新制作OTA包,使用的OTA配置文件与ota_process均位于ota_tools/out/ota_unpack目录,该方法无法修改OTA配置文件gpt.conf。
升级包重打包指令为:
./ota_pack_tool.sh -r
- 打包的源文件夹路径为:ota_tools/out/ota_unpack
- 打包后的目标文件路径为:ota_tools/out/ota_repack
OTA 制作普通升级包
通过如下命令可以制作系统升级包,使用的分区配置文件通过ota_pack_tool.sh脚本中的GPT_CONFIG配置,默认使用/out/product/img_packages/s100-gpt.json,可根据实际需求修改。
# sys代表打包nonsecure版本升级包
./ota_pack_tool.sh -c sys -d ~/s100/out/product/img_packages/
# sys_signed代表打包secure版本升级包
./ota_pack_tool.sh -c sys_signed -d ~/s100/out/product/img_packages/
生成的 OTA 升级包将输出到ota_tools/out/ota_packages目录,在该目录下,您将看到zip和signature 两种后缀的文件,其中zip后缀文件是 OTA 升级包, signature后缀文件是对同名升级包的签名文件:
all_in_one.signature #nonsecure 升级包签名文件
all_in_one.zip #nonsecure 升级包文件
all_in_one_signed.signature #secure 升级包签名文件
all_in_one_signed.zip #secure 升级包文件
OTA 制作差分升级包
可以通过ota_pack_tool制作all_in_one_signed_inc.zip系统差分包,制作时使用的OTA配置文件与ota_process均为new包解压所得。
-
差分升级作用
节省流量,并不节省升级时间。
-
差分升级原理
利用差分算法,得出新老镜像差分镜像,升级时差分还原到对向分区。(flash介质的镜像不差分,其体积仅数M,且flash读取慢)。差分库:hpatchz。支持的镜像:OTA镜像包中的所有非flash介质的镜像。
-
差分升级的限制
- flash上的分区不支持差分升级;
- boot分区有写入行为,不支持差分升级;
- 只有镜像包的大小大于10M时才支持差分升级;
- 需要差分升级的分区如需挂载时,必须以只读方式挂载,且挂载时应添加noload选项,否则会出现md5校验失败的问题;
-
制作差分升级包
- 差分镜像升级时需要依赖已经烧录的旧镜像包,因此,在计划使用差分升级时,请务必妥善保存旧镜像包避免丢失或损坏。
# 基于out/ota_packages/all_in_one_signed_old.zip制作out/ota_packages/all_in_one_signed_new.zip的差分包all_in_one_signed_inc.zip
./ota_pack_tool.sh -i sys_signed -old out/ota_packages/all_in_one_signed_old.zip -new out/ota_packages/all_in_one_signed_new.zip
签名密钥
签名所用的私钥private_key.pem
放置在工程的:ota_tools
目录。签名所用的公钥public_key.pem
放置在工程的:source/bootloader/miniboot/ota_flash_tools/
目录,在设备端该公钥的路径为 /usr/hobot/share/ota/public_key.pem。
如果需要替换为自己的密钥,步骤如下: