
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/modules | lsmod 读取的原始输出 |
故障排查
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 配合使用,即可构成一套完整的模块管理流程。