Skip to content

Instantly share code, notes, and snippets.

@douglarek
Last active December 14, 2024 04:06
Show Gist options
  • Save douglarek/75ab328e3e04d1b283368d70d270da2c to your computer and use it in GitHub Desktop.
Save douglarek/75ab328e3e04d1b283368d70d270da2c to your computer and use it in GitHub Desktop.
Gentoo 使用系列之三:精简 linux-firmware

Important

假设你定制内核(或 gentoo-kernel 通用编译)使用的是模块化而不是固件编译进内核。

本文后续将在 gentoo wiki上维护:https://wiki.gentoo.org/wiki/User:Douglarek/Streamlining_linux-firmware

书接上文1,相对于定制内核来说,精简 linux-firmware2 还是简单很多却是收益最大的。 在 Gentoo 中,如果不把 linux-firmware 编译进内核(有许可问题),那么运行系统除了 Linux 内核之外还是需要安装这个包的, 但是这个包包含的是 Linux 目前的所有私有固件相关的二进制3,大小达 1.2G 之巨,但是一个桌面系统运行起来需要的也不过其中 3、5 个文件。 下面让我们来精简它。

确认当前系统加载的固件4

(root)$: dmesg | grep -i 'Loading firmware'
[    4.763489] Loading firmware: regulatory.db
[    4.764642] Loading firmware: regulatory.db.p7s
[    4.909102] Loading firmware: iwlwifi-9260-th-b0-jf-b0-46.ucode
[    4.920791] Loading firmware: iwl-debug-yoyo.bin
[    4.979257] Loading firmware: nvidia/565.57.01/gsp_tu10x.bin
[    5.045129] Loading firmware: intel/ibt-18-16-1.sfi
[    6.577898] Loading firmware: rtl_nic/rtl8168h-2.fw

可以看到这是系统启动加载的所有固件,这些固件并不全在 linux-firmware 包,就这个例子来说只有其中的 iwlwifi-9260-th-b0-jf-b0-46.ucodeintel/ibt-18-16-1.sfirtl_nic/rtl8168h-2.fw 在。

Tip

如何确认这些固件哪些在 linux-firmware? 即便不开启 linux-firmware 包的 savedconfig USE,该包安装的时候也会在 /etc/portage/savedconfig/sys-kernel/linux-firmware-20241110 类似文件中留下一个当前所有固件名字的列表,我们通过上面加载的固件和这个进行比对即可。

自定义精简配置

(root)$: mkdir -p /etc/portage/savedconfig/sys-kernel # 如果之前安装过此处可选
(root)$: rm -f /etc/portage/savedconfig/sys-kernel/linux-firmware* # 如果之前没有安装过此处可选,安装过可能需要删除旧的
(root)$:
dmesg | grep -i 'loading firmware' | sed 's/.*firmware: //' | while read fw; do
    grep -q "^$fw\$" /etc/portage/savedconfig/sys-kernel/linux-firmware-20241110 && echo "$fw"
done > /etc/portage/savedconfig/sys-kernel/linux-firmware
(root)$: mkdir -p /etc/portage/package.use/
(root)$: echo 'sys-kernel/linux-firmware savedconfig' > /etc/portage/package.use/linux-firmware

Caution

上面 /etc/portage/savedconfig/sys-kernel/linux-firmware-20241110 改成对应的。

构建自定义 linux-firmware

(root)$: emerge -av sys-kernel/linux-firmware
(root)$: etc-update # -3

定制前后对比

构建时间:

前:2024-11-13T10:12:44 >>> sys-kernel/linux-firmware-20241110: 1 minute, 55 seconds
后:2024-11-19T15:53:06 >>> sys-kernel/linux-firmware-20241110: 31 seconds

安装大小:

前:sys-kernel/linux-firmware: 4251 files, 380 non-files, 1.2G
后:sys-kernel/linux-firmware: 9 files, 19 non-files, 2.1M

QA

  • 我搞错了配置,无法进入系统了

    这种情况存在的,一般会进入 root emergency mode。这时候输入 root 密码,进入系统把 /etc/portage/savedconfig/sys-kernel/linux-firmware* 移除,重新 emerge linux-firmware 即可。

Footnotes

  1. https://gist.github.com/douglarek/d71926aea179615f18689b352e2580d7

  2. https://wiki.gentoo.org/wiki/Linux_firmware

  3. https://gist.github.com/douglarek/67ed1a64da21afd7b622c47a48340fc7

  4. 注意打印固件信息属于 Gentoo 补丁的功能,需要开启:CONFIG_GENTOO_PRINT_FIRMWARE_INFO=y,如果你使用的是 vanilla-* 内核则是没有的。如果需要精简固件,一种常用的方式是使用 gentoo-kernel-bin 进入系统采集一遍 dmesg 信息。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment