OTA升级实例

 

Platform: RK3399 

OS: Android 7.1 

 

一、全编

make -j32
./mkimage.sh ota

二、生成原始的 OTA 完整包

make otapackage

会在 out/target/product/rk3399_firefly_box/下生成rk3399_firefly_box-ota-eng.root.zip

所生成的这个rk3399_firefly_box-ota-eng.root.zip改名为 update.zip 即可用于完整包固件升级。

把update.zip放到板子/sdcard目录或者拷贝到sd卡,重启系统,系统自动检测升级包,点击install进行升级。

rk3399_firefly_box-target_files-eng.root.zip这个改名为 ×-old.zip 用来作为后面差异 OTA 包的 target file 
rk3399_firefly_box-target_files-eng.root.old.zip

mv 
out/...obj/PACKAGING/target_files_intermediates/rk3399_firefly_box-target_files-eng.root.zip
out/...obj/PACKAGING/target_files_intermediates/rk3399_firefly_box-target_files-eng.root.old.zip

三、修改了一些内容

…如删掉system/app目录下没用的apk

四、生成 OTA 差异包

**生成差异包命令格式: 
ota_from_target_files 
–v –i 用于比较的前一个 target file 
–p host 主机编译环境 
‐k 打包密钥 
用于比较的后一个 target file 
最后生成的 ota 差异包**

//1. 生成新的 ota 包
make otapackage
//生成了 rk3399_disvr-ota-user.younix.20161116.104037.zip
//2. 生成差异包
 ./build/tools/releasetools/ota_from_target_files -v -i 
out/target/...target_files_intermediates/rk3399_firefly_box-target_files-eng.root.old.zip 
-p out/host/linux-x86 -k build/target/product/security/testkey  
out/target/...target_files_intermediates/rk3399_firefly_box-target_files-eng.root.zip 
out/target/product/rk3399_firefly_box/update.zip

out/target/product/rk3399_firefly_box/update.zip
即为差异包

差分包升级跟前面的完整包升级方法一样。注意差分包升级时,板子烧写的版本。是单向的。

*************************************************************************

Platform: msm8916

OS: Android 5.1

完整包和差分包

