来自Linux内核3.2的文档(文档/kbuild/modules.txt)
=== 5. Module Installation
Modules which are included in the kernel are installed in the
directory:
/lib/modules/$(KERNELRELEASE)/kernel/
And external modules are installed in:
/lib/modules/$(KERNELRELEASE)/extra/
这意味着如果我查看,/lib/modules/$(KERNELRELEASE)/extra/
我可以找到所有已安装的外部内核模块。但是,我发现官方 Nvidia 显示驱动程序安装nvidia.ko
到/lib/modules/$(KERNELRELEASE)/kernel/drivers/video/
.这与上述规则相矛盾,并表明该路径不是包含/外部模块的可靠指示符。
如何获取已安装的外部内核模块的列表?如果发行版很重要,我想知道 RHEL 6 和 Ubuntu 10.04 的答案。
答え1
对于 Debian/Ubuntu,类似
dpkg -S *.ko | grep /lib/modules | grep -v linux-image
应该管用。免责声明:我对模式匹配一无所知,所以可能有更好的方法来做到这一点。在我的系统上,我得到
nvidia-kernel-2.6.32-5-vserver-686-bigmem: /lib/modules/2.6.32-5-vserver-686-bigmem/nvidia/nvidia.ko
nvidia-kernel-2.6.26-2-vserver-686-bigmem: /lib/modules/2.6.26-2-vserver-686-bigmem/nvidia/nvidia.ko
nvidia-kernel-2.6.26-1-vserver-686-bigmem: /lib/modules/2.6.26-1-vserver-686-bigmem/nvidia/nvidia.ko
这确实假设打包系统已知所有已安装的模块,但这通常是一个好主意。至少在 Debian 上,通常可以将内核模块安装为二进制包。这种方法的优点是它可以告诉您内核模块属于哪个包。类似的方法应该适用于其他使用包管理系统的 Linux 发行版;即他们中的大多数。
由于第三方模块的位置与内核模块的位置相似,因此不容易区分它们。查询包管理器使事情变得更容易。然而,在我当前运行的内核中,在目录中/lib/modules/2.6.32-5-vserver-686-bigmem
,我注意到 nvidia 模块位于与主内核模块不同的目录中,即/lib/modules/2.6.32-5-vserver-686-bigmem/nvidia
vs /lib/modules/2.6.32-5-vserver-686-bigmem/kernel
。我不知道这样的布局是否是 Debian 的政策。我所知道的最接近 Debian 内核政策的是Debian 内核手册,但我没有在那里找到任何相关内容。当然,Ubuntu 无论如何都不受 Debian 政策的约束。