嵌入式 Linux 开发 10:软件升级

简介软件升级

无论是修复软件缺陷,还是添加新功能,软件升级是不可避免的。
升级一台嵌入式 Linux 设备要考虑的因素有:存储设备类型,文件系统和软件独立性。

以下 3 种方法都可以实现软件升级

  • 就地更新文件系统:在 Linux 用户空间获取新软件-->写入 MTD 存储设备-->重启
  • 使用 rsync 工具升级文件:具备网络能力的嵌入式 Linux 利用 rsync 同步远端服务器的文件
  • 使用套件管理工具:基于 BusyBox 的 dpkg 更新软件包

然而,上述的 3 种方法都有自身的缺陷

  • 就地更新时,如果断电或文件有损坏,那么设备将无法启动
  • rsync 依赖设备联网能力,并且文件有依赖关系易导致版本混乱
  • 制作软件包本身就有代价,对系统资源的要求更高

“失效安全性”(fail-safe)的升级方案

一个 fail-safe 的软件升级是原子性的,就像一笔数据库交易,最后只有 2 种状态

  • 升级成功后,启动有效的新版软件
  • 升级失败后,启动有效的旧版软件

因为 Linux 软件包含各种不同的文件,包括可执行文件,共享程序库,设备文件,内核镜像---它们都可能存在依赖关系。
逐文件(file by file)进行升级是不现实的,必须对整个文件系统进行处理。

如下图所示,进行 fail-safe 更新的流程如下

  • 将 image_new 下载到 MTD 存储设备分区
  • 检查 image_new 正确性(如检查 CRC 或加密签章)以确认传输无误
  • 以“原子”方式变更 boot_flag,通知 u-boot 开机期间使用 image_new
  • 让系统重新开机

+-----------+
| u-boot  |
+-----------+
| boot_flag |
+-----------+
| image_old |
+-----------+
| image_new |
+-----------+

posted @ 2022-09-22 13:33  KevinAshton  阅读(371)  评论(0编辑  收藏  举报