商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux查看当前开启的内核模块 lsmod与modinfo用法

Linux查看当前开启的内核模块 lsmod与modinfo用法

  发布于2026-05-21 阅读(0)

扫一扫,手机访问

在Linux系统里,内核模块的管理和排查是个精细活儿。很多朋友都熟悉lsmodmodinfo这两个命令,但真正用起来,却常常发现它们给出的信息似乎对不上号,或者漏掉了关键线索。这其实是因为这两个工具的关注点完全不同,必须配合使用才能拼出完整的真相。

lsmod仅显示模块加载状态,无法确认是否正常工作;modinfo只读取磁盘文件元数据;二者必须配合使用:lsmod查运行态,modinfo查兼容性与参数。

Linux查看当前开启的内核模块 lsmod与modinfo用法

简单来说,lsmod告诉你的是“哪些模块正在内存里跑着”,但它可不管这个模块是不是真的在工作,或者能不能正常工作。而modinfo呢,它压根不关心模块有没有被加载,它的任务就是去翻看磁盘上那个模块文件自带的“说明书”(元数据)。所以,想把模块问题搞清楚,这两者缺一不可。

lsmod 输出里 Used by 为 0 是什么情况

看到Used by那一列是0,先别急着下结论说这个模块是“闲置”的。它只表示当前没有其他模块或内核子系统明确引用它,但模块本身确实还驻留在内存中。以下几种情况都很常见:

  • 模块刚被modprobe加载进来,但触发它工作的条件还没满足。比如一个USB设备驱动加载了,可对应的U盘还没插上。
  • 驱动已经加载,对应的硬件却被热拔出了,或者电源关了。像usb_storage模块,U盘拔掉后,它可能还在列表里,但Used by就变成了0。
  • 有些模块设计上就是“常驻监听”的,比如kvm_intel,即便当前没有虚拟机在跑,它也会保持加载状态,Used by长期为0也不奇怪。
  • 这里有个关键陷阱:Used by 0绝不等于这个模块就能安全卸载。你尝试rmmod时,很可能还是会收到Module is in use的错误。这是因为内核内部可能通过try_module_get()这类机制持有着引用,而lsmod的统计反映不出来。

modinfo 查不到模块名?先确认模块是否存在

modinfo报出ERROR: Module not found时,别先怀疑自己命令敲错了。十有八九,是这个模块根本就没安装到你当前运行的内核版本路径下。排查可以按这个顺序来:

  • 先用uname -r确认一下当前内核版本,比如输出是6.8.0-45-generic
  • 然后去对应的路径下找文件:ls /lib/modules/$(uname -r)/kernel/drivers/net/wireless/rtw88/rtw88_8822bu.ko*。看看文件到底在不在。
  • 如果文件存在,但是.ko.xz这样的压缩格式,通常modinfo是能直接识别的,不需要手动解压。不过,一些比较老的工具链可能不支持,这时可以临时解压验证一下:xz -d rtw88_8822bu.ko.xz
  • 还要注意模块名和文件名的区别。比如ath9k.ko这个文件,对应的模块名就是ath9k。但像ath9k_common.ko,它通常是一个依赖模块,你不能直接用modinfo ath9k_common去加载它,得靠modprobe ath9k在加载主模块时自动把它带起来。

grep 过滤 lsmod 时为什么漏掉模块

想用lsmod | grep nvidia来找所有NVIDIA相关模块?结果可能会让你失望,因为模块名不一定都包含你想找的关键词。这里有几个典型的“坑”:

  • NVIDIA驱动的主模块确实是nvidia,但它的配套模块可能叫nvidia_uvmnvidia_drmnvidia_modeset。光用grep nvidia,后面这几个就全漏了。
  • 有些模块用了别名(alias)。比如btusb模块,可能在/etc/modprobe.d/的某个配置文件里被设置成了bluetooth的别名。这时你用lsmod | grep bluetooth去搜,自然什么也看不到。
  • 命令是大小写敏感的。LSMOD不是有效命令,lsmod | grep NVME也匹配不到全小写的nvme模块。
  • 更稳妥的做法是:lsmod | awk '{print $1}' | grep -i 'nvidia\|nvme\|bt'。先用awk精准提取第一列(模块名),再进行不区分大小写的过滤。

modinfo -p 显示的参数,为什么 modprobe 加了却没生效

modinfo -p列出来的,是模块在编译时就声明好的、可供配置的参数列表。但这只是个“菜单”,想让参数真正起作用,还得满足几个条件:

  • 参数必须在modprobe命令里显式地传进去。比如:sudo modprobe r8169 disable_msi=1
  • 如果模块已经加载在内存里了,那么再次执行modprobe(不带-r选项)默认是不会重新加载的。你得先rmmod r8169把它卸掉,再重新执行带参数的modprobe命令。
  • 有些参数比较特殊,必须在模块加载之前,通过内核启动参数来设置。例如i915.enable_psr=0这种,得写在GRUB配置文件的linux行里。等系统跑起来再用modprobe传,是无效的。
  • 怎么验证参数生效了呢?模块加载后,可以去/sys/module/下对应的目录查看:sudo cat /sys/module/r8169/parameters/disable_msi。如果输出是Y或者1,那才算成功。

说到底,内核模块管理的麻烦之处,不在于命令有多难记,而在于它的状态信息是分散在多处的。运行时的加载状态在/proc/moduleslsmod的数据源),模块文件本身和它的元数据在/lib/modules/$(uname -r)/目录下,而加载后的参数和详细状态又在/sys/module/里。这三层信息各自为政,如果只盯着一个地方看,很容易就查偏了方向。

本文转载于:https://www.php.cn/faq/2445430.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注