lsmod仅显示模块已加载,不反映真实使用状态;used by为0不代表可卸载,因内核可能内部持有引用,需结合dmesg、lspci、ethtool等交叉验证设备绑定与参数生效情况。

直接运行 lsmod 就能列出所有已加载的内核模块——它读的是 /proc/modules,结果实时、可靠、无需 root 权限。但仅靠 lsmod 不能确认驱动是否真在用、有没有绑定设备、参数是否生效,必须组合验证。
为什么 lsmod 显示了模块却不能卸载
常见现象是执行 rmmod nvidia 报错 Module nvidia is in use,哪怕 lsmod | grep nvidia 第三列显示为 0。
-
Used by 0只表示没有其他模块显式引用它,不等于内核没内部持有(比如 GPU 正在渲染、/dev/nvidiactl被打开、或通过try_module_get()主动加了引用) - 真实占用常藏在
dmesg里:运行dmesg | tail -20,找nvidia: module is in use或类似提示 - 某些模块(如
kvm_intel)设计为“常驻”,即使没跑虚拟机也保持加载且Used by长期为 0,但rmmod仍会失败
lsmod | grep 总是漏模块?试试这个写法
直接 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是否非空 - 查模块参数是否加载成功:运行
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 只告诉你“代码进了内核”,不保证“设备连上了、probe 完了、netdev 注册了、参数生效了”。每一步都可能断在中间,得靠 dmesg+ethtool+lspci -k 交叉印证。











