嵌入式 Linux 的 OTA 更新,第 2 部分——现成更新系统的比较
在上一篇文章中,我们讨论了嵌入式 Linux 更新系统的基础知识和实现。在这里,我们讨论了一些现成的开源更新系统,这些系统现在可以与您的嵌入式 Linux 项目集成。
门德
这个更新系统感觉非常专业,开箱即用。它使用与上一篇文章中描述的非常相似的双 rootfs 更新系统。它与 U-Boot 紧密集成,允许在非启动映像的情况下进行回退。
开始使用 Mender 非常容易,因为有关于如何设置和集成各种组件的清晰的分步文档。它们提供了在 Raspberry Pi 和 BeagleBone Black 等流行平台上的参考实现,这些可以让您了解在您的平台上运行所需的工作量。
我发现整合和开始工作大约需要三天时间。为了让它与我的 Yocto 构建设置(基于 Morty)一起工作,有很多小的变化。它需要一些 OpenEmbedded 专业知识来解决这些问题。正确集成双启动机制需要U-Boot专业知识。
最后,它输出一个“sdimg”,其中包含引导加载程序和文件系统,需要以某种方式将其写入闪存。您如何执行此操作取决于您的目标硬件。它还输出所谓的“工件”,其中包含新的文件系统映像和各种元数据。
可以通过 Mender 命令行工具手动安装工件(然后理论上可以扩展为从 USB 记忆棒自动安装)。工件也可以通过 Web 界面上传到后端更新 Web 服务,然后可以从这里下推到各个单元。
控制后端更新服务器的 Web 界面设计良好且易于使用。设置是通过 Docker 完成的,这使得初始设置非常简单。完整的生产就绪系统需要 Docker 方面的专业知识。在此网络界面中,您可以查看现场所有当前部署的设备,并将更新单独或成组推送给它们。
点击查看大图
图 1:Mender 包含一个定制的 Web 界面,用于将更新推送到设备(来源:Mender)
Mender 的大部分是用 Go 编程语言编写的。长期采用和生产版本需要一些 Go 方面的专业知识。虽然这在嵌入式世界中仍然是一种不常见的语言,但它可能会在未来得到更广泛的应用。
您被绑定到一个硬编码的引导设备(例如:/dev/mmcblk0),因此没有直接的方法来允许从多个介质引导。它还对您的系统做出了很多假设,例如引导加载程序和内核中的各种选项(例如:包括对某些文件系统的支持)。至关重要的是,它需要 systemd,这可能使其不适用于某些项目。
软件更新
这个更新系统是高度可配置的。您可以使用大多数嵌入式 Linux 开发人员熟悉的“kconfig”系统对其进行配置。举几个配置选项的例子:它支持多种引导加载程序(U-Boot、GRUB、EFI Boot Guard);它可以根据给定的公钥对签名图像进行签名和验证;支持使用对称密钥加密对图像进行加密。
图 2:SWUpdate 的配置系统(来源:SWUpdate)
嵌入式