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.ucode
、intel/ibt-18-16-1.sfi
、rtl_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
改成对应的。
(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
-
我搞错了配置,无法进入系统了
这种情况存在的,一般会进入 root emergency mode。这时候输入 root 密码,进入系统把
/etc/portage/savedconfig/sys-kernel/linux-firmware*
移除,重新emerge linux-firmware
即可。
Footnotes
-
https://gist.github.com/douglarek/d71926aea179615f18689b352e2580d7 ↩
-
https://gist.github.com/douglarek/67ed1a64da21afd7b622c47a48340fc7 ↩
-
注意打印固件信息属于 Gentoo 补丁的功能,需要开启:
CONFIG_GENTOO_PRINT_FIRMWARE_INFO=y
,如果你使用的是 vanilla-* 内核则是没有的。如果需要精简固件,一种常用的方式是使用 gentoo-kernel-bin 进入系统采集一遍 dmesg 信息。 ↩