1、固件编译好之后每个版本都需要保存

    out/target/product/M9PLUS_10/obj/PACKAGING/target_files_intermediates/M9PLUS_10-target_files-L1193.6.01.01.zip(这是是要做差分包的完整包,这个一 定要保存非常重要!!

    out/target/product/M9PLUS_10/ M9PLUS_10-ota-L1193.6.01.01.zip(这个是作为升级用的完整包,不是制作差分包的完整包!!

2、可以在源码根目录下面新建目录firmware_ota里面再新建oldverdion目录、newversion、updateversion。这三个目录分别存放前一个版本固件,新版本固件,    差分包生成目录。然后用如下命令生成差分包。

    ./build/tools/releasetools/ota_from_target_files -v -n -i firmware_ota/oldverdion/ M9PLUS_10-target_files-L1193.6.01.01.zip firmware_ota/newverdion/M9PLUS_10-target_files-L1193.6.01.01.zip firmware_ota/updateverdion/update.zip

    firmware_ota/updateverdion/update.zip就是生成的差分包。升级差分包和完整包步骤跟之前一致即可。

    制作差分包遇到的错误解决:

                    1.  删除/tmp/目录下的所有临时文件。

                    2.  执行source build/envsetup.sh 然后lunch

                    3.  重启

       https://blog.youkuaiyun.com/mike8825/article/details/47871481

<think> 我们正在讨论嵌入式系统中的OTA升级,特别是针对rootfs UBI分区的升级实例。UBI(Unsorted Block Images)是一种针对闪存设备的卷管理系统,常用于嵌入式Linux系统的根文件系统。 根据之前的上下文,用户提到了SD卡的分区结构,其中包含FAT32分区(用于boot)和ext2/3/4分区(用于rootfs)。但现在用户询问的是UBI分区,这是一种用于裸闪存(如NAND Flash)的文件系统,与SD卡上常见的分区格式不同。 因此,我们需要区分: 1. SD卡(通常使用MBR/GPT分区表,分区格式为FAT/ext等)上的OTA升级 2. 直接在NAND Flash上使用UBI/UBIFS的OTA升级 用户明确要求UBI分区的rootfs升级实例。 典型步骤: 1. 准备新的UBI镜像(通常是一个.ubi文件,包含新的根文件系统) 2. 通过OTA机制(如HTTP、MQTT等)将镜像下载到设备 3. 校验镜像(如校验和、签名验证) 4. 将镜像写入到备用的UBI分区(通常设备会有两个rootfs分区:当前运行的和备用的,用于实现A/B无缝升级) 5. 更新启动标志(如U-Boot环境变量)指向新的分区 6. 重启设备以使用新的rootfs 下面是一个简化的实例流程(假设设备已支持A/B分区): 步骤1:设备下载新的UBI镜像到临时存储(如/tmp/new_rootfs.ubi) 步骤2:验证镜像的完整性和签名(例如使用公钥验证) 步骤3:将镜像写入到非活动的UBI分区(假设当前运行在rootfs_a,则写入rootfs_b) 示例命令: flash_erase /dev/mtd3 0 0 # 擦除目标mtd分区(如果需要) ubiformat /dev/mtd3 -f /tmp/new_rootfs.ubi # 将UBI镜像写入mtd3 或者如果已经格式化为UBI,可以直接用ubiupdatevol: ubiattach -p /dev/mtd3 ubiupdatevol /dev/ubi0_1 /tmp/new_rootfs.ubi 步骤4:更新U-Boot环境变量,设置下一次启动为rootfs_b分区 fw_setenv bootpart 2 # 假设2对应rootfs_b 步骤5:重启设备 reboot 注意:实际操作中,需要根据具体的硬件和UBI布局来调整。 为了确保升级安全,通常还需要考虑回滚机制,例如如果启动失败则自动回退到之前的版本。 以下是参考代码的伪代码示例(实际实现可能更复杂,包括错误处理和回滚): ```bash #!/bin/sh # 下载新镜像 wget -O /tmp/new_rootfs.ubi http://example.com/new_rootfs.ubi # 验证镜像(这里简化,实际使用签名验证) if [ $(md5sum /tmp/new_rootfs.ubi | awk '{print $1}') != "expected_md5" ]; then echo "Verification failed" exit 1 fi # 当前运行在rootfs_a(分区1),则升级rootfs_b(分区2) if [ $(cat /proc/cmdline | grep -o 'rootfs=\w*') = "rootfs_a" ]; then target_ubi="/dev/ubi0_1" # 对应rootfs_b的UBI卷 target_bootpart="2" # 设置U-Boot启动分区2 else target_ubi="/dev/ubi0_0" # 对应rootfs_a的UBI卷 target_bootpart="1" fi # 更新UBI卷 ubiupdatevol $target_ubi /tmp/new_rootfs.ubi # 更新U-Boot环境变量 fw_setenv bootpart $target_bootpart # 重启 reboot ``` 注意:上述脚本仅为示例,实际应用中需要考虑更多细节,例如: - 镜像验证应使用非对称签名(如RSA) - 确保在写入过程中不掉电(可能需要冗余备份) - 监控升级状态以防失败 - 回滚机制(如检测到启动失败后自动切换回原分区) 此外,也有成熟的OTA解决方案,如SWUpdate、Mender等,它们提供了完整的框架来处理此类升级。 引用说明: [^1] 用户提供的引用中提到了分区类型和自定义分区,但对于UBI升级而言,UBI分区通常直接对应于MTD分区,而不是通过MBR分区表来管理。因此,上述实例直接操作MTD和UBI设备节点。 相关问题: §§相关问题§§ 1. UBI文件系统在嵌入式系统中的优势是什么? 2. 如何创建UBI镜像文件? 3. OTA升级过程中如何保证不掉电安全? 4. 常见的嵌入式OTA框架有哪些? </think> ### OTA升级rootfs UBI分区实例 在嵌入式系统中,OTA升级UBI格式的rootfs分区通常涉及以下核心步骤(以NAND闪存设备为例): #### **1. UBI分区结构准备** ```bash # 典型的MTD分区布局 mtd0: 1M (u-boot) mtd1: 3M (u-boot-env) mtd2: 12M (kernel) mtd3: 80M (rootfs_ubi) # 当前运行分区 mtd4: 80M (rootfs_ubi_alt) # 备用升级分区 ``` #### **2. UBI镜像生成** ```bash # 使用mkfs.ubifs创建UBIFS镜像 mkfs.ubifs -r ./rootfs -m 2048 -e 124KiB -c 640 -o rootfs.ubifs # 使用ubinize打包为UBI镜像 ubinize -o rootfs.ubi -m 2048 -p 128KiB ubinize.cfg ``` `ubinize.cfg`配置文件示例: ``` [ubifs-vol] mode=ubi image=rootfs.ubifs vol_id=0 vol_size=80MiB vol_type=dynamic vol_name=rootfs ``` #### **3. OTA升级脚本关键流程** ```bash #!/bin/sh # 下载新镜像(实际使用中需添加校验机制) wget -O /tmp/rootfs_new.ubi http://ota-server/rootfs-v2.ubi # 擦除备用分区 flash_erase /dev/mtd4 0 0 # 写入新UBI镜像到备用分区 ubiformat /dev/mtd4 -f /tmp/rootfs_new.ubi # 挂载新分区验证 ubiattach -p /dev/mtd4 mount -t ubifs ubi0:rootfs /mnt/new_root if [ $? -eq 0 ]; then umount /mnt/new_root ubidetach -p /dev/mtd4 # 更新引导标志(U-Boot环境变量) fw_setenv bootpart 2 # 切换到备用分区 # 重启生效 reboot else echo "UBI verify failed! Rollback..." # 回滚机制代码... fi ``` #### **4. 关键安全机制** 1. **A/B分区切换** 通过U-Boot环境变量控制启动分区: ```bash # U-Boot环境变量示例 bootpart=1 # 1=主分区, 2=备用分区 ``` 2. **数据验证** 升级前需验证: - SHA256校验和:`sha256sum rootfs_new.ubi` - 数字签名验证(使用openssl) 3. **回滚机制** 启动失败时自动回退: ```bash # 在init脚本中添加 if [ ! -f "/.boot_ok" ]; then fw_setenv bootpart 1 reboot fi ``` #### **5. 实际案例参考** 在工业路由器升级中,采用以下流程: 1. 通过HTTPS下载加密的UBI镜像(约50MB) 2. 使用硬件加密引擎验证RSA-PSS签名 3. 双备份分区写入(主分区+临时缓存区) 4. 首次启动成功后创建`.boot_ok`标记文件 5. 72小时运行无异常后自动清理旧镜像[^1] > **注意事项**: > - UBI镜像必须匹配目标设备的**物理擦除块大小**(通过`-p`参数指定) > - NAND闪存需预留**20%空间**供UBI磨损均衡使用 > - 升级过程中需确保**不间断供电** [^1]: 参考嵌入式OTA安全标准IEC 62443-4-2
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin@1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值