全志AI985开发板OpenWrt OTA升级实战:从分区表配置到swupdate打包的完整避坑指南

发布时间:2026/5/18 16:03:45

全志AI985开发板OpenWrt OTA升级实战:从分区表配置到swupdate打包的完整避坑指南 全志AI985开发板OpenWrt OTA升级实战从分区表配置到swupdate打包的完整避坑指南在物联网设备快速迭代的今天OTAOver-The-Air升级已成为嵌入式开发的标配能力。全志AI985作为面向智能边缘计算的高性能开发板其OpenWrt系统的OTA实现却暗藏不少技术雷区。本文将带您穿越AB系统分区配置、swupdate集成、应用打包的完整战场特别针对分区表配置异常、升级包体积爆炸、应用更新失效三大典型问题提供工业级解决方案。1. 环境准备与分区架构设计1.1 开发环境初始化全志Tina Linux SDK的环境配置是后续所有操作的基础。建议使用Ubuntu 20.04 LTS系统并确保已安装以下依赖sudo apt-get install -y build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev关键目录结构说明device/config/chips/ai985/芯片级配置文件target/ai985/ai985-evb/板级定制文件out/ai985/evb/pack_out/固件输出目录提示建议在SDK根目录创建build.log记录所有make操作便于后续排查问题。1.2 AB系统分区表深度配置sys_partition.fex的分区设计直接影响OTA的可靠性。以下是经过生产验证的配置模板[partition] name bootA size 56320 downloadfile boot.fex user_type 0x8000 [partition] name bootB size 56320 downloadfile boot.fex user_type 0x8000 [partition] name rootfsA size 1048576 downloadfile rootfs.fex user_type 0x8000 [partition] name rootfsB size 1048576 downloadfile rootfs.fex user_type 0x8000 [partition] name appA size 1048576 downloadfile app.fex user_type 0x8000 [partition] name appB size 1048576 downloadfile app.fex user_type 0x8000关键参数解析size单位是扇区512字节建议rootfs保留至少50%冗余空间user_type0x8000表示该分区参与OTA升级app分区专用于业务应用与系统解耦1.3 环境变量动态切换机制env-5.15.cfg需要新增以下变量实现AB切换boot_partitionbootA root_partitionrootfsA app_partitionappA升级时的切换逻辑通过fw_setenv命令动态修改这些变量值。建议增加校验机制# 在rc.local中添加 if ! fw_printenv boot_partition /dev/null; then fw_setenv boot_partition bootA fi2. swupdate集成与配置优化2.1 编译系统集成执行make menuconfig时除了选择Allwinner-System-swupdate还需注意CONFIG_PACKAGE_swupdatey CONFIG_PACKAGE_swupdate-wwwy CONFIG_PACKAGE_libconfigy常见编译问题解决若出现openssl依赖错误需确认CONFIG_OPENSSL_ENGINE已启用libubootenv版本冲突时建议使用SDK自带版本2.2 升级策略文件精讲sw-description-ab是OTA的核心大脑典型配置如下now_A_next_B_emmc { images: ( { filename kernel.gz; device /dev/by-name/bootB; installed-directly true; compressed zlib; }, { filename rootfs.gz; device /dev/by-name/rootfsB; installed-directly true; compressed zlib; } ); scripts: ( { filename update_script.sh; type shellscript; } ); writenv_now_A_next_B: { env: ( { name boot_partition; value bootB; }, { name root_partition; value rootfsB; } ); }; };关键陷阱规避installed-directly必须为true才能直接写入裸设备compressed与实际压缩格式严格一致writenv确保与rc.local中的挂载逻辑匹配2.3 升级包压缩实战原始固件体积优化前后对比文件类型原始大小(MB)压缩后大小(MB)压缩率boot.fex28.19.865%rootfs.fex512.0180.264.8%app.fex256.085.366.7%压缩操作集成到打包流程# 在do_finish()中添加 gzip -k -f $CFG_TOP_DIR/out/ai985/evb/pack_out/app.fex gzip -k -f $CFG_TOP_DIR/out/ai985/evb/pack_out/boot.fex gzip -k -f $CFG_TOP_DIR/out/ai985/evb/pack_out/rootfs.fex3. 应用打包与更新验证3.1 应用打包深度优化make_app_res()函数改造要点function make_app_res() { local APP_PART_NAMEappA local APP_PART_FILE_PATH$CFG_TOP_DIR/out/ai985/evb/openwrt/build_dir/target/--/.pkgdir/--/mnt/app # 增加文件系统检查 if [ ! -d $APP_PART_FILE_PATH ]; then mkdir -p $APP_PART_FILE_PATH chmod 755 $APP_PART_FILE_PATH fi # 精确计算分区大小 local APP_PART_SIZE_IN_SECTOR$(parser_mbr sunxi_mbr_tmp_app.fex get_size_by_name ${APP_PART_NAME}) let APP_PART_SIZE_IN_K$APP_PART_SIZE_IN_SECTOR/2 # 带日志的打包过程 echo [$(date)] Packing app partition with size ${APP_PART_SIZE_IN_K}KB /tmp/ota_pack.log ${TINA_TOOLS_PATH}/make_ext4fs -l ${APP_PART_SIZE_IN_K}k -b 1024 -m 0 -j 1024 \ ${LICHEE_PACK_OUT_DIR}/${APP_PART_DOWNLOAD_FILE} ${APP_PART_FILE_PATH} }常见打包异常处理size计算为0检查sys_partition_tmp_app.fex的DOS格式转换ext4创建失败确认APP_PART_FILE_PATH存在且可写3.2 升级验证全流程完整的验证步骤应包含# 1. 生成升级包 swupdate_pack_swu -ab # 2. 传输升级包 adb push openwrt_ai985_evb-ab.swu /mnt/UDISK/ # 3. 执行升级A→B swupdate_cmd.sh -i /mnt/UDISK/openwrt_ai985_evb-ab.swu -e stable,now_A_next_B_emmc # 4. 验证项检查 fw_printenv -n boot_partition # 应输出bootB mount | grep /dev/by-name/appB # 确认挂载成功 md5sum /usr/bin/your_app # 对比新旧版本哈希验证要点清单[ ] 环境变量是否正确更新[ ] 所有目标分区是否正常挂载[ ] 应用二进制是否完整更新[ ] 系统日志有无错误信息logread4. 典型问题排查手册4.1 升级后应用未更新现象版本号未变日志显示旧版本时间戳根因OverlayFS缓存导致解决方案在rc.local中强制清理fw_setenv parts_clean rootfs_data:UDISK rm -rf /overlay/upper/usr/bin/*或者在sw-description-ab中添加预处理脚本scripts: ( { filename pre_install.sh; type shellscript; } )4.2 升级包验签失败错误日志[ERROR] : SWUPDATE failed : Image invalid or corrupted处理步骤检查swupdate编译配置CONFIG_SIGNED_IMAGESy CONFIG_SIGALGsha256,rsa2048重新生成密钥对openssl genrsa -out priv.pem 2048 openssl rsa -in priv.pem -out pub.pem -pubout打包时加入签名swupdate_pack_swu -ab -k priv.pem4.3 空间不足导致升级中断预防措施在打包阶段检查分区大小# 在make_app_res()中添加 AVAILABLE_SPACE$(df -k /mnt/app | awk NR2{print $4}) if [ $AVAILABLE_SPACE -lt $APP_PART_SIZE_IN_K ]; then echo Error: Insufficient space in app partition 2 exit 1 fi实现差分升级{ filename: rootfs.delta, type: delta, device: /dev/by-name/rootfsB, installed-directly: true, compressed: zlib }在实际项目中我们曾遇到AB系统切换后网络接口丢失的情况最终发现是/etc/config/network未纳入版本管理。现在的标准做法是在打包脚本中加入配置文件备份机制# 在pack阶段自动备份关键配置 cp $APP_PART_FILE_PATH/etc/config/network $APP_PART_FILE_PATH/etc/config/network.bak

相关新闻