如何在运行时获取内核模块的完整依赖列表

4
有没有一种方法可以在命令行中列出内核模块的完整依赖关系列表,这些模块在运行时加载到内核中?
让我稍微澄清一下我的问题。
我想做什么:
1.使用lsmod获取所有已加载模块的列表
2.然后通过运行循环来删除/卸载当前加载的内核模块。我正在使用modprobe -r。这一步会失败(显然),因为某些模块正在使用中。(我可以切换到使用rmmod -r,但不想这样做,因为它是不安全的并且可能会导致系统崩溃。)
3.然后我想逐个重新加载这些模块。
正是第2步失败了,因为在使用modprobe -r之前我无法获取所有模块的依赖关系。
有什么想法、建议或评论吗?
3个回答

7
然而,lsmod的输出有时是不完整的。它也不总是指示所有依赖于特定模块的模块。
您在“Used by”列中看到的lsmod内容仅是静态符号依赖关系,您也可以使用modinfo查看。
但是,如果内核代码片段使用(try)_module_get引用模块,则不会记录调用者。引用没有所有者(moduleA可以将指针传递给moduleB,然后module_puts它..),对于“Used by”列没有需要记录的东西。

如果“使用者”列中有“1”,这是什么意思? - Vadim Kotov
这个方法是可行的,但当然,它是“反向”的... 如果 A 依赖于 B,你需要运行 modinfo A,但是 B 才是你想要知道依赖关系的模块... 在拥有大量模块的系统上,这可能会很烦人。 - Alexis Wilke

4

要获取模块依赖项列表,就像 modprobe 一样使用(即通常应该是完整的列表,但请参见 user502515 的回答),请使用

$ modprobe --show-depends <module>

请注意,此命令显示的信息比modinfodepends:行更详细,因为它递归地列出依赖项(即依赖于其他依赖项)。 它还考虑了modprobe配置文件中的alias命令。
测试使用:
$ modprobe -V
kmod version 14

2

man lsmod:lsmod是一个简单的程序,它可以很好地格式化/proc/modules的内容,显示当前加载的内核模块。

编辑: 另请参阅:depmod -n


1
我知道lsmod。然而,lsmod的输出有时不完整。它也不总是指示所有依赖于给定模块的模块。 - Ankur Agarwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接