Modprobed-db
modprobed-db 是一个实用程序,用于填充系统运行时已加载的所有内核模块的列表。然后,此列表可用于在构建自己的内核时禁用所有未使用的模块,并显着减少编译时间。
安装
安装 modprobed-dbAUR 软件包。
- 运行
modprobed-db
以创建$XDG_CONFIG_HOME/modprobed-db.conf
(如果它尚不存在)。 - 运行
modprobed-db store
以创建$XDG_CONFIG_HOME/modprobed.db
数据库文件,并使用当前加载的模块填充它。
可选:在忽略数组中添加您不想计数的模块,例如已构建的模块或由另一个软件包提供的模块。默认情况下包含一些常用模块
$ cat ~/.config/modprobed-db.conf
IGNORE=(nvidia vboxdrv vboxnetflt vboxnetadp vboxpci lirc_dev lirc_i2c osscore oss_hdaudio oss_usb tp_smapi thinkpad_ec zavl znvpair zunicode zcommon zpios zfs spl splat)
用法
填充数据库
创建初始数据库后,使用 modprobed-db list
显示当前数据库模块,并使用 modprobed-db store
使用当前加载的内核模块更新数据库。
建议
建议“使用”官方 Arch 内核,并安装 modprobed-db
一段时间,以便数据库根据使用情况增长,并在构建不包含不需要模块的内核之前捕获系统所需的一切)。以下是一些建议的操作,以允许加载并编目适当的模块
- 挂载将要使用的每种文件系统。
- 插入将要使用的每种可移动媒体(USB、DVD、CD 等)。
- 这包括在适用的情况下挂载 ISO 镜像文件,这会使用 loop 和 isofs 模块。
- 使用机器上的每个设备(网络接口、输入设备、网络摄像头、移动设备等)。
- 使用每个所需的应用程序,因为有些应用程序依赖于内核模块。例如
- IP 阻止/过滤软件(如 pgl-cliAUR)需要 iptables 内核模块。
- 加密软件(如 veracrypt)需要密码学内核模块。请务必挂载一些加密容器,以便实际加载它们。
- 某些 QEMU 配置需要内核模块。
- lm-sensors 需要内核模块才能读取硬件传感器。
- 尝试在运行不同的 Linux 内核时重新运行 modprobed-db;它们可能包含其他内核中未启用的模块。
这些建议的操作应与定期使用 modprobed-db store
更新数据库并行进行,以捕获任何新加载的内核模块。
自动定期数据库更新
可以使用以下方法之一自动调用 modprobed-db store
Cron
使用 modprobed-db 最方便的方法是简单地添加一个 crontab 条目,以定期调用 /usr/bin/modprobed-db store
。
每小时运行一次脚本的示例
$ crontab -e 0 */1 * * * /usr/bin/modprobed-db store &> /dev/null
systemd
除了 cron 之外,启用/启动 modprobed-db.service
用户单元。它将每 6 小时、启动时和关机时在存储模式下运行 modprobed-db 一次。
与任何服务和计时器一样,可以查询 modprobed-db.service
用户单元的状态。
手动编辑数据库
使用 #自动定期数据库更新 或手动运行 modprobed-db store
并非完全万无一失
- 某些模块在两次定期数据库更新之间加载然后卸载,可能无法捕获。
- 某些模块在启动期间使用,并且未被
modprobed-db
捕获(例如 efivarfs),它们需要手动添加到modprobed.db
文件中。
值得庆幸的是,modprobed.db
数据库文件是一个简单的文本文件,每行包含一个内核模块名称:可以手动编辑它以添加/删除模块。然后在手动编辑后建议运行 modprobed-db store
,以便模块自动重新排序。
推荐模块
建议将这些模块添加到 $XDG_CONFIG_HOME/modprobed.db
数据库文件中,因为它们被广泛使用
ext4
、fat
、vfat
:支持常见的文件系统和 EFI 系统分区nls_ascii
、nls_cp437
:支持挂载 EFI 系统分区。这是 linux-xanmod 上必需的,在其他内核上它们可能是内置的。loop
:将文件挂载为文件系统isofs
:挂载 ISO 文件cifs
:用于像 Samba 这样的网络文件系统efivarfs
:用于挂载 UEFI#UEFI 变量文件系统usb_storage
:支持 USB 存储设备usbhid
:支持 USB 输入设备
使用 modprobed-db 构建内核
在数据库充分填充后,make localmodconfig 可以直接读取它。
传统编译
modprobed-db 自然会在使用传统编译工作流程的默认 Arch .config 文件的配置步骤中干预。
使用官方 Arch 内核 PKGBUILD
可以修改官方 Arch 内核 PKGBUILD
,如下所示自动执行此操作
... msg2 "Applying patch $src..." patch -Np1 < "../$src" done msg2 "Setting config..." cp ../config .config make olddefconfig yes "" | make LSMOD=$HOME/.config/modprobed.db localmodconfig make -s kernelrelease > ../version ...
使用 linux-tkg
linux-tkg 提供了一个用户友好的内核构建脚本,该脚本还包括旨在提高桌面/游戏性能的额外补丁。可以在其配置文件中切换使用 modprobed-db
的数据库来剥离不需要的模块。
在自定义内核中使用 "make localmodconfig" 时 modprobed-db 的优势
- 显着减少编译时间
- 不会构建不需要的模块,对于台式计算机而言,节省的磁盘空间可以忽略不计,因为这只是相对较小的增益(几百兆字节)。
使用内核版本 5.13.1 进行比较,其中使用默认 Arch 配置进行内核/传统编译。
机器 CPU | 线程数 | 编译器 | make localmodconfig | 模块数 | 总编译时间 | 内核编译时间 | 模块编译时间 |
---|---|---|---|---|---|---|---|
Ryzen 5950X @ 4.55 GHz | 32 | GCC 11.1.0 | 否 | 5442 | 5 分 12 秒 | 58 秒 | 4 分 14 秒 |
Ryzen 5950X @ 4.55 GHz | 32 | GCC 11.1.0 | 是 | 227 | 1 分 32 秒 | 57 秒 | 35 秒 |
Ryzen 5950X @ 4.55 GHz | 32 | Clang 12.0.1 | 否 | 5442 | 9 分 5 秒 | 1 分 13 秒 | 7 分 52 秒 |
Ryzen 5950X @ 4.55 GHz | 32 | Clang 12.0.1 | 是 | 227 | 2 分 13 秒 | 1 分 13 秒 | 1 分 |
基准测试的主要结果是,“完整”内核的构建时间中有 80% 花费在模块上。鉴于任何给定机器仅需要这些模块的一小部分,因此构建时间可以减少约 70%。结果会因机器而异,但应该相似。
模块的数量可以通过以下方式确定
$ cd /lib/modules/15.13.1-your-custom-kernel $ find -name '*.ko*' | wc -l
内核构建时间通过以下方式获得
$ time make -jx bzImage # Replace "x" with the wanted number of threads
然后模块构建时间通过以下方式获得
$ time make -jx modules # Replace "x" with the wanted number of threads
参见
- https://docs.linuxkernel.org.cn/admin-guide/README.html#configuring-the-kernel 有关
make localmodconfig
的文档 - https://docs.linuxkernel.org.cn/kbuild/kconfig.html 及其父目录