Linux 固件
Linux 固件是与 Linux 内核一起分发的包,包含某些硬件设备部分或全部功能所需的固件专有软件。这些二进制文件通常是专有的,因为某些硬件制造商不发布构建固件所需的源代码。
现代 AMD 和 NVIDIA 显卡几乎可以确定需要加载二进制固件才能正常工作。
从 Broxton(基于 Skylake 的微架构)开始,Intel CPU 需要二进制固件来支持额外的低功耗空闲状态(DMC)、在各种图形并行引擎上调度图形工作负载(GuC)以及将一些媒体功能从 CPU 卸载到 GPU(HuC)[1]。
此外,现代 Intel Wi-Fi 芯片组 几乎总是需要固件[2]。
安装
出于安全原因,热加载固件到正在运行的内核中一直被摒弃。现代初始化系统如 systemd 强烈不建议从用户空间加载固件。
内核
将不符合 GPL 条款的固件文件包含在二进制内核映像中,如果分发这些映像,可能会导致违反 GPL。建议在分发包含 sys-kernel/linux-firmware 固件文件的映像之前咨询律师。
在为 Linux 内核(从 4.18 版本开始)构建某些设备的固件支持时,有几个内核选项需要特别考虑:
- 固件加载 (CONFIG_FW_LOADER):此选项是为外部构建的模块使用用户空间加载的情况提供。
- 将命名的固件文件内置到内核二进制中 (CONFIG_EXTRA_FIRMWARE):此选项是一个字符串,接受将要内置到内核中的固件文件名(用空格分隔)。这些文件将在运行时供内核访问。
Device Drivers --->
Generic Driver Options --->
Firmware loader --->
-*- Firmware loading facility
() Build named firmware blobs into the kernel binary
# Optional: Enable compressed firmware support
[*] Enable compressed firmware support
[*] Enable XZ-compressed firmware support
[*] Enable ZSTD-compressed firmware support
USE 标记
USE flags for sys-kernel/linux-firmware Linux firmware files
+initramfs
|
Create and install initramfs for early microcode loading in /boot (only AMD for now) |
+redistributable
|
Install also non-free (but redistributable) firmware files |
bindist
|
Flag to enable or disable options for prebuilt (GRP) packages (eg. due to licensing issues) |
compress-xz
|
Compress firmware using xz (app-arch/xz-utils) before installation |
compress-zstd
|
Compress firmware using zstd (app-arch/zstd) before installation |
deduplicate
|
Create symlinks for all firmware that is duplicate using rdfind |
dist-kernel
|
Enable subslot rebuilds on Distribution Kernel upgrades |
savedconfig
|
Allows individual selection of firmware files |
unknown-license
|
Install firmware files whose license is unknown |
Emerge
root #
emerge --ask sys-kernel/linux-firmware
可选:Savedconfig
在安装 sys-kernel/linux-firmware 后,配置文件会生成到 /etc/portage/savedconfig/sys-kernel/linux-firmware-ddmmyyyy。编辑此文件将不需要的行注释掉或删除。编辑并保存文件后,使用 savedconfig
USE 标志重新安装 sys-kernel/linux-firmware:
root #
echo sys-kernel/linux-firmware savedconfig >> /etc/portage/package.use/kernel
root #
emerge --ask sys-kernel/linux-firmware
可选:压缩
加载到内核中的固件可以进行压缩,以实现更高的空间效率和更快的读取速度(以处理时间为代价)。更多信息,请参见 CONFIG_FW_LOADER_COMPRESS。
sys-kernel/linux-firmware 支持通过适当的 USE 标志使用 xz 或 zstd(从 Linux 内核 5.19 开始[3])进行压缩。内核配置应包括 CONFIG_FW_LOADER_COMPRESS_XZ 和/或 CONFIG_FW_LOADER_COMPRESS_ZSTD 选项,以支持这些压缩格式。
故障排除
查找已加载的固件
可以使用 dmesg 命令结合 grep 来确定已加载的固件:
user $
dmesg | grep -i firmware
移除
Unmerge
root #
emerge --ask --depclean --verbose sys-kernel/linux-firmware
另请参阅
- Fwupd — a daemon that provides a safe, reliable way of applying firmware updates on Linux.
- Kernel — 操作系统的核心。
- Iwlwifi — Intel 现有无线芯片的无线驱动。
- Microcode — describes various ways to update a CPU's microcode in Gentoo.
- AMDGPU — AMD Radeon和其他显卡的开源驱动程序。
- Intel — 适用于Intel板载显卡、Intel集成显卡和 Intel Arc独立显卡的开源图形驱动程序,从Intel 810开始支持。