我在 Linux 内核(版本 3.19.0)中发现了一个有趣的行为。我们正在测试网络驱动程序,系统完全挂起,它甚至没有响应 SysRq 命令。重新启动后,我们正在测试的驱动程序仍然显示为已加载,即使它没有配置为在启动时加载。更糟糕的是,用modprobe -r
或 都无法将其删除rmmod -f
。内核日志没有显示任何有用的信息。
我们尝试一次又一次地重新启动,甚至将该模块列入黑名单,但它始终显示为已加载的模块。我们找到的唯一解决方案是重新安装内核( apt-get remove/install linux-image-$(uname-r)
)。然后它消失了,一切又开始完美运行。
有谁知道这里可能发生什么以及为什么内核加载模块,即使明确告知不要这样做?
编辑:重新配置没有解决问题,我不得不重新安装内核包。
答案1
可能您的模块是在 initrd 阶段加载的。在此阶段,booloader 加载特殊文件并将其传递给内核,内核又将其安装为文件系统并从那里加载各种模块。这样做的最初目的是加载读取根文件系统所需的驱动程序,而不将所有可能的驱动程序编译到内核中。不同的发行版以不同的方式重新生成 initrd 文件,通常在内核更新时重新生成。由于您似乎使用基于 debian 的发行版,请尝试以下方法寻求帮助:https://wiki.debian.org/KernelModuleBlacklisting。