什么是 fwupd?
Fwupd 是一个基于 Linux 的固件更新工具,最初于 2015 年发布,已被许多 OEM 广泛用于 Linux 生态系统中,用于更新从游戏控制器到管理引擎和服务器的各种固件类型。
它与提供固件元数据和下载的远程服务器结合使用,这些服务器要么由 OEM 私下控制,要么在大多数情况下仅是 fwupd 的主要公共服务器,即Linux 供应商固件服务 (LVFS),由相同的核心开发团队。
从其易用性以及与可用于管理和上传固件的 OEM 友好的 Web 界面配对,fwupd 在 Linux 生态系统中的使用一直在不断增加。截至2021 年 12 月, LVFS 的下载量已超过 40,000,000 次,自 8 月起每月下载量为 2,000,000 次,比三个月前增长了 50%。
由于 fwupd 可以利用 UEFI Capsule-On-Disk 标准进行磁盘固件更新,并使用 EFI 系统资源表 ( ESRT)来跟踪 UEFI 固件更新的历史记录和版本信息,因此 fwupd 实现胶囊更新所需的所有功能包含在嵌入式基本引导要求 (EBBR) 规范中,并且与 SystemReady 认证设备兼容。
fwupd 架构
Fwupd 由三个主要组件组成:
- 用户空间守护进程(“fwupd.d”)
- 用户空间工具(“fwupdmgr”或“fwupdtool”)
- fwupd EFI 应用程序(“fwupd.efi”)
用户空间守护进程“fwupd.d”处理从远程源(如 LVFS)获取和处理元数据,以及处理存储在机器ESRT中的 UEFI 固件的版本跟踪和历史信息。除此之外,守护程序还验证胶囊及其包含的固件的完整性,以及固件安装是否在重新启动时成功完成。
用户空间工具“fwupdmgr”和“fwupdtool”只是用户或开发人员的命令行界面,允许他们获取更新、安装指定的封装文件以及检查元数据以进行调试。对于用户来说,这对于从配置的遥控器获取和安装更新最有用。但是,开发人员也可以利用它来验证包和签名,以及测试未上传到遥控器的固件。
最后,EFI 应用程序(“fwupd.efi”)用于安装 UEFI Capsule-On-Disk 胶囊,由用户空间守护进程安排安装,同时还向用户提供当前进度反馈、管理安装失败和擦除胶囊安装成功后。这必须在引导顺序中专门配置为高于 Linux 的优先级。
原型架构
该原型由一个在 Arm 上运行 Ubuntu 20.04 的虚拟机组成,使用 U-Boot 和可信固件 A(“TF-A”)。在这个虚拟机中,fwupd 守护进程和 fwupd 用户空间工具运行并相互交互。除此之外,在主机上,Linux 供应商固件服务(“LVFS”)的本地版本已配置并运行。
关于原型的流程,用户空间工具首先向守护进程请求它可以找到的任何新更新。在此之后,守护程序将请求它为包含所有可能的系统更新的清单配置的许多远程。在此之后,它将过滤与请求系统匹配的任何更新,并检查该版本是否是对当前安装的适当升级。请求系统通过守护程序根据系统中的组件生成的唯一 GUID 来标识,并且根据正在更新的设备类型而有所不同。对于 UEFI Capsule-On-Disk 更新,此标识符来自 ESRT 中的“fw_class”条目。
最后,守护进程会将固件写入 EFI 分区以准备更新,然后与用户一起安排重启。在重新启动时,如果 EFI 应用程序被配置为首先通过BootOrder运行,那么 EFI 应用程序将处理胶囊的安装、安装验证和删除。如果供应商选择不将 EFI 应用程序配置为运行,而是直接指向 Capsule 进行引导,则 Capsule 将像不使用 EFI 应用程序一样安装和删除。
这个原型建立了一个遵循这个流程的虚拟机和环境,并允许测试任意更新机柜。
原作者:劳伦斯·唐
|