Linux kernel 如何删除失败的内核模块
这种情况总是困扰着我: 我写了一个内核模块,有时它有一个bug(取消对空指针的引用)。在I insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块,然后再次安装。 问题是:我不知道如何删除内核模块 $rmmod你好 错误:模块hello正在使用中 $rmmod-f你好 错误:删除hello:设备或资源正忙 我总是重新启动机器以删除模块,这需要很长时间。有人有更好的解决方案吗?谢谢你的意见 使用虚拟机 一旦你犯了一个空的取消引用或者其他类似的错误,你就把内核置于了一个未知的状态。即使您确实成功地删除了模块(这是不可能的;内核OOPS会杀死调用线程,因此它永远不会有机会减少引用计数-模块永远不会被删除),仍然可能会留下损坏,您的新“修复”模块也很可能会遇到麻烦Linux kernel 如何删除失败的内核模块,linux-kernel,Linux Kernel,这种情况总是困扰着我: 我写了一个内核模块,有时它有一个bug(取消对空指针的引用)。在I insmod hello.ko之后,它显示了一些内核错误。 然后我更改代码,并尝试删除该模块,然后再次安装。 问题是:我不知道如何删除内核模块 $rmmod你好 错误:模块hello正在使用中 $rmmod-f你好 错误:删除hello:设备或资源正忙 我总是重新启动机器以删除模块,这需要很长时间。有人有更好的解决方案吗?谢谢你的意见 使用虚拟机 一旦你犯了一个空的取消引用或者其他类似的错误,你就把内核置
使用快速重启虚拟机要好得多——可能是使用快照,以加快恢复速度。正如bdonlan所指出的,使用虚拟机会更好 但是,如果你真的想按自己的方式做,你必须:
内核/module.c
对于我的案例,Used by列(请参见
lsmod
)下的引用计数或值为-1。此值也可以在/sys/module//refcnt
中找到
以下是我在这里找到的对我有用的答案:
echo-e“黑名单内核\u模块”| sudo tee-a/etc/modprobe.d/blacklist.conf
然后你必须重新启动你的机器。重新编译一个干净稳定的模块版本。然后输入以下命令重新加载并覆盖故障模块
insmod kernel\u module.ko
最后
rmmod内核模块