这种情况一直困扰着我:
我写了一个内核模块,有时它有一个bug(取消引用一个NULL指针)。在insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块并再次安装它。 问题是:我不知道如何删除内核模块。
$ rmmod你好
错误:模块问候语正在使用中
$ rmmod -f hello
错误:删除hello:设备或资源忙
我总是重启机器以移除模块,这需要太长时间。有人有更好的解决方案吗?谢谢你的任何投入。
答案 0 :(得分:11)
使用虚拟机。
一旦你取消引用NULL或其他错误,你就会把内核置于未知状态。即使你确实设法删除模块(这是不可能的;内核OOPS杀死调用线程,所以它永远不会有机会减少引用计数 - 模块永远不会被删除)仍然是腐败留下,你的新,“固定”'模块很可能遇到麻烦。
使用快速重启虚拟机(可能带有快照)可以更快地进行恢复。
答案 1 :(得分:3)
正如bdonlan指出的那样,使用虚拟机会更好。
但是,如果您真的希望按照自己的方式行事,那么您必须:
delete_module
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