fwupd

来自 ArchWiki

fwupd 是一个简单的守护进程,允许会话软件在您的本地机器上更新设备固件。它专为桌面设计,但也适用于手机和无头服务器。

支持的设备在此处列出 此处,并且 更多即将推出

安装

安装 fwupdfwupd-gitAUR 软件包。

如果您打算用于 UEFI 升级,请参阅 #UEFI 升级设置

图形前端

某些 桌面环境 前端解决方案内置了 fwupd 支持

  • Discover — 与 Plasma 一起使用的软件中心。随着 KDE Plasma 5.14 的发布,KDE Discover 中实现了一个新的 fwupd 后端,用于固件更新。这些固件更新与其他系统更新一起显示。是 plasma 的一部分。
https://apps.kde.org/discover/ || discover
  • GNOME Firmware — 用于升级、降级和重新安装 fwupd 支持的设备上的固件的应用程序。它可以解锁锁定的 fwupd 设备,验证受支持设备上的固件,并显示 fwupd 设备的所有版本。
https://gitlab.gnome.org/World/gnome-firmware || gnome-firmware
  • GNOME Software — 将定期检查更新,并在 GNOME 上自动在后台下载固件。下载固件后,将在 Gnome Software 中显示一个弹出窗口以执行更新。是 gnome 的一部分。
https://apps.gnome.org/Software/ || gnome-software

用法

本文或本节需要扩充。

原因: 需要解释软件包的其他可执行文件和 systemd 单元的含义和用法。(在 Talk:Fwupd 中讨论)

该软件包提供了一个 fwupd.service,它将在收到第一个查询时自动启动 fwupd 守护进程。 [1]

要显示 fwupd 检测到的所有设备

$ fwupdmgr get-devices
注意: 列出的设备可能无法通过 fwupd 更新(例如 Intel 集成显卡)。可能会提供其他供应商解决方案。

要从 Linux 厂商固件服务 (LVFS) 下载最新的元数据

$ fwupdmgr refresh
注意: 这可以通过启用 fwupd-refresh.timer 自动完成。

要列出系统上任何设备的可用更新

$ fwupdmgr get-updates

要安装更新

$ fwupdmgr update
注意
  • 可以实时应用的更新将立即完成。
  • 在启动时运行的更新将在下次重启时暂存。
  • 可能需要root 用户才能执行某些设备更新。

配置

禁用本地缓存服务器 (passim)

fwupd v1.9.5 从 2023 年 9 月开始引入了对 passim 的依赖,这是一个本地缓存服务器,旨在通过使每台机器都能够将其每天下载的元数据文件提供给其他人,从而帮助减少 LVFS 带宽使用量[2][3]

passimd 是一个守护进程,它监听端口 27500 上来自任何 IP 地址的连接(它监听 0.0.0.0:27500)。这引起了一些关于安全隐患的批评[4][5],并且事实上,几周后就报告了一些漏洞[6][7]

在 Arch 上,FS#79614 请求在编译时使依赖项成为可选项被拒绝,因为它需要为库创建拆分软件包。

因此,如果您希望禁用 passimd,您应该遵循作者给出的建议[8]添加 P2pPolicy=nothing/etc/fwupd/fwupd.conf 和/或 屏蔽 passim.service

UEFI 升级设置

警告: 更新 UEFI 固件可能会丢弃当前的引导加载程序安装。在固件更新成功安装后,可能需要重新创建 NVRAM 条目(例如使用 efibootmgr)。

应满足以下要求

  1. 确保您以 UEFI 模式启动,因为它在传统启动模式下不起作用。
  2. 验证 您的 EFI 变量是否可访问
  3. 正确挂载您的 EFI 系统分区 (ESP)。 esp 在本节中用于表示挂载点。
  4. 确保安装了可选依赖项 udisks2 并且在 fwupd 单元启动之前启动了关联的 systemd 单元;它将提供 UEFI 固件升级支持。

准备 ESP

fwupd 会将所有必要的文件复制到 esp,但要使其工作,您的 esp 上必须存在基本文件夹布局;这构成了在您的 esp 上创建 EFI 目录

注意: 根据您的引导加载程序或其他操作系统的存在,此目录可能已存在。
# mkdir esp/EFI/
警告: EFI 目录必须全部为大写;如果您使用小写,fwupd 可能会将 esp 检测为 esp/efi/ 并查找 esp/efi/EFI/

重启 fwupd.service 单元。您现在可以 fwupdmgr refreshfwupdmgr update。系统将提示您重启(进入固件更新程序)。

注意: 在某些设备上,例如 Lenovo ThinkPad P50 笔记本电脑,固件更新程序会显示没有任何消息的黑屏——不要惊慌,并且不要中断或强制重置设备。几秒钟或几分钟后(取决于更新),机器将重启回操作系统。

