news 2026/4/18 7:37:09

【瑞芯微平台实时Linux方案系列】第十六篇 - 瑞芯微平台实时Linux系统备份与升级方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【瑞芯微平台实时Linux方案系列】第十六篇 - 瑞芯微平台实时Linux系统备份与升级方案

一、简介:边缘场景“升级”=“生命线”

  • 无人值守:电网塔、高速龙门架、矿山井下,升级失败 = 派人爬塔,成本 > 1 万元/次。

  • 实时性不能丢:升级过程若破坏 RT 内核或 rootfs,机械臂抖动 ≥ 5 ms → 废品率飙升。

  • 合规要求:GB/T 25000 安全更新、IEC 61508 生命周期管理,均需“可回滚 + 原子性”。

掌握“镜像备份 + 增量升级 + AB 分区 + 回滚”全流程,让你的瑞芯微实时 Linux 产品一次升级成功,失败自动回家


二、核心概念:5 个关键词先搞懂

名词一句话本文出现场景
AB 分区两套 rootfs + kernel,升级时切换,失败回滚升级策略核心
OTA 包增量或全量镜像压缩包,网络下发文件后缀.swu
SWUpdate开源升级框架,支持原子、增量、签名命令行swupdate
原子性写镜像过程断电,仍保持旧系统可启动通过 image-checksum + 双备份实现
回滚新系统 3 次启动失败,自动回到旧版本uboot 计数器 + 脚本

三、环境准备:10 分钟搭好“瑞芯微实验室”

1. 硬件

  • RK3568 开发板(带 ≥8 GB eMMC)×1

  • USB-TTL 串口线 ×1(115200-8-N-1)

  • 网线 1 根(千兆,TFTP/HTTP 升级用)

2. 软件

组件版本安装命令
主机 OSUbuntu 20.04 x86_64本地 PC
交叉工具链gcc-linaro-10.3-2021.03-x86_64_aarch64-linux-gnu下文一键脚本
实时内核linux-5.15-rt35官方 patch
SWUpdate2023.05apt install swupdate swupdate-client
根文件系统Ubuntu Base 20.04 arm64debootstrap构建

3. 一键装工具链(可复制)

#!/bin/bash # install_toolchain.sh TOOLCHAIN=gcc-linaro-10.3-2021.03-x86_64_aarch64-linux-gnu wget https://releases.linaro.org/components/toolchain/binaries/latest-10.3/aarch64-linux-gnu/${TOOLCHAIN}.tar.xz sudo tar -xf ${TOOLCHAIN}.tar.xz -C /opt/ echo 'export PATH=/opt/'${TOOLCHAIN}'/bin:$PATH' >> ~/.bashrc source ~/.bashrc

四、应用场景(300 字)

某省级“边缘视觉检测工站”部署 500 台 RK3568 盒子,运行 PREEMPT_RT 实时检测算法,对传送带矿泉水瓶做瓶盖缺陷检测,要求周期 ≤ 8 ms。现场无人值守,运维中心 200 km 外。早期采用“U 盘拷镜像”升级,失败率 8%,且断电必变砖。引入本文 AB 分区 + SWUpdate OTA 方案后:① 升级包 < 70 MB(增量,原 900 MB 全包);② 断电 3 次仍可回滚;③ 3 次启动失败自动回旧版本;④ 实时性验证 cyclictest Max < 50 μs 保持不变。最终单台升级时间从 30 分钟缩到 3 分钟,全年零现场维护,客户将方案复制到瓶盖、标签、装箱 3 条产线,成为集团模板。


五、实际案例与步骤:从“打包”到“回滚”全流程

所有脚本放~/rk-ota/目录,绝对路径避免串扰。

mkdir -p ~/rk-ota && cd ~/rk-ota

5.1 制作 AB 分区镜像

  1. 分区规划(eMMC 8 GB 示例)

    分区名字大小作用
    mmcblk0p1boot_a64 MBkernel + dtb
    mmcblk0p2rootfs_a2 GB系统 A
    mmcblk0p3boot_b64 MBkernel + dtb
    mmcblk0p4rootfs_b2 GB系统 B
    mmcblk0p5data余下用户数据,升级不碰
  2. 生成镜像(主机端)

    # make_ab_image.sh ROOTFS_A=rootfs_a.ext4 # 已用 debootstrap build 好 ROOTFS_B=rootfs_b.ext4 # 与 A 初始内容一致 mkfs.ext4 -d $ROOTFS_A -L rootfs_a -b 4096 rootfs_a.img 2G mkfs.ext4 -d $ROOTFS_B -L rootfs_b -b 4096 rootfs_b.img 2G
  3. 烧录脚本(U-Boot 下)

    # flash_ab.scr (mkimage -A arm64 -T script -C none -d flash_ab.cmd flash_ab.scr) echo "flash_ab.scr: 自动烧录 AB 镜像" fatload mmc 1:1 0x40000000 rootfs_a.img mmc write 0x40000000 0x4000 0x400000 # 计算好扇区 fatload mmc 1:1 0x40000000 rootfs_b.img mmc write 0x40000000 0x404000 0x400000

5.2 编译 SWUpdate

# 交叉编译 swupdate git clone https://github.com/sbabic/swupdate.git cd swupdate make menuconfig # 选择 # General ---> # Cross-compile prefix : aarch64-linux-gnu- # Bootloader ---> # U-Boot bootcount support make make install DESTDIR=$PWD/_install

生成swupdate可执行文件与swupdate.cfg配置模板。


