为什么“lsmod | wc -l”不等于“ls /sys/module | wc -l”

and*_*ndy 10 linux filesystems kernel

为什么这两个命令返回不同的结果?

lsmod | wc -l
100

ls /sys/module | wc -l
138
Run Code Online (Sandbox Code Playgroud)

Mik*_*eyB 13

lsmod列出所有加载的动态模块。

中的条目/sys/module对应于动态模块内置于内核中(并且具有需要可访问的参数)而不是动态加载的模块。例如:

[michael@brazzers:~]$ ls -d /sys/module/ip_tables/
/sys/module/ip_tables/
[michael@brazzers:~]$ lsmod |grep ^ip_tables
ip_tables              26995  3 iptable_filter,iptable_mangle,iptable_nat
[michael@brazzers:~]$ grep CONFIG_NF_NAT_IPV4 /boot/config-3.8.0-30-generic
CONFIG_NF_NAT_IPV4=m
Run Code Online (Sandbox Code Playgroud)

在这里可以看到iptables模块被配置为动态模块。相比较:

[michael@brazzers:~]$ ls -d /sys/module/apparmor/
/sys/module/apparmor/
[michael@brazzers:~]$ lsmod |grep ^apparmor
[michael@brazzers:~]$ grep APPARMOR /boot/config-3.8.0-30-generic 
CONFIG_SECURITY_APPARMOR=y
Run Code Online (Sandbox Code Playgroud)

而 apparmor 是内置的。


dsm*_*k80 5

  • /sys/module/MODULENAME

MODULENAME是内核中模块的名称。如果模块作为动态模块加载,则此模块名称将始终显示。这正是您在发出lsmod命令或检查/proc/modules文件时可以看到的内容。

如果它直接内置到内核中,那么它只会在它有一个版本或至少一个参数时才会显示。然后可用参数在目录中可用:

  • /sys/module/MODULENAME/parameters