> [!IMPORTANT] > 假设你定制内核(或 gentoo-kernel 通用编译)使用的是模块化而不是固件编译进内核。 > > 本文后续将在 gentoo wiki上维护:https://wiki.gentoo.org/wiki/User:Douglarek/Streamlining_linux-firmware 书接上文[^1],相对于定制内核来说,精简 linux-firmware[^2] 还是简单很多却是收益最大的。 在 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` 改成对应的。 ### 构建自定义 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` 即可。 [^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 信息。