为什么这两个命令返回不同的结果?
lsmod | wc -l
100
ls /sys/module | wc -l
138
答案1
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
您可以在此处看到 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
而 apparmor 是内置的。
答案2
/sys/module/MODULENAME
MODULENAME
是内核中的模块名称。如果模块作为动态模块加载,则此模块名称将始终显示。这正是您在发出lsmod
命令或检查/proc/modules
文件时可以看到的内容。
如果直接内置于内核中,则只有当其具有版本或至少一个参数时才会显示。然后,可用参数可在目录中找到:
/sys/module/MODULENAME/parameters