lsmod仅确认驱动代码是否加载进内核,不能证明设备已绑定或功能启用;必须结合lspci -k、ethtool -i、dmesg等命令交叉验证probe状态、硬件绑定及参数生效情况。

lsmod 是唯一能直接告诉你“驱动代码是否已进入内核”的命令——它读的是 /proc/modules,实时、可靠、不需要 root 权限。但仅靠它判断“驱动在用”,90% 的情况下会误判。
为什么 lsmod | grep nvme 有输出,lspci -k 却显示 Kernel driver in use: none
模块加载 ≠ 设备绑定。常见断点有三个:
- 设备被
vfio-pci或pci-stub抢占:检查lspci -k -s 0000:01:00.0中的Kernel modules:字段,若列出vfio_pci,说明该设备根本没交给nvme模块管理 - 驱动 probe 失败:运行
dmesg | grep -i nvme,出现probe failed或Unknown symbol in module表示依赖缺失或硬件不匹配 - 模块名大小写敏感且不含扩展名:你编译的
my_nvme.ko加载后在lsmod里只显示为my_nvme,lsmod | grep MY_NVME必然为空
modinfo 必须查的三个参数:-p、-n、-F sig_id
modinfo 不是看作者和描述的,关键就这三项:
modinfo -p:列出所有可调参数,比如igbInterruptThrottleRate,这是网卡中断调优的入口,不查这个你连能不能改都搞不清modinfo -n:返回路径,如igb/lib/modules/5.15.0-101-generic/kernel/drivers/net/ethernet/intel/igb/igb.ko,若路径指向旧内核目录(比如5.4.0),说明模块版本错配,加载可能失败modinfo -F sig_id:检查签名 ID,若输出为空且系统启用了igbCONFIG_MODULE_SIG_FORCE=y(查zcat /proc/config.gz | grep MODULE_SIG_FORCE),那这个模块压根不会被加载
确认“真正在用”的唯一闭环:lspci -k 或 ethtool -i
只有这两条命令能告诉你设备是否真正绑定了驱动:
lspci -k看 PCI 设备:找到对应设备行,检查Kernel driver in use:后面是不是你要的模块名;再看Kernel modules:是否包含它——前者表示已绑定,后者表示可绑定ethtool -i看网卡接口:输出中ens33driver:字段必须是非空且匹配预期(如igb),若为unknown或空白,说明probe()没走完,netdev没注册,lsmod再多也没用- USB 设备用
lsusb -t:看树状结构里某设备节点下挂的是不是你的驱动名,比如driver=usb-storage
这里有个常被忽视的关键点:模块加载成功,仅仅只是万&里长征的第一步。lsmod 的职责仅限于确认代码是否进入内核,它无法替你确认硬件连接状态、probe 函数是否执行完毕、netdev 是否完成注册,或是参数是否真正生效。这条链路中的任何一个环节断裂,都会导致功能失效。因此,必须通过 dmesg、lspci -k 与 ethtool -i 进行交叉验证,三者缺一不可。
