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
)。内置模块(modules.alias.bin
)也被识别,但由于这些模块默认加载,所以没有必要使用modprobe加载此类模块。
另一方面,insmod
接受文件路径。模块不必驻留在/lib/modules/$(uname -r)
中,但依赖项不会自动加载。这是modprobe用来加载模块的较低级程序。
与模块相关的其他程序包括rmmod
和modinfo
。
rmmod
根据 /proc/modules
中的名称删除一个内核模块。这个名称不一定要与传递给 modprobe
的名称相同(例如,对于 nvidia-current
文件,这个名称是 nvidia
)。
modinfo
接受一个文件名,或者在 /lib/modules/$(uname -r)
中没有 .ko
后缀的文件名。
man insmod
的说明:modprobe
是一个智能命令,它在加载模块时查找依赖关系。假设我加载了一个模块,该模块中定义了一些其他模块中的符号(此模块路径在主模块内给出)。因此,modprobe
会加载主模块和依赖模块。
但如果使用insmod
,它将不会加载依赖项,因此会出现编译错误,如未解析的符号
。在这种情况下,我们必须手动查找相关模块,并按顺序加载它们以解决错误。
uname -r
中查找所有模块和其他文件,但不包括/etc/modprobe.d目录中的可选配置文件(一些发行版使用/etc/modprobe.conf文件代替)。
sudo depmod