insmod和modprobe有什么区别?

insmod和modprobe之间有什么区别吗?

每人man insmod

大多数用户都希望使用modprobe,它更聪明,可以处理模块依赖。

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

modprobe接受/lib/modules/$(uname -r)中的.ko文件的名称(例如,文件dkms/nvidia-current.ko nvidia-current )和别名( modules.alias.bin )。 Builtins( modules.alias.bin )也被识别,但由于这些模块是默认加载的,因此修改这种模块没有意义。

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

与模块相关的其他程序是rmmodmodinfo

rmmod根据/proc/modules的名称删除内核名称。 此名称不一定必须与传递给modprobe名称相同(对于nvidia-current文件,例如nvidia )。

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

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

但是如果使用insmod ,它将不会加载依赖项,因此它会产生像Unresolved symbols这样的编译错误。 在这种情况下,我们必须手动查找依赖模块并需要加载它们以解决错误。

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