当前位置: 首页 > news >正文

使用Swupdate恢复模式更新嵌入式linux系统

在 SWUpdate 中,使用 恢复模式(Recovery Mode) 而不是 A/B 分区(A/B Seamless)模式 部署更新,通常需要以下步骤。恢复模式的核心思想是通过一个独立的恢复分区(或恢复系统)来管理更新,确保在主系统更新失败时能够回滚到已知的正常状态。


  1. 系统分区设计
    恢复模式通常需要以下分区布局(示例):
  • boot:引导分区(包含内核和 initramfs)。
  • rootfs:主系统根文件系统。
  • recovery:独立的恢复系统分区(包含恢复环境和 SWUpdate)。
  • data:数据分区(可选,用于持久化数据)。
  • swupdate:SWUpdate 的专用分区(存储更新镜像 .swu 文件,可选)。

  1. 配置 SWUpdate 恢复模式
    (1) 启用恢复模式
    在 SWUpdate 的配置文件(swupdate.conf)中,配置恢复模式:
    conf
    recovery
    enabled = true
    device = /dev/mmcblk0p3 恢复分区设备路径
    mountpoint = /recovery 挂载点
    bootloader = “uboot” 使用的引导加载程序(如 U-Boot)

(2) 配置镜像类型
.swimage 描述文件(如 sw-description)中,指定镜像类型为 recovery
conf
images:
{
filename = “rootfs.ext4”;
device = “/dev/mmcblk0p2”; 主系统根文件系统分区
type = “raw”;
installed-directly = true;
}

{
    filename = "recovery.ext4";
    device = "/dev/mmcblk0p3";   恢复分区
    type = "recovery";           关键:标记为恢复镜像
}

  1. 构建恢复系统镜像
    恢复系统需要包含:
  • 最小化的 Linux 系统(如 BusyBox)。
  • SWUpdate 可执行文件。
  • 必要的驱动和工具(如 mtd-utilsuboot-env)。
  • 启动脚本(例如自动检测并应用更新)。

示例恢复系统目录结构:
/recovery
├── bin
│ ├── sh
│ └── swupdate
├── etc
│ └── swupdate.conf
└── init 恢复系统的初始化脚本


  1. 引导加载程序(Bootloader)配置
    配置引导加载程序(如 U-Boot)支持恢复模式:
  • 设置一个环境变量(如 boot_recovery)用于触发恢复流程。
  • 默认启动主系统,更新失败时自动切换到恢复系统。

U-Boot 示例配置:
bash
正常启动主系统
setenv bootcmd “load mmc 0:1 ${loadaddr} zImage; bootm ${loadaddr}”

恢复模式启动命令
setenv boot_recovery “load mmc 0:3 ${loadaddr} zImage_recovery; bootm ${loadaddr}”

检测是否需要恢复
if test “${swupdate_status}” = “failed”; then
run boot_recovery;
else
run bootcmd;
fi


  1. 更新流程

  2. 触发更新:
    bash
    swupdate -i firmware.swu -v

    • SWUpdate 会将镜像写入主系统分区(rootfs)和恢复分区(recovery)。
  3. 重启并验证:

    • 系统重启后,首先尝试启动主系统。
    • 如果主系统启动失败(例如无法挂载根文件系统),引导加载程序会切换到恢复分区。
  4. 恢复系统操作:

    • 恢复系统启动后,自动检测到更新失败,并触发回滚:
      bash
      swupdate --recover
    • 回滚到之前的已知正常版本。

  1. 回滚机制
  • 在恢复系统中实现回滚逻辑(例如从备份分区恢复)。
  • 可以通过在 data 分区保存状态文件(如 /data/swupdate.status)记录更新结果。

  1. 关键注意事项

  2. 分区冗余:

    • 恢复分区和主系统分区需要足够的空间,确保更新过程中不会因空间不足失败。
  3. 原子性操作:

    • 使用 installed-directly = true 确保镜像直接写入目标设备,避免中间状态。
  4. 恢复系统独立性:

    • 恢复系统必须独立于主系统,避免依赖主系统的任何组件。
  5. 测试回滚流程:

    • 强制模拟失败(如写入损坏的镜像),验证恢复系统是否能正确回滚。

总结

  • 恢复模式适合资源有限的设备,无需双系统(A/B)的冗余开销。
  • 需要仔细设计分区布局、引导流程和回滚逻辑。
  • 与 A/B 模式相比,恢复模式需要更长的停机时间(需重启),但实现更简单。

如果需要进一步优化,可以结合 RAUC 或自定义脚本增强可靠性。

相关文章:

  • 大师课程:穿越日本专业级人文风景摄影视频课程 Fstoppers - Photographing the World 6 - Japan II
  • 基于微信小程序的宠物寄养平台的设计与实现(ssm论文源码调试讲解)
  • FPGA VIVADO:axi-lite 从机和主机
  • 环境变量 PATH 与可执行文件识别机制详解
  • 数据倾斜定义以及在Spark中如何处理数据倾斜问题
  • 14. Docker 轻量级可视化工具 Portainer(的详细安装步骤+常规使用详细说明)
  • PyQt加载UI文件
  • x86平台基于Qt+opengl优化ffmpeg软解码1080P视频渲染效率
  • 【GoLang】【算法模板】2、GoLang 算法模板整理
  • Java包装类泛型编程
  • Sa-Token 根据官方文档简单实现登录认证的示例
  • 认识 ADB(Android Debug Bridge,Android SDK 中的一个工具)
  • 排序与算法:插入排序
  • mapbox基础,使用geojson加载line线图层,实现纯色填充、图片填充、虚线和渐变效果
  • 【Qt】Q_OBJECT无法用在模版类中的原因和解决方法
  • GPT-2 大模型
  • 本地部署DeepSeek
  • 提升接口性能之缓存
  • 分治-归并排序
  • 反射和特性
  • 证券日报:降准今日正式落地,年内或还有降准空间
  • 思想史家陈谷嘉逝世,曾为岳麓书院当代复兴奠定重要基础
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • KPL“王朝”诞生背后:AG和联赛一起迈向成熟
  • 泽连斯基:将带领乌代表团前往土耳其,已准备好与普京会谈
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止