【问题标题】:unable to "rmmod" the module无法“rmmod”模块
【发布时间】:2012-12-12 19:33:28
【问题描述】:

我正在使用涉及内核和用户空间代码的大型嵌入式软件(ARM 处理器、嵌入式 linux 2.6.31、busybox)。通常首先加载一个内核模块,并且守护进程与该模块建立netlink套接字。

这里的问题是杀死守护进程后,我不再能够从内存中卸载模块:

% rmmod _module.ko
% rmmod: _module.ko: Resource temporarily unavailable

分析表明错误(返回值为-11,即EAGAIN?)由try_stop_module()在系统调用delete_module()定义中调用kernel/module.c返回。函数 try_stop_module() 依次调用 stop_machine() ,这就是我卡住的地方,因为

我不确定那里到底发生了什么。我认为根本原因在守护进程中的某个地方,它打开了与模块的连接,显然还有其他东西,并且在退出时没有正确关闭/清理(显然一些引用/锁没有释放?)

有人知道还有什么要查看和探索的吗?

【问题讨论】:

  • 只是个愚蠢的想法... rmmod -f ... 强制卸载?

标签: linux linux-kernel kernel-module


【解决方案1】:

检查与你的模块相关的所有接口是否都没有'up'。

如果与你的模块相关的任何接口是'up',那么 rmmod 将失败并返回 -11。

所以在调用 rmmod 之前, 使用“netcfg”命令检查活动接口。 然后使用 ifconfig 将你的界面设为'ifconfig <interface_name> down'

然后尝试运行rmmod <module_name>。 它会工作的!

1.netcfg <lists out all interfaces>
2.ifconfig <interface_name> down
3.rmmod <module_name>

【讨论】:

    【解决方案2】:

    首先,您应该是执行此操作的超级用户。你也可以使用rmmod -f,但是这个选项可能非常危险:除非在编译内核时设置了CONFIG_MODULE_FORCE_UNLOAD,否则它没有任何作用。使用此选项,您可以删除正在使用的模块,或未设计为删除的模块,或已标记为不安全的模块。

    另请阅读man rmmod

    【讨论】:

    • 感谢 cmets。我知道“强制”模式,但是在我的平台上,busybox 的 rmmod 没有使用此选项编译,我的目标是找出仍在保留的描述符并修复它,这显然是模块中的错误或/和守护进程。
    • 还有一件事——这里的主要问题是对模块的引用数量,即有多少进程正在使用该模块(/proc/net/modules 的第三个字段), t 为零,因此无法卸载模块。在运行守护程序之前,引用计数器为 0,在启动守护程序后,计数器上升到 6,尽管我希望只有 3,因为它打开了三个套接字。因此,杀死damon后,计数器下降到3,因此无法卸载模块。有什么方法可以捕获其他描述符等保持打开状态吗?
    • @Mark - 这是一个单独的问题。见thisthis
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多