Linux怎么用lsmod查看已加载内核模块?

作者:技术拾光时间:2026-06-22 12:09:19浏览:426

lsmod仅显示加载状态,无法确认是否在用、签名或硬件绑定,需结合dmesg、lspci、ethtool、modinfo等交叉验证。模块名不匹配、黑名单或签名问题可致lsmod遗漏,需其他命令深入排查。

lsmod 仅显示模块加载状态,无法确认是否正在使用、是否包含签名或是否绑定硬件,需要结合 dmesg、lspci、ethtool、modinfo 等命令进行交叉验证。
Linux怎么用lsmod查看已加载内核模块?

lsmod 能够直接列出当前已加载的内核模块,但这一描述仅部分准确。虽然它确实可以列出模块,但仅凭 lsmod 无法判断模块是否真正被使用、是否经过签名、是否与特定硬件绑定。这些详细信息需要借助其他命令逐层获取。

为什么 lsmod 显示模块但无法卸载

常见场景:执行 rmmod nvidia 时出现 Module nvidia is in use 错误,而 lsmod | grep nvidia 第三列显示的 Used by 值为 0。这种情况的原因如下:

  • Used by 0 仅表示没有其他模块显式引用该模块,并不代表内核内部没有持有引用。例如,GPU 正在渲染、设备文件被打开、或者有代码通过 try_module_get() 主动增加了引用计数。
  • 真实的占用信息通常记录在 dmesg 中。执行 dmesg | tail -20,检查是否包含 nvidia: module is in use 或类似提示。
  • 部分模块属于“常驻”类型,例如 kvm_intel。即使没有运行虚拟机,该模块也会保持加载状态,Used by 长期显示 0,但尝试 rmmod 时仍会报错。

lsmod | grep xxx 容易遗漏模块,推荐使用以下方式

直接使用 grep 搜索模块名容易出现遗漏,主要原因包括:

  • 模块名不等于驱动名或文件名。例如,nvme_core.ko 加载后显示的名称是 nvme_core,而非 nvme。
  • 一个驱动常被拆分为多个模块(如 nvidia、nvidia_modeset、nvidia_uvm),仅搜索主名称会遗漏依赖模块。
  • 搜索区分大小写,且不支持通配符——lsmod | grep nvme* 无法生效。

更可靠的方法是先提取第一列再过滤:

lsmod | awk '{print $1}' | grep -i -E '^(nvme|nvidia|kvm|kysec)'

确认模块是否真正生效,不能仅依赖 lsmod

lsmod 只能说明模块代码已加载到内存,并不能代表驱动已绑定到设备,也不代表模块参数已生效。

  • 检查硬件绑定:对于 PCI 设备,使用 lspci -k -s $(lspci | grep -i nvidia | cut -d' ' -f1) 查看 Kernel driver in use: 字段——这才是驱动与硬件绑定的直接证据。
  • 检查网卡驱动:使用 ethtool -i eth0 确认 driver 字段不为空,而不是仅凭 lsmod | grep e1000 便认为驱动已生效。
  • 检查模块参数是否加载成功:先执行 modinfo -p nvidia | grep NVreg_EnableGpuFirmware,再对比 cat /sys/module/nvidia/parameters/NVreg_EnableGpuFirmware,若两者不一致,说明参数并未生效。
  • 检查安全模块状态:通过 lsmod | grep apparmor 看到模块后,仍需执行 aa-status 确认安全策略已运行,才算完成验证。

lsmod 看不到模块?先排查以下三点

如果预期模块未出现在 lsmod 输出中,无需立即重装驱动,可按照以下顺序排查:

  • 模块是否未加载?手动执行 sudo modprobe nvidia && lsmod | grep nvidia,而非仅依赖开机自动加载——有时只是触发条件未满足。
  • 模块是否被列入黑名单?执行 modprobe --showconfig | grep -A5 'blacklist nvidia',或检查 /etc/modprobe.d/*.conf 文件中是否存在 blacklist nvidia 配置行。
  • 模块签名是否不匹配?当内核启用了 CONFIG_MODULE_SIG_FORCE=y 时,未签名的模块会被静默拒绝。执行 dmesg | grep -i "signature",若看到 module verification failed 提示,则 lsmod 中自然不会显示该模块。

lsmod 只是排查的起点,而非终点。模块加载仅反映最表层的状态,真正影响系统行为的是模块是否绑定设备、参数是否生效、签名是否被接受、依赖关系是否完整——这些均需借助其他命令逐层深入才能确认。