> ## Content Index
> Fetch the complete content index at: https://djdog.cc/llms.txt
> Use this file to discover other available public pages before exploring further.

# 如何知道自己的 Arch Linux 需要哪些 firmware
- URL: https://djdog.cc/blog/2025/arch-firmware/
- Published: 2025-06-27T15:45:30.000Z
- Updated: 2026-09-24T10:29:43.000Z
- Description: 当然是全都装上
- Author: DJDOG
- Tags: Linux, #toc

## TL;DR

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

重启后运行命令：

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

```

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

```sh
dyndbg="func fw_log_firmware_info +p"

```

## 详细步骤

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

```sh
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
linux-firmware-amdgpu
linux-firmware-cirrus
linux-firmware-mediatek

```

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

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

```sh
cat /proc/cmdline

```

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

重启系统：

```sh
sudo reboot

```

更新 GRUB 配置：

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

```

修改内核启动参数：在引导器配置中（这里以 GRUB 为例），找到内核的 cmdline 配置，进行如下修改：

```sh
# 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 能够正确解析。这将启用内核的动态调试功能，以便记录加载的固件信息。

## 分析命令解释

```sh
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-\* 包列表。

## 参考资料

- [Reddit - How to know which firmware packages do I need? :r/archlinux](https://www.reddit.com/r/archlinux/comments/1li9zoa/how%5Fto%5Fknow%5Fwhich%5Ffirmware%5Fpackages%5Fdo%5Fi%5Fneed/?ref=djdog.cc)