fwupd
fwupd 是一个简单的守护进程,允许会话软件在您的本地机器上更新设备固件。它专为桌面设计,但也适用于手机和无头服务器。
安装
如果您打算用于 UEFI 升级,请参阅 #UEFI 升级设置。
图形前端
某些 桌面环境 前端解决方案内置了 fwupd 支持
- Discover — 与 Plasma 一起使用的软件中心。随着 KDE Plasma 5.14 的发布,KDE Discover 中实现了一个新的 fwupd 后端,用于固件更新。这些固件更新与其他系统更新一起显示。是 plasma 的一部分。
- GNOME Firmware — 用于升级、降级和重新安装 fwupd 支持的设备上的固件的应用程序。它可以解锁锁定的 fwupd 设备,验证受支持设备上的固件,并显示 fwupd 设备的所有版本。
用法
该软件包提供了一个 fwupd.service
,它将在收到第一个查询时自动启动 fwupd 守护进程。 [1]
要显示 fwupd 检测到的所有设备
$ fwupdmgr get-devices
要从 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 模式启动,因为它在传统启动模式下不起作用。
- 验证 您的 EFI 变量是否可访问。
- 正确挂载您的 EFI 系统分区 (ESP)。
esp
在本节中用于表示挂载点。 - 确保安装了可选依赖项 udisks2 并且在 fwupd 单元启动之前启动了关联的 systemd 单元;它将提供 UEFI 固件升级支持。
准备 ESP
fwupd 会将所有必要的文件复制到 esp
,但要使其工作,您的 esp
上必须存在基本文件夹布局;这构成了在您的 esp
上创建 EFI
目录
# mkdir esp/EFI/
EFI
目录必须全部为大写;如果您使用小写,fwupd 可能会将 esp
检测为 esp/efi/
并查找 esp/efi/EFI/
。重启 fwupd.service
单元。您现在可以 fwupdmgr refresh
和 fwupdmgr update
。系统将提示您重启(进入固件更新程序)。
安全启动
目前,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
确保将 keyfile
和 certfile
替换为您密钥的相应路径。
除了 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/fw
,mount /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
。如果遇到此错误,请将其修改为您的相应设置。