如何删除失败的内核模块

时间:2011-10-05 15:07:14

标签: linux-kernel

这种情况一直困扰着我:

我写了一个内核模块,有时它有一个bug(取消引用一个NULL指针)。在insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块并再次安装它。 问题是:我不知道如何删除内核模块。

  

$ rmmod你好

     

错误:模块问候语正在使用中

     

$ rmmod -f hello

     

错误:删除hello:设备或资源忙

我总是重启机器以移除模块,这需要太长时间。有人有更好的解决方案吗?谢谢你的任何投入。

3 个答案:

答案 0 :(得分:11)

使用虚拟机。

一旦你取消引用NULL或其他错误,你就会把内核置于未知状态。即使你确实设法删除模块(这是不可能的;内核OOPS杀死调用线程,所以它永远不会有机会减少引用计数 - 模块永远不会被删除)仍然是腐败留下,你的新,“固定”'模块很可能遇到麻烦。

使用快速重启虚拟机(可能带有快照)可以更快地进行恢复。

答案 1 :(得分:3)

正如bdonlan指出的那样,使用虚拟机会更好。

但是,如果您真的希望按照自己的方式行事,那么您必须:

  1. 检查您的内核配置是否已启用CONFIG_MODULE_FORCE_UNLOAD
  2. 编写另一个模块,将损坏模块的引用计数设置为零。在delete_module
  3. 中查看kernel/module.c系统调用

答案 2 :(得分:0)

我的情况下使用的列(请参阅lsmod)下的引用计数或值是-1。也可以在/sys/module/<kernel_module>/refcnt上找到该值。

这是我在这里找到对我有用的答案:https://askubuntu.com/a/521231

echo -e "blacklist kernel_module\n" | sudo tee -a /etc/modprobe.d/blacklist.conf

然后,您必须重新启动计算机。重新编译干净稳定的模块版本。然后输入以下命令以重新加载并覆盖发生故障的模块。

insmod kernel_module.ko

Fianlly

rmmod kernel_module