模块黑名单的更改

自古以来,我们就一直在使用我们自研的用于黑名单内核模块的系统(有各种演变)。这曾经对我们很有帮助,但现在我们(或者更确切地说,我们的各种上游项目)已经达到了不再需要它的地步。

因此,我们决定移除我们所有的模块黑名单逻辑,并完全依赖 modprobe 提供的黑名单功能。这意味着语法会有所改变,功能上也会有微小的变化。我们希望短期的不便能够被长期的收益所证明。

由于我们的 udev 包中一项不相关的更改,我们默认加载的模块数量比以前少,因此一些有问题的模块(例如 pcspkrsnd-seq-oss)可能不再需要被黑名单化。

黑名单的不同概念

我们曾经使用的模块黑名单概念(不幸的是)与 modprobe 使用的概念略有不同。

  • 我们的黑名单:被黑名单的模块,或任何依赖它的模块,永远不会被 udev 自动加载,但可以手动加载。
  • modprobe 的黑名单:被黑名单的模块不会被自动加载,但如果另一个非黑名单模块依赖它,或者手动加载它,它可能会被加载。
  • 禁用模块:可以通过强制模块始终加载失败来获得与我们以前提供类似的行为,届时将无法手动加载它。

启动时黑名单或禁用

可以通过将 modprobe.blacklist=mod1,mod2,mod3 追加到内核命令行(在 grub、lilo 或 syslinux 中)来在启动时将模块列入黑名单。或者,通过将 mod1.disable=1 mod2.disable=1 mod3.disable=1 追加到内核命令行来完全禁用模块。当一个损坏的模块导致系统无法启动时,这在紧急情况下非常有用。

持久化黑名单或禁用

与其在 rc.conf 中黑名单化模块,不如使用 modprobe 原生的配置文件。这些文件位于 /etc/modprobe.d/ 目录下,并在 man modprobe.d 中有详细说明。

rc.confMODULES=(!mod1 !mod2 !mod3) 替换的方式是向 /etc/modprobe.d/ 添加一个 .conf 文件,其内容为

blacklist mod1
blacklist mod2
blacklist mod3

或者,为了确保模块永远不会被插入,即使它们被你加载的其他模块所需要

install mod1 /bin/false
install mod2 /bin/false
install mod3 /bin/false