Linux 中 lsmod 命令详解

lsmod 是一个命令行工具,用于显示当前已加载的 Linux 内核模块的相关信息。

本指南讲解如何使用 lsmod 列出模块、筛选输出,以及配合相关的模块管理命令一起使用。

内核模块

内核是操作系统的核心组件,它管理系统资源,并充当计算机硬件与软件之间的桥梁。

Linux 内核采用模块化设计。内核模块(通常被称为驱动)是一段用于扩展内核功能的代码。模块既可以编译为可加载模块,也可以直接内置进内核。可加载模块可以根据需要,在运行中的内核上加载和卸载,而不必重启系统。

一般来说,模块由 udev(设备管理器)按需加载。你也可以用 modprobe 命令手动将模块加载进内核,或者在启动时通过 /etc/modules 或 /etc/modules-load.d/*.conf 文件自动加载。

内核模块存放在 /lib/modules/<kernel_version> 目录下。要查看当前运行内核的版本,使用 uname -r 命令。

使用 lsmod

lsmod 读取 /proc/modules 的内容,并以格式化的列表形式显示出来。它不接受模块名或其它位置参数。它的选项用于控制诊断信息,或显示帮助与版本信息,但这些选项不会筛选或重排模块列表。

在命令行运行 lsmod,即可查看当前已加载了哪些内核模块:

lsmod

命令会为每一个已加载的内核模块输出一行信息:

Module                  Size  Used by
cmac                   16384  0
rfcomm                 81920  4
...
ahci                   40960  1
intel_lpss_pci         20480  0
i2c_i801               32768  0
libahci                32768  1 ahci
intel_lpss             16384  1 intel_lpss_pci
...

每一行包含三列:

  • Module(模块名)— 模块的名称。
  • Size(大小)— 模块的总大小,单位字节。
  • Used by(被引用)— 模块的引用计数,后面跟着一个以逗号分隔的依赖模块列表。值为零表示此刻没有未完成的引用,但这并不能证明该模块处于非活跃状态或可以安全移除。

筛选已加载的模块

要检查某个特定模块是否已加载,将输出通过管道交给 grep。例如,检查 kvm 模块是否已加载:

lsmod | grep kvm
kvm_intel             278528  0
kvm                   651264  1 kvm_intel
irqbypass              16384  1 kvm

要列出当前引用计数为零的模块:

lsmod | awk '$3 == 0'

请将这个输出视为诊断的起点,而不是「可以安全移除」的模块清单。

用 modinfo 查看模块详情

要查看某个特定模块的详细信息(如描述、作者、许可证和参数),使用 modinfo 命令:

modinfo kvm
filename:       /lib/modules/6.8.0-45-generic/kernel/arch/x86/kvm/kvm.ko
license:        GPL
author:         Qumranet
...
description:    Kernel virtual machine module
...

速查表

命令说明
lsmod列出所有已加载的内核模块
lsmod | grep module检查某个特定模块是否已加载
lsmod | awk '$3 == 0'列出引用计数为零的模块
modinfo module显示模块的详细信息
modprobe module加载一个模块及其依赖
modprobe -r module卸载一个模块及其依赖
insmod /path/to/module.ko按文件路径插入一个模块
rmmod module移除一个已加载的模块
cat /proc/moduleslsmod 读取的原始输出

故障排查

modprobe -r 或 rmmod 报错「module is in use(模块正在使用中)」:先在 lsmod 的 Used by 列查看依赖,并先卸载那些依赖模块。即使没有显示依赖模块名,某个进程、设备或服务也可能仍持有引用,因此在卸载前应先停止相关负载。

lsmod: command not found(找不到命令):精简容器或裁剪过的系统可能缺少 kmod 软件包。用系统的包管理器安装 kmod 后重新运行该命令。

在受限环境中输出看起来不完整:部分容器或加固环境只暴露了受限的 /proc/modules 视图。要在宿主机上运行该命令,才能获得完整的模块可见性。

不安全的模块卸载尝试:移除活跃的内核模块可能导致网络、存储或其它硬件功能失效。在生产系统上运行 modprobe -r 或 rmmod 之前,务必先确认依赖关系与影响。

常见问题(FAQ)

lsmod 是否接受选项或标志?它接受 -s(--syslog)、-v(--verbose)、-V(--version)和 -h(--help)。前两个控制诊断信息,后两个显示信息后退出。这些选项都不会筛选或重排模块列表,且该命令不接受位置参数。要筛选结果,可将输出通过管道交给 grep 或 awk。

modprobe 与 insmod 有什么区别?modprobe 是推荐工具:它会自动解析并加载模块依赖。insmod 则只按文件路径加载单个模块,不处理依赖关系。

如何卸载一个内核模块?使用 modprobe -r module_name 或 rmmod module_name。正常卸载要求引用计数为零且没有依赖模块,但内核还必须支持模块卸载,且模块本身要提供卸载例程。仅 Used by 计数为零并不保证一定能卸载成功。

能否看到开机时加载的模块?没有标准命令能提供开机期间每个模块加载的完整历史。dmesg 和 journalctl -k 可能包含模块加载时输出的消息,但成功加载并非总会记录日志。可在 /etc/modules 与 /etc/modules-load.d/*.conf 中查看被显式配置为开机加载的模块,并用 lsmod 查看当前已加载的模块。

总结

lsmod 命令会列出当前所有已加载的内核模块,以及它们的大小和依赖信息。把它与 modinfo、modprobe、rmmod 和 grep 配合使用,即可构成一套完整的模块管理流程。