如何将内核模块加入黑名单?

如何禁用不必要的内核模块加载。内核版本为3.2.4。

相关链接:https://superuser.com/questions/153792/skip-kernel-module-at-boot | 内置子集:https://unix.stackexchange.com/questions/276392/how-to-block-drivers-built-into-kernel-i-e-drivers-who-are-not-a-module - Ciro Santilli OurBigBook.com
5个回答

注意:对于内置到内核镜像中的模块(即不通过单独的.ko文件加载的模块),黑名单将无效。禁用此类模块的唯一方法是通过内核参数(如果可用)或重新编译内核。
只需打开您的/etc/modprobe.d/blacklist文件,并使用以下语法添加驱动程序名称:
blacklist driver-name

编辑:在12.10版本(12.04?)之后的较新版本中,该文件是/etc/modprobe.d/blacklist.conf。
重新启动您的计算机,并使用lsmod命令显示Linux内核中模块的状态。
注意:这里的driver-name是您想要加入黑名单的驱动程序的名称。例如,如果您想禁用网卡驱动程序,可以使用终端中的lspci -v命令找到您的LAN卡的内核驱动程序的名称。 例如,我的输出是:
........ ........ 6:00.0 以太网控制器:Broadcom Corporation NetLink BCM5906M Fast Ethernet PCI Express(rev 02) 子系统:联想设备3861 标志:总线主控,快速设备选择,延迟0,IRQ 46 内存位于b8000000处(64位,不可预取)[大小=64K] 扩展ROM位于[已禁用] 能力: 正在使用的内核驱动程序:tg3 内核模块:tg3 ........ ........
这里,我看到驱动程序是tg3。所以你需要在driver-name的位置写入tg3(或者你的驱动程序)。
可以在这里找到大量信息。

8在我的情况下(Lubuntu 12.10),没有/etc/modprobe.d/blacklist文件。有一个/etc/modprobe.d/blacklist.conf文件。 - Abdull
1最好将用户列入黑名单的模块存储在一个单独的文件中,以避免升级过程中的冲突(参见此评论在serverfault上)。 - Alexander Pozdneev
3blacklist.conf文件不需要存在。你可以在那里放一个名为my-mom-is-awesome的文件,它也能起作用。如果你想要针对特定的事物创建一个特定的黑名单文件,可以随意取一个名字,比如blacklist-nouveau或其他任何名字。 - doug65536
@doug65536 这个问题是7年前发布的,当然事情会有所变化。只需创建一个新问题,并附上您使用的Ubuntu版本,这样人们就可以帮助您了。 - LnxSlck
5@LnxSlck 我是在回应之前评论中表达的困惑。我并不需要帮助。为什么如此执着于不回复旧内容呢?难道就让它们荒废吗?人们仍然会找到这些内容,而其他人也会有同样的问题需要解答。 - doug65536
@doug65536 你的评论对我非常有帮助,因为它在ddgo中是一个热门结果。谢谢你! - BingBong
2我必须使用sudo update-initramfs -u命令来更新initramfs以使更改生效。 - ks1322
1@doug65536 没错。我曾广泛地写过关于这种“旧内容可能不再被打开”的病态。这是一篇关于此问题的荷兰语文章:https://jult.net/2007/06/29/op-dit-item-kan-niet-meer-gereageerd-worden/ 当时我在寻找尽可能通过模块黑名单来减少Linux内存占用的方法时,这篇帖子对我帮助很大。谢了! - Julius

你还可以在启动时使用grub命令行(linux行)的语法将它们暂时列入黑名单。
module_to_blacklist.blacklist=yes

2这个“临时”的时间有多长?直到下一次启动吗? - Seth
1Seth,如果你在启动过程中进行编辑,那只是临时的,仅对单次启动有效。如果你使用了/etc/grub.d/脚本或/etc/default/grub进行编辑,那就是永久的。 - Peter
1显然,这对i915不起作用:“i915:未知参数'blacklist'被忽略”。 - Rafał Cieślak
@RafałCieślak - 如果你需要帮助,请提出问题。请确保指明你的显卡型号,描述你的问题,并说明你尝试过哪些方法来解决问题。 - Panther
1@bodhi.zazen - 谢谢,但是我没有任何问题 - 我只是注意到这可能对某些特定的模块不起作用 :) - Rafał Cieślak
在启动时有其他方法可以禁用Grub中的模块吗? - BBK
相同的语法,编辑grub引导行并添加进去。 - Panther
5这个和 modprobe.blacklist=module_to_blacklist 有什么区别? - Zaz
相同的效果(黑名单模块),我猜语法可能在不同的内核之间有所不同,但我不确定。 - Panther
7或者使用内核参数 modprobe.blacklist=module_to_blacklist(详见 man modprobe 了解详情)。 - Kalle Richter
我正在使用Grub 2通过UEFI引导,但我没有看到任何内核命令行。GRUB要求我按下e键,我按下了e键,然后看到了这个编辑面板,但是没有明显的位置可以添加任何modprobe语法。我甚至不知道这个文件的格式应该是什么样的? - CMCDragonkai
@CMCDragonkai 使用键盘上的箭头键进行导航。在内核行的末尾手动输入您想要的选项(以linux开头)。按下ctrl-x启动。 - Panther

在至少Ubuntu 16.04 LTS中,另一种将模块列入黑名单的方法是在内核命令行中添加以下行:
modprobe.blacklist=MODULE_NAME

使用/etc/modprobe系统是最好的方法,但在紧急情况下可以通过编辑启动时的GRUB命令行来使用此替代方法。
这也可以通过编辑/etc/default/grub并添加到GRUB_CMDLINE_LINUX_DEFAULT变量中来永久设置。例如,在我的/etc/default/grub中,我有:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash modprobe.blacklist=nouveau"

然后我运行update-grub2,然后update-initramfs -u。重启后,只要没有在启动后加载它,你就可以摆脱这个模块。
这种方法在EL变体(RHEL、CentOS、SciLinux)中也适用,但你需要使用该发行版的方法来更新grub和initrd。
(对于那些试图屏蔽nouveau的人,请确保不要通过运行systemctl set-default multi-user.target加载X,否则当X启动时会再次加载nouveau!)

在最近的版本中,您需要在黑名单文件中使用安装指令。
install modulename /bin/false

将上面的"modulename"替换为模块的名称。这将强制阻止其加载。
您可以在modprobe.conf的手册中找到有关安装指令的更多信息。
man modprobe.conf

4这非常有帮助。事实证明,即使在/etc/modprobe/blacklist.conf中有一个黑名单条目,模块仍然可以通过手动加载modprobe <module_name>来加载。使用install <module_name> /bin/false的方法可以使其按预期失败。 - RawwrBag

没有这些解决方案适用于16.04 LTS的i915.ko。
我找到的(不太优雅的)解决方案是重命名
/lib/modules/4.4.0-22-generic/kernel/drivers/gpu/drm/i915/i915.ko
/usr/lib/xorg/modules/drivers/modesetting_drv.so
/usr/lib/xorg/modules/drivers/intel_drv.so

很遗憾,外接VGA屏幕不再被识别了 :{

10所有你需要做的是在修改了/etc/modeprobe.d/文件后运行sudo update-initramfs -u命令。 - Ivan Black