概述
本项目被认为有助于从存储媒体或网络更新嵌入式系统。但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在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,编写一个处理程序,实现专用协议的一部分来对微控制器进行升级。解析器必须识别哪个镜像必须用新的处理程序来安装,随后SWUpdate将在安装过程中调用该处理程序。
流式更新功能
SWUpdate被认为能够将接收到的镜像直接流式更新到目标中,而不需要任何临时副本。实际上,单个安装程序(处理程序)会接收一个文件描述符作为输入,该文件描述符设置在必须安装的图像的开始处。
该特性可以基于镜像进行设置,这意味着用户可以决定镜像的哪些部分应该流式处理。如果没有流式处理(请参见installed-direct标志),文件将临时提取到环境变量 TMPDIR 指向的目录中,如果没有 设置 TMPDIR,则默认使用 /tmp 。当然,使用流式处理,则不可能在安装之前检查整个交付的软件。临时副本仅在从网络更新时使用。 当映像存储在外部存储上时,不需要该副本。
完全流式更新镜像
在远程更新的情况下,SWUpdate从流中提取相关图像,并将它们复制 到环境变量TMPDIR (如果未设置,则复制到 /tmp )指向的目录中,然后调用处理程序。这确保只有在所有部件都存在且正确时才会启动更新。
但是,在一些资源较少的系统上,用于复制镜像的RAM空间可能不足,例如,如果必须更新附加SD卡上的文件系统的话。在这种情况下,如果图像能由相应的处理程序直接作为流安装,而不需要临时副本的话,则会很有帮助。并非所有处理程序都支持直接流式更新目标。零拷贝流是通过在单个镜像像的描述中设置“installed-directly”标志来启用的。
配置和构建
需求
编译SWUpdate只需要依赖几个库。
- mtd-utils: mtd-utils在内部生成libmtd和libubi。它们通常不导出也不安装,但是SWUpdate将链接它们,以便重用相同的功能来升级MTD和UBI卷。
- openssl: web服务器需要。
- Lua: liblua和开发头文件。
- libz和libcrypto总是需要被链接。
- libconfig: 被默认解析器使用。
- libarchive (可选的)用于存档处理程序。
- libjson (可选的)用于JSON解析器和Hawkbit。
- libubootenv (可选的) 如果启用了对U-Boot的支持则需要。
- libebgenv (可选的) 如果启用了对EFI Boot Guard的支持则需要。
- libcurl 用于网络通讯。
新的处理程序可以向需求列表中添加一些其他的库
-当出现构建错误时,检查是否需要所有的处理程序,然后删除其中不需要的部分。
在Yocto中进行构建
提供了一个 metasswupdate 层.它包含了mtd-utils和生成Lua所需的更改。
使用meta-SWUpdate只需一些简单的步骤。
首先,克隆 meta-swupdate.
git clone https://github.com/sbabic/meta-swupdate.git
