linuxlsmod 命令就是 lsmod,它是 linux 系统里专门用来列出当前内核已经加载全部内核模块的终端工具,内核模块也叫驱动模块,它可以在不重新编译内核不重启系统的情况下动态加载到内核空间,比如网卡驱动显卡驱动文件系统驱动 usb 驱动等,lsmod 本质是读取 proc 文件系统里面 modules 文件内容,然后做格式化排版输出,属于运维排查硬件驱动内核故障最基础高频命令,普通用户和 root 用户都可以直接执行,不需要额外安装,绝大多数 linux 发行版默认自带这个命令,它输出的信息可以帮运维人员判断驱动有没有加载成功,模块之间有没有依赖关系,模块是否被进程占用,是排查硬件识别异常驱动加载失败的核心参考命令,它只负责查看,本身不支持加载卸载模块,加载卸载模块需要搭配 modprobe insmod rmmod 命令配合使用。
基础原理说明
linux 内核采用模块化设计,内核本身保持精简,大部分外设驱动做成独立 ko 格式内核模块,运行时按需加载,/proc/modules 是内核维护的虚拟文件,记录所有已加载模块名称大小使用数量依赖模块列表,lsmod 就是读取这个虚拟文件,把原始数据转换成易读的表格样式,内核模块加载之后会记录引用计数,引用计数大于 0 的时候,代表这个模块正在被其他模块或者设备使用,这种状态下不能直接卸载模块,这一点是 lsmod 输出信息最重要的判断依据。
基础使用步骤
第一步打开 linux 终端,直接输入 lsmod 回车,不需要额外参数,就会输出当前全部已加载内核模块列表。
第二步如果需要查找指定模块,配合管道和 grep 过滤,例如 lsmod grep 模块名,快速定位目标驱动模块,不用滚动全部输出。
第三步对照输出三列信息,分别识别模块名称模块大小引用数量和依赖模块。
第四步如果发现目标模块没有出现在 lsmod 输出里面,代表模块没有加载,需要使用 modprobe 命令手动加载模块。
第五步如果模块存在但是硬件仍然异常,结合 dmesg 日志查看模块加载报错信息,继续排查。
输出字段深度解读
| 列名 | 含义说明 |
|---|---|
| Module | 内核模块名称,也就是 ko 模块对应的名字 |
| Size | 模块占用内核内存大小,单位是字节 |
| Used by | 引用计数以及依赖该模块的其他模块名称,引用计数大于 0 代表模块正在被占用 |
进阶实战用法
可以写 shell 脚本循环调用 linuxlsmod 命令,监控模块加载状态,适合服务器开机之后自动校验关键驱动有没有成功加载。
排查依赖问题,比如想要卸载某个模块,但是 rmmod 报错模块正在使用,就先用 linuxlsmod 命令查看 Used by 那一列,找到依赖它的上层模块,先卸载上层模块之后,再卸载目标模块。
对比多台服务器的内核模块差异,把多台机器执行 linuxlsmod 命令输出保存成文本,做 diff 对比,排查同型号服务器驱动加载不一致的问题。
区分内置内核和动态模块,有些驱动直接编译进内核,不属于动态模块,这种模块不会出现在 linuxlsmod 命令输出列表,很多新手误以为驱动缺失,实际是已经内置进内核,不会作为独立 ko 模块展示。
常见报错与踩坑
执行 linuxlsmod 命令没有任何输出,一般是 proc 文件系统没有挂载,正常系统 proc 一定会挂载,这种情况属于系统异常。
linuxlsmod 命令可以看到模块,但是设备仍然无法工作,模块加载成功不等于驱动功能正常,还需要检查设备中断权限固件文件是否缺失。
引用计数一直大于 0,无法卸载模块,很多时候是用户空间进程打开了对应设备文件,需要关闭占用进程之后引用计数才会下降。
不同内核版本对应的模块不通用,跨内核版本加载的模块,就算 linuxlsmod 命令可以显示,也可能出现内核崩溃,内核模块必须和当前内核版本严格匹配。
【常见问题】
问题 1 linuxlsmod 命令和 modinfo 有什么区别
回答 1 linuxlsmod 命令作用是列出当前内核已经加载的全部内核模块,查看加载状态和依赖引用,modinfo 是查看单个 ko 模块文件本身的元信息,比如模块作者版本描述参数,linuxlsmod 命令查看的是已经加载到内存的模块状态,modinfo 读取的是磁盘上模块文件信息。
问题 2 linuxlsmod 命令显示 Used by 后面数字大于 0 是什么意思
回答 2 linuxlsmod 命令输出 Used by 列的数字代表模块引用计数,数值大于 0 说明这个内核模块正在被其他模块或者进程占用,此时不能直接卸载该模块,需要先解除占用之后再执行卸载操作。
问题 3 linuxlsmod 命令为什么看不到已经编译进内核的驱动
回答 3 linuxlsmod 命令只展示动态加载的 ko 内核模块,如果驱动直接编译进内核镜像,不属于动态模块,不会出现在 linuxlsmod 命令输出列表,这类驱动不需要单独加载,开机就已经随内核启动。
问题 4 linuxlsmod 命令需要 root 权限吗
回答 4 linuxlsmod 命令读取 proc/modules 虚拟文件,普通用户权限就可以执行,不需要切换 root,但是后续加载卸载内核模块 modprobe rmmod 操作才需要 root 权限,linuxlsmod 命令本身只是只读查询。
【免责申明】
本内容仅针对 linuxlsmod 命令做技术讲解,不同内核版本输出格式和模块管理机制存在细微差异,内核模块属于内核空间程序,错误加载卸载模块可能造成内核 panic 系统死机,请在合法授权环境操作,不要随意卸载关键系统内核模块,遵守相关操作系统安全规范。


