启动时跳过内核模块

Gri*_*ris 14 linux boot command-line kernel-module

有一个损坏的内核模块,因此我什至无法加载操作系统,因此我无法删除或修复它。是否可以在启动时跳过这个模块,使用内核的参数或其他东西?

小智 8

禁用特定模块可以从引导装载程序,不过貌似发行依赖性确实如此。

一方面,截至 2016 年 8 月,Linux 内核参数文档指出:

module_blacklist= [KNL] 不要加载以逗号分隔的模块列表。用于调试问题模块。

另一方面,我在 openSUSE 42.1 (Linux 4.1.31) 上使用的选项在Arch Kernel modules wiki 中有描述 :

您还可以将引导加载程序中的模块列入黑名单。只需添加

modprobe.blacklist=modname1,modname2,modname3

到引导加载程序的内核行,如内核参数中所述。当您将多个模块列入黑名单时,请注意它们仅以逗号分隔。空格或其他任何东西可能会破坏语法。

(感谢 unix.SE 的 @gertvdijk指出这一点。)

另外值得一提的是以下方法

为了防止内核使用 grub 命令行加载某些模块,您需要使用以下语法将它们作为参数传递给内核行。

$module_name.blacklist=yes

我不知道他们从哪里得到的,但如果所有其他方法都失败了,尝试任何其他方法绝对不会有什么坏处。


qua*_*ote 2

正如前面的答案中提到的,将模块列入黑名单是完全避免内核模块的最佳方法。除了列入黑名单之外,没有通用的方法来禁用模块。

一些 Linux 发行版确实提供了内核启动参数来执行此类操作。

  • 在 Arch Linux 中load_modules=off强制 udev 跳过自动加载。这将允许您在不加载模块的情况下启动,将导致问题的模块列入黑名单,并在不加载有问题的模块的情况下正常重新启动。
  • Knoppix 有一个很长的额外启动参数列表(又名“作弊代码”) ;这些是正常内核启动参数和 Knoppix 特定附加参数的组合。

有关更多信息,请参阅内核参数文档。有一些参数可用于禁用特定子系统。例如:

  • nousb禁用内核 USB 支持
  • cgroup_disable=[name]禁用特定控制器;然而,“内存”是唯一特别支持的示例
  • libata.noacpi禁用 libata(SATA 控制器)中的 ACPI 使用;这是通过内核传递模块参数的示例