在基本原理和实现文章中,我们讨论了嵌入式Linux更新系统的基础和实现。在这里,我们讨论了一些现成的开源更新系统,这些系统现在可以与您的Embedded Linux项目集成。
此更新系统非常专业,可以立即使用。它使用的双rootfs更新系统与上一篇文章中描述的系统非常相似。它与U-Boot紧密集成,以便在非引导映像的情况下进行回退。
Mender入门非常容易,因为关于如何设置和集成各种组件的良好分步文档非常清晰。它们在Raspberry Pi和BeagleBone Black等流行平台上提供参考实现,它们可以使您了解使其在平台上工作所需的工作量。
我发现整合和工作大约花了三天时间。为了使其与我的Yocto构建设置(基于Morty)一起使用,进行了许多小的更改。它需要一些OpenEmbedded专业知识来解决这些问题。需要U-Boot专业知识才能正确集成双启动机制。
最后,它输出一个“ sdimg”,其中包含引导加载程序和文件系统,需要以某种方式将其写入闪存。如何执行此操作取决于您的目标硬件。它还输出所谓的“工件”,其中包含新的文件系统映像和各种元数据。
可以通过Mender命令行工具进行人工安装,以进行手动安装(理论上可以从USB记忆棒扩展到自动安装)。工件也可以通过Web界面上传到后端更新Web服务上,并可以从此处下推到各个单元。
控制后端更新服务器的Web界面设计合理,易于使用。设置是通过Docker完成的,这使得初始设置非常简单。完整的生产就绪系统将需要Docker专业知识。在此Web界面中,您可以在该字段中查看所有当前已部署的设备,并分别或按组向其推送更新。
图1:Mender包含一个定制的Web界面,用于将更新推送到设备
Mender的大多数都是用Go编程语言编写的。Go的一些专业知识对于长期采用和生产发布将是必需的。尽管在嵌入式世界中这仍然是一种罕见的语言,但在将来它可能会变得越来越广泛。
您被绑定到单个硬编码的引导设备(例如:/ dev / mmcblk0),因此没有直接的方法允许从多种介质引导。它还对您的系统做出了许多假设,例如引导程序和内核中的各种选项(例如:包括对某些文件系统的支持)。至关重要的是,它要求使用systemd,这可能使其不适用于某些项目。
更新
此更新系统是高度可配置的。您可以使用大多数嵌入式Linux开发人员都熟悉的“ kconfig”系统对其进行配置。有关配置选项的一些示例:它支持多个引导加载程序(U-Boot,GRUB,EFI Boot Guard);它可以根据给定的公钥对签名的图像进行签名和验证;它可以支持使用对称密钥加密的图像加密。
图2:SWUpdate的配置系统
每次更新都包含一个CPIO存档,其中包含以“ sw-description”文件和执行该更新所需的实际数据文件形式的元数据。通常将包含文件系统列表以及应将文件系统放置在哪些块设备中。更新文件必须由用户手动创建。它不会脱离构建系统。
与Mender不同,SWUpdate不会介入并处理有关如何设置系统的详细信息。Mender将为您修补u-boot环境,SWUpdate将需要您自己制定“乒乓” AB双重rootfs的底层实现细节。
SWUpdate可以提供命令行安装。它还提供了类似于Mender的后端更新系统,该系统基于Eclipse hawkBit,它与在名为“ Suricatta”的目标上运行的守护程序一起运行,该守护程序处理对SWUpdate的调用。它还可以在设备本身上运行嵌入式http服务器,从中可以上传和安装更新。
默认情况下,它提供精简的映像配方,旨在作为initramfs恢复映像运行。从到目前为止的经验来看,该系统似乎是为通过双重rootfs更新进行恢复分区更新而设计的(在上一篇文章中已讨论了它们的优缺点)。将双重rootfs更新与后台OTA更新守护程序“ Suricatta”集成在一起似乎是不可能的,或者至少是非常困难的。
大多数SWUpdate用C编写,因此大多数嵌入式Linux开发人员可以轻松地进行修改或执行调试。开发人员还将“处理程序”的思想纳入了应用程序,以允许其他编码人员轻松扩展。这些可以实现额外的更新功能,例如将固件下载到板上的其他芯片。
像Mender一样,SWUpdate对用户提出了一些要求,但由于系统的可配置性,这些要求受到限制,有些甚至是可选的。
RAUC
RAUC被设计为比前两个更新系统更轻巧的更新系统,主要二进制文件仅约2个。512K与SWUpdate的130万和Mender的690万相比(这些是基于Yocto的输出进行的粗略计算,未考虑依赖关系,不同的构建目标等)。
它从构建系统输出所谓的“捆绑包”。这些捆绑软件包含压缩的文件系统和元数据。它们始终需要进行数字签名,这是RAUC的核心设计理念。它将文件系统映像编程到各种“插槽”中,然后可以将它们标记为正在工作或损坏或准备进行更新。它将与引导加载程序环境交互以决定是否
RAUC在内核中需要某些选项(例如:对SQUASHFS的支持),并且在根文件系统中也具有某些软件依赖性。RAUC与SWUpdate一样,也是用C编写的。它没有实现Mender和SWUpdate可以做到的流传输。
与SWUpdate一样,它支持使用Eclipse hawkBit作为后端更新系统,从而使您可以从Web界面下推对设备的更新。
图3:Eclipse hawkBit可以用作将更新推送到设备的Web界面,可以与RAUC和SWUpd
结束语
在此未提及基于文件的更新系统(如上一篇文章中所述)。为简洁起见,其他人则错过了。
使用哪种系统的决定实际上取决于项目。看来Mender可能更容易入门,而SWUpdate可能对于与已经部分内部开发的更新系统集成很有用,并且RAUC可以用作SWUpdate的替代方法。
领取专属 10元无门槛券
私享最新 技术干货