SWUpdate: 嵌入式系统的软件升级
概述
本项目被认为有助于从存储媒体或网络更新嵌入式系统。但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWUpdate中称为处理程序)。
一个用例是从外部本地媒体(如USB-Pen或sd卡)进行更新。在这种情况下,更新是在没有操作员干预的情况下完成的:它被认为是“一键更新”,软件在复位时启动,只需按下一个键(或者以任何目标可以识别的方式),自动进行所有检查。最后,更新过程只向操作员报告状态(成功或失败)。
输出可以使用帧缓冲设备显示在LCD上,也可以定向到串行通讯端口上(Linux控制台)。
它通常用于单拷贝方案中,在initrd中运行(用Yocto提供的配方生成)。但是,通过使用软件集合( collections ),可以在双拷贝方案中使用它。
如果启动了远程更新,SWUpdate将启动嵌入式web服务器并等待请求。操作者必须上传一个合适的映像,然后SWUpdate会进行检查并安装。所有输出都通过AJAX通知的方式通知操作人员的浏览器。
功能
总体概览
- 安装在嵌入式介质上(eMMC、SD、Raw NAND、NOR、SPI-NOR flash)
- 检查镜像是否可用。镜像以指定的格式(cpio)构建,它必须包含一个描述文件,以描述必须更新的软件。
- SWUpdate被认为可以更新设备上的UBI卷(主要用于NAND,但不限于NAND)和镜像。传递整个镜像仍然用于对SD卡上的分区或MTD分区进行更新。
- 新分区模式。这与UBI容量有关。SWUpdate可以重新创建UBI卷,调整它们的大小并复制新软件。一个名为“data”的特殊UBI卷在重新分区时,用于保存和恢复数据,以保持好用户数据。
- 使用zlib库支持压缩镜像。支持tarball (tgz文件)。
- 支持带分区的USB-pen或未分区盘(主要用于Windows)。
- 支持更新文件系统中的单个文件。必须明确描述该文件所在的文件系统位置。
- 支持图像中单个组件的校验和
- 使用结构化语言来描述镜像。 这是使用 libconfig库作为缺省解析器完成的,它使用一种类似json的描述。
- 使用自定义的方式来描述镜像。可以使用Lua语言编写自己的解析器。examples目录中提供了一个使用Lua中的XML描述的示例。
- 支持设置/删除U-Boot变量
- 支持设置/擦除 GRUB环境块变量
- 支持设置/删除 EFI Boot Guard 变量
- 使用嵌入式web服务器的网络安装程序(在Lua许可下的版本中选择了Mongoose服务器)。可以使用不同的web服务器。
- 多种获取软件的接口 : - 本地存储: USB, SD, UART,..
- OTA / 远程 : - 集成的网络服务器
- 从远程服务器拉取(HTTP, HTTPS, ..)
- 使用后端。SWUpdate是开放的,可以与后端服务器进行通信,以推出软件更新。当前版本支持Hawkbit服务器,但可以添加其他后端。
- 可以配置为检查软件和硬件之间的兼容性。软件映像必须包含条目,声明这个软件可在什么版本硬件上运行。如果没有通过兼容性验证,SWUpdate将拒绝安装。
- 支持镜像提取。制造商用一个映像包含用于多个设备的软件。这简化了制造商的管理,并降低了单一软件产品的管理成本。SWUpdate以流的形式接收软件,不进行临时存储,并只提取需要安装的设备组件。
- 允许自定义处理器,通过自定义协议安装FPGA固件,微控制器固件。
- 使用“make menuconfig”启用/禁用特性。(Kbuild继承自busybox项目)
- 镜像在安装之前经过身份认证和校验
- 掉电安全
交付单一镜像
主要概念是制造商提供单个大图像。所有单个的镜像都被打包在一起(选择cpio是因为它的简单性和可流式处理),同时打包的还有另一个文件(sw-description),该文件包含每个独立镜像的元信息。
sw-description的格式是可定制的:可以将SWUpdate配置为使用其内部解析器(基于libconfig),或者在调用外部的lua解析器。
可以使用外部解析器,改变对镜像的接受规则,以扩展支持新的镜像类型,指明它们需要如何安装。实际上,解析器就是检索必须安装哪些单个的镜像以及如何安装。
SWUpdate使用“处理程序”来安装单个镜像:有用于将镜像安装到UBI卷或SD卡、CFI闪存等的处理程序。如果需要特殊的安装程序,那么也可以很容易地添加自己的处理程序。
例如,我们可以考虑一个带有主处理器和一个或几个微控制器的项目。为了简单起见,我们假设主处理器使用专用协议通过UARTS与微控制器通信。微控制器上的软件可以使用专用协议进行更新。
可以扩展swuodate,编写一个处理程序,实现专用协议的一部分来对微控制器进行升级。解析器必须识别哪个镜像必须用新的处理程序来安装,随后S