安全模式

如果有效 uid 不等于真实 uid,则 modprobe 会极度怀疑其输入。
最后一个参数始终被视为模块名称,即使它以 .模块名称只能有一个,变量=值形式的选项是被禁止的。
模块名称始终被视为字符串,在安全模式下不执行元扩展。
但是,元扩展适用于从配置文件读取的数据。

当从内核调用 modprobe 时,euid 可能不等于 uid,这适用于内核 2.4.0-test11 及更高版本。
在理想情况下,modprobe 可以信任内核只将有效参数传递给 modprobe。
但是,由于高级内核代码直接从用户向 modprobe 传递了未经验证的参数,因此至少发生了一个本地 root 漏洞。
所以 modprobe 不再信任内核输入。

当环境仅包含这些字符串时,modprobe 会自动设置安全模式

HOME=/
 TERM=linux
 PATH=/sbin:/usr/sbin:/bin:/usr/bin

这会在内核 2.2 到 2.4.0-test11 上检测来自内核的 modprobe 执行,即使 uid == euid,它在早期内核上也是如此。

Linux/Unix 命令:modprobe

modprobe 命令在 Linux 系统上加载新的内核模块,使我们无需重新启动即可启用新功能和支持。

记录命令

如果目录 /var/log/ksymoops 存在并且 modprobe 使用可以加载或者删除模块的选项运行,则 modprobe 会记录其命令并在 /var/log/ksymoops/'date +%Y%m% 中返回状态d.log' 。
没有禁用此自动日志记录的开关,如果我们不希望它发生,请不要创建 /var/log/ksymoops 。
如果该目录存在,则它应该由 root 拥有并且模式为 644 或者 600,并且我们应该每天左右运行脚本 insmod_ksymoops_clean。

语法

modprobe [-adnqv] [-C config] module [symbol=value ...] 
modprobe [-adnqv] [-C config] [-t type] pattern 
modprobe -l [-C config] [-t type] pattern 
modprobe -c [-C config] 
modprobe -r [-dnv] [-C config] [module ...] 
modprobe -Vh

使用 Modprobe 在 Linux 系统上加载内核模块

Modprobe 通常易于使用。
知道要加载的内核模块后,将其传递给 modprobe 命令。

sudo modprobe rtl8723de

该模块会一直加载,直到我们重新启动系统。

如果我们想在不重新启动的情况下删除模块,请重新运行带有 -r 标志的命令。

sudo modprobe -r rtl8723de

大多数情况下,这就是我们使用 modprobe 的方式。

modprobe 选项

-a , --all

加载所有匹配的模块,而不是在第一次成功加载后停止。

-c , --showconfig

显示当前使用的配置。

-C , --config 配置

使用文件 config 而不是(可选)/etc/modules.conf 来指定配置。
环境变量 MODULECONF 还可用于从默认的 /etc/modules.conf(或者已弃用的 /etc/conf.modules)中选择(并覆盖)不同的配置文件。

当设置环境变量 UNAME_MACHINE 时,modutils 使用它的值而不是来自 uname() 系统调用的 machine 字段。
这主要在 32 位用户空间中编译 64 位模块时使用,反之亦然,将 UNAME_MACHINE 设置为模块的类型。
当前的 modutils 不支持模块的完全交叉构建模式,它仅限于在 32 位和 64 位版本的主机架构之间进行选择。

-d , --debug

显示有关模块堆栈的内部表示的信息。

-h , --help

显示选项摘要并立即退出。

-k , --autoclean

在加载的模块上设置自动清理。
内核在调用 modprobe 以满足缺失的功能(作为模块提供)时使用。
-q 选项由 -k 隐含。
这些选项会自动发送到 insmod。

-n , --show

不要执行操作,只显示将要执行的操作。

-q , --安静

不要抱怨 insmod 无法安装模块。
继续像往常一样,但默默地,还有其他可能性让 modprobe 进行测试。
此选项会自动发送到 insmod。

-r , --remove

删除模块(堆栈)或者执行自动清理,具体取决于命令行中是否提到了任何模块。

-s , --syslog

通过 syslog 而不是 stderr 报告。
此选项会自动发送到 insmod。

-t 模块类型; --type 模块类型

只考虑这种类型的模块。
modprobe 只查看目录路径完全包含 /moduletype/ 的模块。
moduletype 可以包含多个目录名,例如 -t drivers/net 列出 xxx/drivers/net/ 及其子目录中的模块。

-v , --verbose

在执行时打印所有命令。

-V, --version

显示 modprobe 的版本。

模块名称不得包含路径(无/),名称也不得包含尾随 .o 。
例如,slip 是 modprobe 的有效模块名称,/lib/modules/2.2.19/net/slip 和 slip.o 是无效的。
这适用于命令行和配置中的条目。

modprobe例子

modprobe -t net

加载存储在标记为 net 的目录中的模块之一。
尝试每个模块,直到成功为止。

modprobe -a -t boot

加载所有存储在标记为 boot 的目录中的模块。

modprobe slip

如果之前没有加载模块 slhc.o,这将尝试加载模块,因为滑动模块需要 slhc 模块中的功能。
这种依赖关系在由 depmod 自动创建的文件 modules.dep 中描述。

modprobe -r slip

这将卸载滑动模块。
它还会自动卸载 slhc 模块,除非它也被某些其他模块(例如 ppp)使用。

另见:depmod(8)、lsmod(8)、kerneld(8)、ksyms(8)、rmmod(8)。

命令说明

modprobe 和 depmod 实用程序旨在使用户、管理员和发行版维护人员更易于管理 Linux 模块化内核。

Modprobe 使用由 depmod 创建的类似 Makefile 的依赖文件,从预定义的目录树中可用的模块集中自动加载相关模块。

Modprobe 用于加载单个模块、依赖模块的堆栈或者所有带有指定标签的模块。

Modprobe 自动加载模块堆栈中所需的所有基本模块,如依赖文件 modules.dep 所述。
如果这些模块之一的加载失败,则会自动卸载当前会话中加载的整个当前模块堆栈。

Modprobe 有两种加载模块的方式。
一种方法(探测模式)将尝试从列表(由模式定义)中加载模块。
一旦一个模块成功加载,Modprobe 就会停止加载。
这可用于从列表中自动加载一个以太网驱动程序。
可以使用 modprobe 的另一种方法是从列表中加载所有模块。

使用选项 -r , modprobe 自动卸载模块堆栈,类似于 rmmod -r 的方式。
仅使用 modprobe -r 清除未使用的自动加载模块,并在配置文件 /etc/modules.conf 中执行 pre 和 post-remove 命令。

组合选项 -l 和 -t 列出特定类型的所有可用模块。

选项 -c 打印当前使用的配置(默认 + 配置文件)。

配置

modprobe(和depmod)的行为可以通过(可选)配置文件 /etc/modules.conf 进行修改。
有关此文件可以包含的内容以及 depmod 和 modprobe 使用的默认配置的详细说明,请参阅 modules.conf (5)。

如果内核自动清理模块,则不会执行 pre 和 post-remove 命令。
寻找即将到来的对持久模块存储的支持。
如果我们想使用安装前和安装后功能,请关闭 kerneld 的自动清理,而是在 crontab(这也用于 kmod 系统)中放置类似以下行的内容,每 2 分钟执行一次自动清理:

*/2 * * * * test -f /proc/modules && /sbin/modprobe -r
日期:2020-07-15 11:16:47 来源:oir作者:oir