如何检查 Linux 上的内核模块依赖关系
与软件包类似,许多 Linux 内核模块不是独立的,而是依赖其他模块才能成功加载和运行。了解各种情况下的内核模块依赖关系很有用。例如,您可能想知道特定行为不当的内核模块依赖于哪些其他模块,以便找到该行为的根本原因。在另一种情况下,您可能希望卸载系统上不再需要的内核模块,以便最大限度地减少内核的内存占用。
那么首先如何检查内核模块依赖关系呢?有多种方法可以查找 Linux 上的内核模块依赖性。
方法一:lsmod
第一种方法是使用 lsmod 命令,该命令显示当前加载的内核模块列表以及模块依赖信息。
$ lsmod
Module Size Used by
iptable_filter 1790 1
ip_tables 7706 1 iptable_filter
x_tables 8327 1 ip_tables
vmhgfs 41755 0
vsock 30939 0
. . . .
在 lsmod
输出中,内核依赖信息显示在“Used by
”列下,该列指示内核模块和正在使用给定模块的 Linux 进程的总数。依赖于给定模块的其他内核模块的名称也列在该列下。
但请注意,如果任何现有 Linux 进程(不是内核模块)使用内核模块,则 lsmod 输出中将省略进程名称。
例如,在上面的示例输出中,iptable_filter
由一个(未知)Linux 进程使用,而 ip_tables
模块由一个名为 iptable_filter
的内核模块使用。
方法二:modinfo
给定一个内核模块 X
,您可以通过运行 modinfo
命令检查该 X
是否依赖于其他模块。
$ /sbin/modinfo ip_tables
filename: /lib/modules/4.15.0-128-generic/kernel/net/ipv4/netfilter/ip_tables.ko
description: IPv4 packet filter
author: Netfilter Core Team
license: GPL
srcversion: DE5BF669F4D356757BF7344
depends: x_tables
retpoline: Y
intree: Y
name: ip_tables
vermagic: 4.15.0-128-generic SMP mod_unload
如上面的示例输出所示,ip_tables
模块依赖于 x_tables
。
方法三:modules.dep
如果您想获取所有现有内核模块依赖项的完整列表(无论是否加载内核模块),您只需查看内核的 modules.dep
文件即可。 modules.dep
由 depmod
工具自动生成,它显示了 /lib/modules/$(uname -r)
中找到的所有内核模块的依赖项。
$ cat /lib/modules/$(uname -r)/modules.dep
. . . .
kernel/net/ipv4/netfilter/ip_tables.ko: kernel/net/netfilter/x_tables.ko
kernel/net/ipv4/netfilter/iptable_filter.ko: kernel/net/ipv4/netfilter/ip_tables.ko kernel/net/netfilter/x_tables.ko
kernel/net/ipv4/netfilter/iptable_mangle.ko: kernel/net/ipv4/netfilter/ip_tables.ko kernel/net/netfilter/x_tables.ko
kernel/net/ipv4/netfilter/iptable_nat.ko: kernel/net/ipv4/netfilter/ip_tables.ko kernel/net/ipv4/netfilter/nf_nat.ko kernel/net/netfilter/x_tables.ko kernel/net/ipv4/netfilter/nf_conntrack_ipv4.ko kernel/net/netfilter/nf_conntrack.ko kernel/net/ipv4/netfilter/nf_defrag_ipv4.ko
. . . .