Modprobed-db

来自 ArchWiki

modprobed-db 是一个实用程序,用于填充系统运行时已加载的所有内核模块的列表。然后,此列表可用于在构建自己的内核时禁用所有未使用的模块,并显着减少编译时间。

安装

安装 modprobed-dbAUR 软件包。

  1. 运行 modprobed-db 以创建 $XDG_CONFIG_HOME/modprobed-db.conf(如果它尚不存在)。
  2. 运行 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 镜像文件,这会使用 loopisofs 模块。
  • 使用机器上的每个设备(网络接口、输入设备、网络摄像头、移动设备等)。
  • 使用每个所需的应用程序,因为有些应用程序依赖于内核模块。例如
    • 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 数据库文件中,因为它们被广泛使用

  • ext4fatvfat:支持常见的文件系统和 EFI 系统分区
  • nls_asciinls_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 的优势

  1. 显着减少编译时间
  2. 不会构建不需要的模块,对于台式计算机而言,节省的磁盘空间可以忽略不计,因为这只是相对较小的增益(几百兆字节)。

使用内核版本 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 分
注意: 这些结果并不能证明 GCC 在构建内核方面比 Clang 更快。这些基准测试中使用的 GCC 版本是自行构建和优化的。

基准测试的主要结果是,“完整”内核的构建时间中有 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

参见