有没有办法确定 Linux 内核使用哪些固件 blob?

有没有办法确定 Linux 内核使用哪些固件 blob?

我寻求一种方法来确定我的笔记本电脑实际使用的固件(即支持硬件的二进制 blob)。

在我的发行版 archlinux 上捆绑二进制 blob 的包是:

core/linux-firmware(包大小 ~180MiB ,在 ~2500 个 blob 文件中安装了 ~730MiB)

无论如何,我的笔记本电脑很可能只使用其中的一些文件。这个问题是要找出如何确定这些。一些网上搜索建议简单地grepdmesgfirmwarehttps://wiki.gentoo.org/wiki/Linux_firmware#Searching_for_loaded_firmware)。虽然这确实似乎提供了一些见解,但我不确定这是否是最好/唯一/正确的方法。在我看来

  1. 单词“固件”出现在dmesg与实际二进制 blob 无关的上下文中的输出中
  2. 各个内核源代码部分在显示固件加载信息方面没有统一的输出(但不确定)
[root@thinkbox ~]# dmesg | grep -i 固件
[0.111955]Spectre V2:为固件调用启用受限推测
[0.161877]ACPI:[固件错误]:BIOS _OSI(Linux)查询被忽略
[10.440450]平台regulatory.0:regulatory.db的直接固件加载失败,错误-2
[10.493359]i915 0000:00:02.0:[drm]已完成加载DMC固件i915/skl_dmc_ver1_27.bin(v1.27)
[10.581810] iwlwifi 0000:04:00.0:已加载固件版本36.ca7b901d.0 8000C-36.ucode op_mode iwlmvm
[10.766097]蓝牙:hci0:固件修订版0.0构建10周41 2018
[11.947004] psmouse serio2:trackpoint:IBM TrackPoint固件:0x0e,按钮:3/3
[4855.262357]蓝牙:hci0:最低固件版本1周10 2014
[4855.268828]蓝牙:hci0:找到设备固件:intel/ibt-11-5.sfi
[4857.277466]蓝牙:hci0:等待固件下载完成
[4857.278204]蓝牙:hci0:固件加载于1962276 usecs
[4857.297293]蓝牙:hci0:固件修订版0.0构建10周41 2018
[20995.531309] 蓝牙:hci0:最低固件版本 1 周 10 2014
[20995.531314]蓝牙:hci0:找到设备固件:intel/ibt-11-5.sfi
[20997.352132]蓝牙:hci0:等待固件下载完成
[20997.352924] 蓝牙:hci0:固件加载于 1778914 usecs
[20997.370079] 蓝牙:hci0:固件修订版 0.0 版本 2018 年 10 周 41 日
[22827.736960] 蓝牙:hci0:最低固件版本 1 周 10 2014
[22827.737757]蓝牙:hci0:找到设备固件:intel/ibt-11-5.sfi
[22829.202536]蓝牙:hci0:等待固件下载完成
[22829.202753]蓝牙:hci0:固件已加载 1430656 usecs
[22829.219920] 蓝牙:hci0:固件修订版 0.0 版本 10 周 41 2018

编辑:用文本副本替换输出屏幕截图

答案1

这可能是最糟糕也是最简单的查找方法:

  1. sudo mv /lib/firmware /lib/firmware.bak
  2. 重启
  3. 检查dmesg未找到的固件文件
  4. sudo mv /lib/firmware.bak /lib/firmware
  5. 现在创建eg/lib/firmware.needed并将文件从中复制/lib/firmware到该目录(同时保留所需的目录结构)。
  6. 之后删除该包和mv /lib/firmware.needed /lib/firmware.

你已经准备好了。

没有神奇的命令可以自动执行此操作。我只能想到使用inotifywait -r /lib/firmware 很早在启动过程中并记录其输出,这要复杂得多。如果您正在使用initrd(大多数人都这样做),那将会更加复杂。


@MarcusMüller 提供了一个非常巧妙的想法,值得尝试。请启用atime根文件系统的选项,重新启动,然后运行以下命令:

find /lib/firmware -atime -1

理论上,这应该显示过去 24 小时内访问的所有文件,/lib/firmware其中应该包括所有必需的固件文件。

答案2

AFAIK,如果您使用标准 Linux 内核,并且在上次更新 /lib/firmware 后至少 2 天,重新启动并运行以下命令,则更容易:

find /lib/firmware -atime 2

请注意,这只会查找自该更新以来您使用过的设备的固件;例如,如果您有一台需要固件的扫描仪并且最近没有打开它,则上面的命令不会列出它。

该命令之所以有效,是因为现在的 Linux 内核默认为“lazyatime,relatime”,这意味着如果 (a) 自上次更改或修改后第一次访问该文件,或者 (b) 访问该文件已超过 10 分钟,则更新“atime”这是 24 小时内的第一次。该命令使用“-atime 2”来实现“man find”中解释的舍入原因。必须重新启动才能让内核重新加载固件。

如果它不起作用,请更新“/etc/fstab”以用“lazyatime”替换 rootfs 的“noatime”和类似安装选项,这对几乎所有用例都最有效。

相关内容