DJ王大海

Back

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

TL;DR#

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

    dyndbg="func fw_log_firmware_info +p"
    sh
  2. 重启后运行命令:

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

    删除掉第一步加上的 dyndbg 参数,避免产生多余的日志。

详细步骤#

  1. 修改内核启动参数:

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

    /boot/grub/grub.cfg
    # 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'" # 添加在这里即可
    sh

    由于上面的 dyndbg 参数自带空格和双引号,所以我们把其中的双引号改为单引号确保 GRUB 能够正确解析。

    这将启用内核的动态调试功能,以便记录加载的固件信息。

  2. 更新 GRUB 配置:

    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sh
  3. 重启系统:

    sudo reboot
    sh
  4. 检查内核参数是否正确添加:

    cat /proc/cmdline
    sh

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

  5. 运行分析命令:

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

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

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

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

  6. 恢复内核参数配置:

    删除掉第一步加上的 dyndbg 参数,避免产生多余的日志。

    然后再次更新 GRUB 配置:

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

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

分析命令解释#

journalctl -b | sed -n 's;.*Loaded FW: \(.*\),.*;/usr/lib/firmware/\1.zst;p' | xargs pacman -Qoq | sort -u
sh
  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
https://vaoo.cc/blog/2025/arch-firmware
Author 小岛秀儿
Published at 2025年6月27日
Comment seems to stuck. Try to refresh?✨