跳转到内容
DJ 王大海
Linux

如何知道自己的 Arch Linux 需要哪些 firmware

当然是全都装上

DJDOG

3 min read

如何知道自己的 Arch Linux 需要哪些 firmware

TL;DR

  1. 恢复配置:删除掉第一步加上的 dyndbg 参数,避免产生多余的日志。

重启后运行命令:

journalctl -b | sed -n 's;.*Loaded FW: \(.*\),.*;/usr/lib/firmware/\1.zst;p' | xargs pacman -Qoq | sort -u

先在引导器配置中的内核 cmdline 加上:

dyndbg="func fw_log_firmware_info +p"

详细步骤

恢复内核参数配置:删除掉第一步加上的 dyndbg 参数,避免产生多余的日志。然后再次更新 GRUB 配置:

sudo grub-mkconfig -o /boot/grub/grub.cfg

下次重启时,内核将不再记录固件加载信息。

运行分析命令:

journalctl -b | sed -n 's;.*Loaded FW: \(.*\),.*;/usr/lib/firmware/\1.zst;p' | xargs pacman -Qoq | sort -u

运行后预期得到类似于下面这样的输出:

linux-firmware-amdgpu
linux-firmware-cirrus
linux-firmware-mediatek

这表示系统加载了这些固件。

检查内核参数是否正确添加:

cat /proc/cmdline

在一长串的输出中应该会包含 dyndbg='func fw_log_firmware_info +p' 参数。

重启系统:

sudo reboot

更新 GRUB 配置:

sudo grub-mkconfig -o /boot/grub/grub.cfg

修改内核启动参数:在引导器配置中(这里以 GRUB 为例),找到内核的 cmdline 配置,进行如下修改:

# GRUB boot loader configuration

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet resume=UUID=0c38e0e8-c02a-4e17-8dfa-0e33ea12e457 resume_offset=533760"
GRUB_CMDLINE_LINUX="dyndbg='func fw_log_firmware_info +p'" # 添加在这里即可

由于上面的 dyndbg 参数自带空格和双引号,所以我们把其中的双引号改为单引号确保 GRUB 能够正确解析。这将启用内核的动态调试功能,以便记录加载的固件信息。

分析命令解释

journalctl -b | sed -n 's;.*Loaded FW: \(.*\),.*;/usr/lib/firmware/\1.zst;p' | xargs pacman -Qoq | sort -u
  1. journalctl -b:获取当前引导的日志,-b参数表示只显示自本次启动以来的日志,这其中就会包含我们通过 dyndbg 启用的内核 firmware 加载信息。
  2. sed -n 's;.*Loaded FW: \(.*\),.*;/usr/lib/firmware/\1.zst;p'这是整个流程中最核心的文本处理步骤。sed: 用于对输入的文本进行过滤和转换。
    • -n: 禁止默认输出。sed 通常会打印每一行,-n 告诉它保持安静,只在明确指示时(通过 p 命令)才打印。
    • 's;...;...;p': 这是 sed 的替换命令。
      • s: 表示替换 (substitute)。
      • ;: 用作分隔符。通常用 /,但这里日志内容可能包含 /,所以用 ; 是个好习惯。
      • .Loaded FW: (.),.*: 这是要匹配的模式。
      • .Loaded FW: 匹配任何字符 (.) 直到 "Loaded FW: " 这个固定的字符串。
      • (.*) 是一个捕获组。它匹配并“捕获”(记住)"Loaded FW: " 之后到下一个逗号之前的所有字符。这正是我们想要的固件文件名 (例如 i915/adlp_dmc.bin)。
      • ,.* 匹配文件名后面的逗号以及该行剩余的所有内容。
      • /usr/lib/firmware/\1.zst: 这是替换后的内容。
      • /usr/lib/firmware/ 是 Arch Linux 系统上固件文件的标准路径。
      • \1 是一个反向引用,它会被替换为前面第一个捕获组 (.*) 捕获到的内容,也就是固件文件名。
    • p: 表示如果替换成功,就打印替换后的结果。
  3. xargs pacman -Qoq
    • xargs: 从标准输入读取内容(这里是 sed 输出的文件路径列表),并将其作为参数传递给另一个命令(这里是 pacman)。
    • pacman -Qoq: 查询已安装的软件包。
  4. sort -u对输出的行进行排序,并移除重复的行。最终得到一个已排序的系统实际需要的 linux-firmware-* 包列表。

参考资料

分享此文章

如何知道自己的 Arch Linux 需要哪些 firmware

当然是全都装上

DJ 王大海 https://djdog.cc

目录

DJ 王大海

比 Hello World 再进一步的折腾手记。

© 2026 DJ 王大海 All Rights Reserved.