Linux内核模块查看方法lsmod与modinfo使用详解
在Linux系统内核模块的管理与故障排查中,lsmod与modinfo是两个核心但侧重点迥异的命令。许多用户虽然熟悉它们,却常困惑于两者信息不一致或无法定位问题。这恰恰是因为它们分别揭示了模块状态的不同维度:一个关注运行态,一个关注静态元数据。只有协同使用,才能构建完整的诊断视图。
lsmod仅显示模块加载状态,无法确认其实际功能状态;modinfo仅读取磁盘模块文件的元数据信息。二者必须配合使用:lsmod用于检查运行状态,modinfo用于核查模块兼容性与配置参数。

简而言之,lsmod命令回答的是“哪些模块当前被加载到了系统内存中”,但它无法判断这些模块是否正在有效工作。而modinfo命令则完全不关心模块的运行状态,它的职责是解析存储在磁盘上的内核模块文件(.ko文件)内嵌的“说明文档”。因此,要全面掌握内核模块的状况,必须将这两个工具结合使用。
lsmod 输出中 Used by 列为 0 的含义与常见场景
当lsmod输出中Used by列显示为0时,切勿简单将其等同于“模块闲置可卸载”。它仅表示当前没有其他内核模块或子系统显式声明依赖于此模块,但该模块本身仍驻留在内存中。以下几种是典型情况:
- 条件未触发:模块已被
modprobe加载,但使其工作的条件尚未满足。例如,USB存储驱动usb_storage已加载,但对应的U盘设备尚未插入。 - 设备热移除:驱动对应的硬件被热拔插或断电。拔掉U盘后,
usb_storage模块可能仍在列表中,但Used by计数归零。 - 常驻监听型模块:如虚拟化模块
kvm_intel,即使当前没有虚拟机运行,它也会保持加载状态以准备接收指令,此时Used by长期为0属正常现象。 - 关键陷阱:
Used by 0绝不意味着模块可以安全卸载。尝试rmmod时,很可能仍会收到“Module is in use”错误。这是因为内核可能通过try_module_get()等内部机制持有引用,而lsmod的统计无法捕捉这类隐式依赖。
modinfo 查不到模块?先确认模块文件是否存在
当执行modinfo命令报错“ERROR: Module
- 确认内核版本:使用
uname -r获取当前运行的内核版本,例如6.8.0-45-generic。 - 查找模块文件:前往对应内核模块目录查找,例如:
ls /lib/modules/$(uname -r)/kernel/drivers/net/wireless/rtw88/rtw88_8822bu.ko*,确认.ko文件是否存在。 - 处理压缩模块:若模块文件为
.ko.xz等压缩格式,现代modinfo通常能直接识别。若旧版工具不支持,可临时解压验证:xz -d rtw88_8822bu.ko.xz。 - 区分模块名与文件名:注意模块名(加载时使用的名称)与文件名可能不同。例如文件
ath9k.ko对应模块名ath9k。而ath9k_common.ko通常是依赖模块,需通过modprobe ath9k加载主模块时自动引入,直接查询可能失败。
使用 grep 过滤 lsmod 输出时为何遗漏模块
试图用lsmod | grep nvidia来筛选所有NVIDIA相关模块?结果可能不完整,因为模块名未必包含你预设的关键词。常见原因如下:
- 模块名变体:NVIDIA驱动主模块为
nvidia,但其配套模块可能名为nvidia_uvm、nvidia_drm、nvidia_modeset。仅用grep nvidia会漏掉后者。 - 模块别名(Alias):某些模块通过
/etc/modprobe.d/下的配置文件设置了别名。例如btusb模块可能别名是bluetooth,此时用grep bluetooth搜索lsmod输出将一无所获。 - 大小写敏感:命令搜索是大小写敏感的。
lsmod | grep NVME无法匹配到全小写的nvme模块。 - 更可靠的过滤方法:建议使用
lsmod | awk '{print $1}' | grep -i 'nvidia\|nvme\|bt'。先通过awk精确提取第一列模块名,再进行不区分大小写(-i)的多关键词匹配。
modinfo -p 显示的参数,为何通过 modprobe 加载后未生效
modinfo -p列出的是模块在编译时预定义的、可供用户配置的参数列表。但这仅是“参数菜单”,要使参数实际生效,必须满足以下条件:
- 正确传递参数:必须在
modprobe命令中显式指定参数。例如:sudo modprobe r8169 disable_msi=1。 - 模块需重新加载:如果模块已加载在内存中,再次执行不带
-r选项的modprobe命令默认不会重新加载。必须先rmmod r8169卸载模块,再用带参数的modprobe命令重新加载。 - 内核启动参数:部分参数(尤其是驱动核心参数)必须在模块加载之前通过内核启动命令行传递。例如
i915.enable_psr=0,需写入GRUB配置的linux行中。系统启动后再通过modprobe设置是无效的。 - 验证参数生效:模块加载后,可检查
/sys/module/下对应的参数文件来验证:sudo cat /sys/module/r8169/parameters/disable_msi。若输出为Y或1,则表示参数已成功应用。
综上所述,Linux内核模块管理的复杂性并非源于命令本身,而在于其状态信息分散在三个不同的层次:运行时加载状态记录在/proc/modules(即lsmod的数据源);模块文件及其元数据存放在/lib/modules/$(uname -r)/目录下;而模块加载后的详细参数与实时状态则暴露在/sys/module/文件系统中。这三层信息各自独立,若只依赖单一工具查看,极易导致诊断方向偏差。掌握lsmod、modinfo及/sys文件系统的协同使用,是高效管理和排查内核模块问题的关键。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Mac开机启动磁盘选择与双系统切换指南
开机时想临时切换操作系统?无论是macOS与Windows双系统间的灵活切换,还是从外置硬盘或网络启动,Mac都提供了便捷的解决方案。关键在于掌握正确的按键时机与操作流程。下面这张示意图直观展示了核心操作路径,帮助您快速建立全局认知: 接下来,我们将为您详细解析每一种具体操作方法。 一、使用Opti
Linux系统自定义登录欢迎信息MOTD修改教程
修改 etc motd 文件是自定义 Linux 登录欢迎信息最直接的方法,但在 Ubuntu 或 Debian 等较新的发行版上,你可能会发现修改后没有效果。这通常是因为系统默认启用了一套动态生成机制,静态文件的内容会被覆盖——想让改动生效,需要先理解并处理好这套动态机制。 为什么修改 etc
Win11时间错误导致网页无法打开的解决方法与自动校准教程
网页无法访问时,别急着归咎于网络连接。有时,问题根源可能在于电脑右下角的系统时间。当你发现系统日期明显异常——例如年份仍停留在过去,或已跳转至未来,甚至时区显示混乱——这很可能是因为TLS SSL证书验证失败。现代浏览器对HTTPS证书的有效期检查极为严格,一旦系统时间不准,便会直接阻断访问。 无需
Linux内网NTP服务器搭建与时间同步配置指南
部署内网NTP服务器时,仅安装ntpd服务往往无法保证时间同步成功。许多运维工程师都曾遇到这样的困境:配置检查无误,但执行ntpq -p命令始终返回no association,ntpstat状态也一直显示unsynchronised。问题的症结究竟在哪里?核心在于三个关键环节:系统时区必须准确、上
Mac系统缓存清理教程 解决苹果电脑卡顿与提速优化方法
当你的Mac出现响应迟缓、应用启动缓慢或磁盘空间持续告急时,系统与应用程序的“缓存文件”往往是主要原因。缓存机制原本旨在提升运行效率,但长期积累的无效缓存不仅会占用大量存储空间,还可能影响内存分配与后台服务,最终导致整体性能下降。无需安装任何第三方清理软件,遵循以下基于macOS原生功能的步骤,即可
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

