如何列出所有可加载的内核模块?

Use*_*erK 88 kernel-modules linux-kernel

我正在寻找一些内核模块来加载i2c-devi2c-bcm2708. 但modprobe命令返回:

sudo modprobe i2c-dev
modprobe: module i2c-dev not found in modules.dep
Run Code Online (Sandbox Code Playgroud)

如何列出系统中所有可用的模块?它们位于哪个目录中?

jim*_*mij 106

  • 默认情况下,modprobe从位于/lib/modules/$(uname -r)目录中的内核子目录加载模块。通常所有文件都有扩展名.ko,所以你可以用

    find /lib/modules/$(uname -r) -type f -name '*.ko'
    
    Run Code Online (Sandbox Code Playgroud)

    或者,考虑到压缩文件:

    find /lib/modules/$(uname -r) -type f -name '*.ko*'
    
    Run Code Online (Sandbox Code Playgroud)
  • 每个模块也可以通过引用它的别名来加载,存储在/lib/modules/$(uname -r)/modules.alias(和modules.alias.bin)中。

  • 但是,要成功加载模块,modprobe需要在文件中列出它们的依赖项/lib/modules/$(uname -r)/modules.dep(以及相应的二进制版本modules.dep.bin)。如果系统上存在某个模块,但不在列表中,那么您应该运行一个命令depmod,该命令将生成此类依赖项并自动将您的模块包含到modules.dep和 中modules.dep.bin

  • 此外,如果模块成功加载,它将在文件中列出/proc/modules(也可以通过 command 访问lsmod)。

  • Redhat 7 模块文件以 .xz 格式压缩(不确定是因为内核版本还是操作系统版本。如果有人可以向我澄清?)所以我认为您可能无法使用 jimmij 的 find 命令找到它们。改用`find /lib/modules/$(uname -r) -type f -name *.ko* ` (3认同)

Mar*_*sen 12

键入modprobe并按 Tab,自动完成列表应包含所有可加载模块

  • 它不适用于某些系统 (19认同)
  • 需要必要的完成脚本才能工作 (6认同)
  • 即使在较新的系统上也需要很长时间,并且没有提供一种真正好的方法来查看所有条目...仅分页到 30k 可能性的一个方向可能不是很有启发 (2认同)

小智 9

Arch Linux 中lsmod一个kmod包命令,它列出并显示包含其他有用命令的 Linux 内核模块的状态,例如, 。modinformmod modprobe

IST由您可以键入程序包提供的所有二进制文件:

pacman -Ql kmod | grep /bin/ --color=always
Run Code Online (Sandbox Code Playgroud)

,你也可以检查该Ø用二进制的wner包pacman -Qo lsmod


Q开关是q uery本地安装的软件包(不像S小号ynchronize,即远程查看)。

  • 重要的是要强调 `lsmod` 只显示*已经*加载的模块。该线程的作者在加载一个不在可加载内核模块映射中的模块时遇到了问题。此外,该解决方案仅适用于 archlinux。这可能不是作者的分布,也可能无法解决其他人的问题。 (4认同)

Ake*_*ndo 7

我更喜欢使用depmod. 使用命令:depmod -av|grep MOD_NAME,您的系统将生成modules.dep/map 文件并通过它进行grep。该-v参数对于详细程度非常重要,并-a确保所有可能的模块都/lib/modules/用于modules.dep 文件。

这样就可以确保所请求的内核模块被映射到可加载的内核。当输出中没有列出所需的内核模块时,您就知道内核找不到它。

  • 根据“man depmod”选项,不需要“-a”——如果命令行中没有给出文件名,则默认启用它。 (2认同)

alb*_*fan 5

您可以检查自动补全是如何执行的:

$ complete -p modprobe
complete -F _modprobe modprobe
declare -f _modprobe
_modprobe () 
{ 
...
Run Code Online (Sandbox Code Playgroud)

在该函数中有一个内部_installed_modules

$ declare -f _installed_modules
_installed_modules () 
{ 
    COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
        awk '{if (NR != 1) print $1}')" -- "$1"))
}
Run Code Online (Sandbox Code Playgroud)

所以lsmod | awk '{if (NR != 1) print $1}'应该显示模块列表