安全启动

目前,fwupd 依赖于 shim 在启用安全启动的系统上链式加载 fwupd EFI 二进制文件;为了使其工作,shim 必须正确安装。

使用您自己的密钥

或者,您可以手动签名用于执行升级的 UEFI 可执行文件,该文件位于 /usr/lib/fwupd/efi/fwupdx64.efi。签名的 UEFI 可执行文件应位于 /usr/lib/fwupd/efi/fwupdx64.efi.signed。使用 sbsigntools,可以通过运行以下命令来实现

# sbsign --key keyfile --cert certfile /usr/lib/fwupd/efi/fwupdx64.efi

要在安装或升级时自动签名此文件,可以使用 Pacman 钩子

/etc/pacman.d/hooks/sign-fwupd-secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Path
Target = usr/lib/fwupd/efi/fwupdx64.efi

[Action]
When = PostTransaction
Exec = /usr/bin/sbsign --key keyfile --cert certfile /usr/lib/fwupd/efi/fwupdx64.efi
Depends = sbsigntools

确保将 keyfilecertfile 替换为您密钥的相应路径。

除了 pacman 钩子之外,您还可以创建从 /usr/lib/fwupd/efi/fwupdx64.efi/usr/lib/fwupd/efi/fwupdx64.efi.signed 的符号链接,并将该文件添加到 /etc/sbupdate.conf 中的 EXTRA_SIGN 列表。

最后,您必须在 /etc/fwupd/fwupd.conf 中设置 DisableShimForSecureBoot 并重启 fwupd.service

/etc/fwupd/fwupd.conf
...

[uefi_capsule]
DisableShimForSecureBoot=true
注意
  • 如果您在 fwupd 1.9 之前设置了此项,则此选项位于 /etc/fwupd/uefi_capsule.conf 中。
  • 如果您在 fwupd 1.4 之前设置了此项,请注意配置选项名称的细微更改。

有关更多信息,请参阅 https://github.com/fwupd/fwupd/issues/669

故障排除

重启时卡住

fwupdmgr update 报告没有错误,但它提示的重启卡住,并且按住电源按钮没有响应。尝试关闭电源,或按下重置按钮(在笔记本电脑上,它可能是背面的一个孔)以强制重启。

没有错误,但重启后没有升级

症状: fwupdmgr update 报告没有错误并提示重启(例如,在 BIOS 更新时)。但是,系统正常重启(或卡住),并且固件更新没有发生。

可能的原因: 在 BIOS 设置中,必须允许更改启动顺序。

可能存在的其他解决方案(如果存在多个待处理的更新): 尝试一次更新一个软件包。使用以下命令选择软件包

$ fwupdmgr update update_ID

(其中 update_ID 类似于 f95c9218acd12697af946874bfe4239587209232。)

只读文件系统错误

至少 fwupdmgr 1.5.2 在 使用绑定挂载将 EFI 系统分区挂载到 /boot 时推断出错误的挂载点。因此,它无法将 UEFI 更新文件写入到 /boot/EFI/arch/fw (fwupdmgr,而它应该写入到 esp/EFI/arch/fw。)这会导致(误导性的)file system is read-only 错误消息。如果更新是由 Discover(或任何其他支持 fwupd 的更新 GUI)执行的,则可能不会显示错误或误导性错误。

作为一种解决方法,如果 /boot 之前已绑定挂载到 esp/EFI/arch,请首先运行 umount /boot,然后运行 fwupdmgr update 以将 UEFI 更新文件写入到 esp/EFI/arch/fwmount /boot 并重启系统以执行 UEFI 更新。

UEFI ESP 分区未检测到或未配置

如果在满足 #UEFI 升级设置 中的所有要求后,仍然未检测到 EFI 系统分区 (ESP),则可以手动指定挂载点

/etc/fwupd/fwupd.conf
[fwupd]
EspLocation=/efi

有关可能发生这种情况的其他原因,请参阅 fwupd wiki 中的相关文章

设置 ESP 位置可以防止 fwupdx64.efi 安装在其他磁盘上不需要的 EFI 系统分区中。

MSR 插件加载失败

MSR 插件允许查询 DCI 的状态,DCI 是 Intel CPU 可用的调试接口,根据 fwupd 的文档,该接口应在生产机器上禁用。

此插件需要加载 msr 内核模块。msr 是所有官方 Arch Linux 内核软件包中内置的内核模块,但非官方内核软件包可能将其作为可加载内核模块。在后一种情况下,我们需要显式地在启动时加载模块

无法加载守护进程:无法加载引擎:没有 ESP 路径

当启动 fwupd 时,它会从 /etc/fwupd/fwupd.conf 中检查 esp 位置作为 EspLocation。如果遇到此错误,请将其修改为您的相应设置。