insmod和modprobe之间有什么区别?

insmod和modprobe之间有什么区别吗?
6个回答

modprobe/lib/modules/$(uname -r)/modules.dep.bin(如果其他文件不可用,则没有.bin后缀)中读取模块。从同一文件中,加载依赖项。

modprobe接受/lib/modules/$(uname -r)中的.ko文件的名称(例如,对于文件dkms/nvidia-current.ko,可以使用nvidia-current)和别名(modules.alias.bin)。内置模块(modules.alias.bin)也被识别,但由于这些模块默认加载,所以没有必要使用modprobe加载此类模块。

另一方面,insmod接受文件路径。模块不必驻留在/lib/modules/$(uname -r)中,但依赖项不会自动加载。这是modprobe用来加载模块的较低级程序。

与模块相关的其他程序包括rmmodmodinfo

rmmod 根据 /proc/modules 中的名称删除一个内核模块。这个名称不一定要与传递给 modprobe 的名称相同(例如,对于 nvidia-current 文件,这个名称是 nvidia)。

modinfo 接受一个文件名,或者在 /lib/modules/$(uname -r) 中没有 .ko 后缀的文件名。


根据man insmod的说明:
大多数用户更倾向于使用modprobe,它更智能且可以处理模块依赖关系。

2啊,抱歉,漏掉了那一行。 - NES

modprobe是一个智能命令,它在加载模块时查找依赖关系。假设我加载了一个模块,该模块中定义了一些其他模块中的符号(此模块路径在主模块内给出)。因此,modprobe会加载主模块和依赖模块。

但如果使用insmod,它将不会加载依赖项,因此会出现编译错误,如未解析的符号。在这种情况下,我们必须手动查找相关模块,并按顺序加载它们以解决错误。


modprobe这个实用程序值得一提。与insmod类似,modprobe将一个模块加载到内核中。不同之处在于,它会检查要加载的模块是否引用了内核中当前未定义的任何符号。如果找到任何此类引用,modprobe会在当前模块搜索路径中寻找定义相关符号的其他模块。当modprobe找到这些被加载模块所需的模块时,它也会将它们加载到内核中。如果在这种情况下使用insmod,命令将失败,并在系统日志文件中留下一个“未解析的符号”消息。

modprobe命令提供了比基本的insmod和rmmod工具更多的功能。modprobe可以智能地向Linux内核添加或删除模块。请注意,为了方便起见,在模块名称中使用下划线(_)和破折号(-)没有区别(会自动进行下划线转换)。modprobe在模块目录/lib/modules/uname -r中查找所有模块和其他文件,但不包括/etc/modprobe.d目录中的可选配置文件(一些发行版使用/etc/modprobe.conf文件代替)。

了解更多


如上所述,insmod需要明确指定“mymodule”.ko文件的路径,而modprobe会在/lib/modules/'uname -r'路径中搜索模块名称,并且不处理明确的文件名。 我想使用modprobe,但它在路径中找不到.ko文件。即使insmod可以加载它。
结果发现,我需要使用以下命令刷新模块的依赖关系:
sudo depmod

为了让modprobe能够找到你新放置在/lib/modules/'uname -r'路径下的模块。