5.3 生成增量 OTA 包

  1. 生成 file-list

    # 在旧系统 A 运行 find /usr /lib /opt -type f -exec md5sum {} \; > old_manifest.txt
  2. 新系统编译后同样生成 new_manifest.txt

  3. 计算差异

    # make_delta.sh sort old_manifest.txt > old.sort sort new_manifest.txt > new.sort comm -13 old.sort new.sort | awk '{print $2}' > delta.lst
  4. 打包

    tar -czf delta.tar.gz -T delta.lst cp delta.tar.gz swupdate.cfg ~/rk-ota/

5.4 下发升级(HTTP 模式示例)

  1. 主机启 HTTP

    cd ~/rk-ota && python3 -m http.server 8080
  2. 设备端升级

    # /usr/local/bin/ota_upgrade.sh #!/bin/bash SWUPDATE_ARGS="-H prod:1.0 -e stable,upgrade" swupdate $SWUPDATE_ARGS -i http://10.10.10.100:8080/delta.tar.gz
  3. U-Boot 启动计数器
    bootcmd加入:

    if test $bootcount -ge 3; then setenv boot_part 2; fi setenv bootargs root=/dev/mmcblk0p${boot_part} rootwait bootcount=${bootcount} saveenv

    新系统启动成功后在 systemd 服务里fw_setenv bootcount 0,失败则计数累加,3 次后自动切换回旧分区。


5.5 一键回滚(人工/自动)

# rollback.sh CUR_PART=$(mount | grep 'on / ' | awk '{print $1}') if [[ $CUR_PART == *"rootfs_a"* ]]; then TARGET=4 else TARGET=2 fi fw_setenv boot_part $TARGET reboot

六、常见问题与解答(FAQ)

问题现象解决
swupdate 报“image checksum error”增量包 md5 不匹配重新生成 manifest,确保新旧系统同一基线
升级后 cyclictest Max > 100 μs实时性下降检查新内核是否关闭 CONFIG_PREEMPT_RT,确认 cmdline 无nohz=off
bootcount 不生效3 次失败未回滚确认 U-Boot 已启用CONFIG_BOOTCOUNT_LIMIT
eMMC 寿命担忧频繁写镜像使用 tar 增量 +data分区分离,减少全块写入
现场无网络无法 HTTP 下载支持 U 盘离线升级:swupdate -i /media/sda1/delta.tar.gz

七、实践建议与最佳实践

  1. 版本号管理
    采用product:major.minor.build四段式,swupdate 支持-e硬件匹配,杜绝下错包。

  2. 双重校验
    镜像内嵌 SHA256 + 数字签名(openssl 私钥签名),公钥存放于/etc/swupdate/public.pem,防止恶意包。

  3. 灰度发布
    500 台设备按 1%-10%-50%-100% 四批升级,每批观察 24 h 无异常再继续。

  4. 实时监控
    设备上报upgrade_status到 MQTT,Grafana 大屏显示“升级中/成功/失败”热力图。

  5. 备份最后防线
    每次升级前自动dd if=/dev/mmcblk0 of=/data/emmc.img bs=1M count=100保存 boot 分区,极端情况串口救砖。

  6. 文档自动化
    使用 GitLab CI + PlantUML 自动生成《升级指导书》PDF,随 OTA 包一起下发,始终保持“代码-文档”同版本。


八、总结:一张脑图带走全部要点

瑞芯微 AB 分区升级 ├─ 分区:boot_a/rootfs_a + boot_b/rootfs_b + data ├─ 工具:SWUpdate + U-Boot bootcount ├─ 流程:增量打包 → HTTP下发 → 启动计数 → 失败回滚 ├─ 校验:SHA256 + 数字签名 + 灰度 └─ 监控:MQTT + Grafana + 自动报表

实时性 + 无人值守 + 原子回滚,一套方案同时满足。

把脚本 push 到你的 GitLab,下次产线升级,只需点击 Merge RequestOTA 包自动生成设备半夜静默升级,第二天上班看 Grafana 绿灯一片——这就是工程化的力量!祝你升级零事故,回滚零现

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 21:45:51

15种先进的检索增强生成(RAG)技术

在人工智能领域&#xff0c;从原型到生产的旅程充满挑战。虽然构建大型语言模型&#xff08;LLM&#xff09;、小型语言模型&#xff08;SLM&#xff09;或多模态应用的过程充满了兴奋&#xff0c;但要将这些原型转化为可扩展、可靠且生产就绪的解决方案&#xff0c;需要对其复…

作者头像 李华
网站建设 2026/3/12 16:07:04

python安装快捷键设置

notepad $profile function w {pip install $args }function e {python -m venv .venv }

作者头像 李华
网站建设 2026/4/18 5:44:28

2026必备!9个降AI率平台推荐,千笔助你轻松降AIGC

AI降重工具&#xff1a;论文修改的智能助手 随着人工智能技术的飞速发展&#xff0c;越来越多的学术写作开始依赖AI工具来提高效率。然而&#xff0c;对于本科生而言&#xff0c;如何在使用AI生成内容的同时&#xff0c;避免被检测出高AIGC率、降低查重率&#xff0c;成为了一…

作者头像 李华
网站建设 2026/4/18 5:40:57

Nature最新封面:谷歌Alpha系列新成员,“秒懂”生命终极蓝图!

Nature最新封面&#xff1a;谷歌Alpha系列新成员&#xff0c;“秒懂”生命终极蓝图&#xff01; 原创 学术头条 学术头条 学术头条 2026年1月29日 00:07 北京 一串长达百万碱基的非编码 DNA 序列&#xff0c;曾如天书般无从解读&#xff0c;如今其调控功能与变异影响皆可被…

作者头像 李华