Linux的 modprobe 命令笔记251006
Linux 系统中的 modprobe 命令。这是一个非常重要且强大的命令,用于管理 Linux 内核模块。
1. 什么是内核模块?
在深入 modprobe 之前,必须先了解什么是内核模块。
- 内核:是操作系统的核心,负责管理硬件、内存、进程等。
- 模块:是一段可以动态加载到内核或从内核卸载的代码。它们扩展了内核的功能,而无需重新编译整个内核或重启系统。
- 类比:可以将内核想象成主板的电路,而模块就像是你可以随时插拔的“扩展卡”(如声卡、显卡、USB 控制器驱动等)。
常见的内核模块例子:
- 硬件驱动:
nvidia,iwlwifi(Intel 无线网卡),usb-storage - 文件系统:
ext4,ntfs,vfat - 网络协议:
ppp,tun
2. modprobe 是什么?
modprobe 是一个智能的内核模块管理工具,它位于 kmod 软件包中。与更底层的 insmod 和 rmmod 命令相比,modprobe 的主要优势在于它能自动处理模块之间的依赖关系。
- 依赖关系:一个模块(A)可能依赖于另一个模块(B)的功能。例如,某个特殊的网卡驱动可能需要通用的网络协议栈模块先被加载。
modprobe会读取/lib/modules/$(uname -r)/目录下的modules.dep文件,来了解这些依赖关系,并自动加载或卸载所有相关的模块。
3. 基本语法
modprobe [选项] <模块名> [模块参数...]
4. 常用命令与选项详解
加载模块
sudo modprobe <模块名>
示例:
sudo modprobe nft_chain_nat
这条命令会:
- 检查
nft_chain_nat模块依赖哪些其他模块。 - 按正确的顺序先加载所有依赖的模块。
- 最后加载
nft_chain_nat模块本身。
卸载模块
sudo modprobe -r <模块名>
示例:
sudo modprobe -r nft_chain_nat
这条命令会:
- 检查是否有其他模块正在依赖
nft_chain_nat。 - 如果没有,则卸载
nft_chain_nat模块。 - 同时,它也会尝试自动卸载那些因为依赖它而被加载、但现在已不再需要的模块。
注意:如果模块正在被使用(例如,一个USB设备正插在电脑上,而你试图卸载其驱动模块),则卸载会失败。
常用选项
-r,--remove:卸载模块及其不再被依赖的模块。-f,--force:强制加载模块,即使模块版本与当前内核不匹配。请谨慎使用。-l,--list:列出所有可用的模块(现代系统中更推荐使用find /lib/modules -name ‘*.ko’)。-c,--show-config:显示当前所有的模块配置(包括从/etc/modprobe.d/目录中读取的配置)。-n,--dry-run:模拟执行操作,显示将会做什么,但实际上不加载或卸载任何模块。用于调试。-v,--verbose:显示详细的操作信息,便于了解命令执行过程。-C, --config:指定一个额外的配置文件目录(不常用)。
传递参数给模块
有些模块在加载时可以接受参数来改变其行为。
sudo modprobe <模块名> <参数名>=<参数值>
示例:加载 usb-storage 模块,并设置延迟时间为 10 秒。
sudo modprobe usb-storage delay_use=10
5. 配置文件
modprobe 的行为和模块的默认参数可以通过配置文件来定义。这些配置文件主要位于 /etc/modprobe.d/ 目录中。每个配置文件通常以 .conf 为扩展名。
常见配置:
-
黑名单 阻止一个模块在系统启动时或任何时候被自动加载。
创建文件:
/etc/modprobe.d/blacklist.conf内容示例:# 禁止加载有问题的 nouveau 显卡驱动 blacklist nouveau # 禁止加载旧的声卡驱动 blacklist snd_pcsp使用
blacklist后,该模块将不会被modprobe自动加载,但如果其他模块依赖它,或者用户明确使用modprobe <模块名>,它仍然可以被加载。为了更彻底的禁用,可以结合install指令:blacklist nouveau install nouveau /bin/false这表示当尝试加载
nouveau时,实际执行的是/bin/false(一个什么也不做并返回失败的命令),从而彻底阻止加载。 -
设置模块参数 为模块设置每次加载时的默认参数。
创建文件:
/etc/modprobe.d/mymodules.conf内容示例:# 每次加载 usb-storage 模块时,都设置 delay_use 为 5 秒 options usb-storage delay_use=5 -
别名 为一个模块起一个别名。
alias my-net-driver e1000e
6. 相关命令
lsmod:列出当前已加载的所有内核模块。这是一个非常常用的查看命令。insmod:最基础的模块加载工具,需要提供模块文件的完整路径,且不处理任何依赖关系。不推荐普通用户使用。rmmod:最基础的模块卸载工具,不处理任何依赖关系。不推荐普通用户使用。depmod:生成modules.dep依赖关系文件的工具。通常在安装新模块后需要运行sudo depmod -a来更新依赖信息。modinfo:显示一个内核模块的详细信息,包括描述、作者、许可证、所依赖的模块以及它可接受的参数。
示例:
# 查看已加载的模块 lsmod | grep nft # 查看 vfat 模块的详细信息 modinfo vfat # 查看 vfat 模块接受哪些参数 modinfo vfat | grep parm
7. 总结与使用场景
| 场景 | 命令 |
|---|---|
| 日常加载一个模块 | sudo modprobe <模块名> |
| 日常卸载一个模块 | sudo modprobe -r <模块名> |
| 查看已加载模块 | lsmod |
| 查看模块信息 | modinfo <模块名> |
| 永久禁用某个模块 | 在 /etc/modprobe.d/ 中创建 blacklist.conf |
| 为模块设置默认参数 | 在 /etc/modprobe.d/ 中使用 options 指令 |
| 调试模块加载问题 | modprobe -v <模块名>(查看详细过程) |
核心要点: 始终优先使用 modprobe 而不是 insmod/rmmod,因为它更智能、更安全,能自动处理复杂的依赖关系,避免系统出现不稳定或功能缺失的情况。
modprobe 和 KVM
modprobe 和 KVM
modprobe 是 Linux 内核模块的加载和卸载工具,而 KVM(Kernel-based Virtual Machine)是 Linux 内核的一个功能模块,两者共同协作让你能在 Linux 上运行虚拟机。下面这个流程图概括了它们协同工作的核心过程:
Intel CPU
AMD CPU
是
否
启用嵌套虚拟化
重新加载模块并
设置nested=1
卸载原有模块
持久化配置
使用KVM虚拟化
检查硬件虚拟化支持
检查kvm_intel嵌套
检查kvm_amd嵌套
嵌套虚拟化已启用?
加载KVM核心模块
KVM虚拟化环境就绪
下面我们来详细了解一下图中的各个阶段。
🔧 核心概念与工作流程
理解 modprobe modprobe 是一个智能的内核模块管理工具,主要特点是能自动处理模块之间的依赖关系 。它通过以下命令管理模块:
- 加载模块:
sudo modprobe <模块名> - 卸载模块:
sudo modprobe -r <模块名>
认识 KVM 模块 KVM 虚拟化功能主要由以下内核模块实现:
- kvm.ko:KVM 的核心模块,提供通用的虚拟化框架 。
- 处理器特定模块:根据你的 CPU 型号,还需要对应的
kvm_intel.ko(Intel CPU)或kvm_amd.ko(AMD CPU)模块 。这些处理器特定模块依赖于核心的kvm模块 。
模块加载流程
- 加载核心模块:当你使用
modprobe加载kvm_intel或kvm_amd时,modprobe会自动识别并先加载其依赖的kvm核心模块 。 - 模块就绪:核心模块和处理器特定模块都加载成功后,KVM 虚拟化环境就准备就绪了。
⚙️ 实际应用:以嵌套虚拟化为例
嵌套虚拟化 是指可以在一个虚拟机(L1 Guest)内部再运行其他虚拟机(L2 Guest)。这个过程很好地展示了如何运用 modprobe 配置 KVM 模块。
启用嵌套虚拟化 如流程图所示,首先需要检查并启用嵌套虚拟化功能。以下以 Intel CPU 为例(AMD CPU 操作类似,将模块名 kvm_intel 替换为 kvm_amd 即可) :
-
检查当前状态:
cat /sys/module/kvm_intel/parameters/nested如果返回
Y或1,说明已启用;如果返回N或0,则需要启用 。 -
启用嵌套功能: 如果检查发现未启用,你需要先卸载模块,再重新加载并激活嵌套功能 :
sudo modprobe -r kvm_intel # 卸载模块 sudo modprobe kvm_intel nested=1 # 重新加载并启用嵌套重新加载后,再次检查
/sys/module/kvm_intel/parameters/nested确认返回Y。 -
持久化配置(重要): 以上通过
modprobe的设置在重启后会失效。要永久生效,需要创建配置文件(如/etc/modprobe.d/kvm.conf),并添加以下内容 :options kvm_intel nested=1这样每次系统启动时,都会自动启用 KVM Intel 模块的嵌套虚拟化功能。
💎 重要提示和技巧
- 模块参数查询:想了解 KVM 模块(如
kvm_intel)支持哪些参数,可以使用modinfo kvm_intel命令。 - 模块依赖关系:使用
lsmod | grep kvm可以查看已加载的 KVM 模块及其依赖关系。 - 操作前提:在卸载像
kvm_intel这样的模块时,需要确保所有依赖该模块的虚拟机已关闭 。
简单来说,modprobe 是管理工具,KVM 是被管理的核心功能模块。无论是启用基础虚拟化还是配置像嵌套虚拟化这样的高级功能,都离不开 modprobe 对 KVM 模块的精准控制。
希望这些信息能帮助你更好地理解和使用它们。如果你在具体操作中遇到其他问题,比如模块加载失败,欢迎随时提问。
1️⃣ 参考 1
modprobe 是 Linux 系统中一个非常重要的内核模块管理命令。它用于动态地向运行中的内核添加或移除模块。
下面我将为你详细讲解这个命令。
1. 什么是内核模块?
简单来说,内核模块是一段可以在运行时动态加载到内核或从内核卸载的代码。它扩展了内核的功能,而无需重新编译整个内核或重启系统。
- 例子:设备驱动程序(如显卡驱动、网卡驱动)、文件系统支持、系统功能等通常都以模块的形式存在。
- 你遇到的问题就是例子:
kvm_amd就是一个内核模块,它让 Linux 内核能够支持在 AMD CPU 上使用 KVM 虚拟化技术。
2. modprobe 基本语法
sudo modprobe [选项] <模块名> [参数=值]
3. 常用命令与场景
modprobe 最核心的两个操作是加载和卸载模块。
| 操作 | 命令 | 说明 |
|---|---|---|
| 加载模块 | sudo modprobe <模块名> | 加载指定模块及其依赖。 |
| 卸载模块 | sudo modprobe -r <模块名> | 卸载指定模块及其依赖。 |
实例(直接解决你的问题):
# 加载 AMD KVM 模块 sudo modprobe kvm_amd # 卸载 AMD KVM 模块 (这正好可以解决你遇到的 VirtualBox 错误) sudo modprobe -r kvm_amd
4. modprobe 的智能之处:处理依赖关系
modprobe 相比于旧的 insmod 和 rmmod 命令,最大的优点是它能自动处理模块之间的依赖关系。
- 例如,
kvm_amd模块依赖于kvm模块。 - 当你执行
sudo modprobe kvm_amd时,modprobe会:- 检查依赖关系。
- 发现需要先加载
kvm模块。 - 自动先加载
kvm模块。 - 然后再加载
kvm_amd模块。
同样,当你执行 sudo modprobe -r kvm_amd 时,它也会智能地判断是否可以安全地卸载 kvm 模块。
5. 其他常用选项
| 选项 | 说明 |
|---|---|
-c, --show-config | 显示所有模块的配置信息。 |
-l, --list | 列出所有可用模块(在某些新版系统中此选项可能已被弃用,推荐使用 find)。 |
-n, --dry-run | 模拟执行,显示将会做什么,但不实际执行。 |
-v, --verbose | 显示详细的操作过程。 |
实用示例:
# 详细地查看加载 kvm_amd 模块的过程 sudo modprobe -v kvm_amd # 模拟卸载 kvm_amd 模块,看会发生什么但不真正执行 sudo modprobe -r -v -n kvm_amd
6. 相关命令
为了更好地理解 modprobe,你还需要知道这几个相关的命令和文件:
| 命令/文件 | 用途 |
|---|---|
lsmod | 列出当前已加载的所有内核模块。这是你最应该第一个使用的命令,用于查看系统现状。 |
rmmod | 用于卸载一个模块,但不处理依赖关系。如果一个模块正在被使用或有其他模块依赖它,卸载会失败。比 modprobe -r 更“低级”和“笨拙”。 |
insmod | 用于手动加载一个模块,需要指定完整的模块文件路径,并且不处理任何依赖。是最低级的加载命令。 |
/etc/modprobe.d/ 目录 | 这个目录下的配置文件可以永久性地影响模块的行为。比如你之前用到的 blacklist.conf 文件。在这里配置可以禁止某个模块自动加载,或者给模块传递参数。 |
/proc/modules | 一个文件,其内容与 lsmod 命令的输出相同,反映了当前已加载的模块。 |
modinfo <模块名> | 显示一个内核模块的详细信息,包括描述、依赖、参数等。 |
7. 完整工作流示例
假设你遇到了最初的 VirtualBox 错误,并想用命令排查和解决,流程如下:
# 1. 查看 KVM 模块是否已加载 lsmod | grep kvm # 输出可能类似:kvm_amd 123456 0 # kvm 789012 1 kvm_amd # 2. 尝试卸载它们(modprobe 会智能地处理依赖,先卸载 kvm_amd,再卸载 kvm) sudo modprobe -r kvm_amd # 3. 再次检查确认 lsmod | grep kvm # 此时应该没有输出,说明模块已卸载 # 4. 现在可以启动你的 VirtualBox 虚拟机了 # 5. 当你需要重新使用 KVM 时,再加载模块 sudo modprobe kvm_amd # 6. 再次检查 lsmod | grep kvm
总结
modprobe:智能的内核模块加载/卸载工具,自动处理依赖,推荐日常使用。insmod/rmmod:底层的模块加载/卸载工具,不处理依赖,需要手动按顺序操作,适用于特定调试场景。lsmod:查看已加载模块状态的首选工具。
希望这个详细的讲解能帮助你彻底理解 modprobe 命令!
2️⃣ 参考 2
Linux modprobe 命令详解
modprobe 是 Linux 系统中用于智能地加载和卸载内核模块的命令行工具。
基本功能
- 自动处理模块依赖关系
- 从标准位置搜索模块 (
/lib/modules/$(uname -r)) - 比
insmod/rmmod更高级的工具
命令语法
modprobe [选项] 模块名 [模块参数=值]
常用操作
加载模块
sudo modprobe module_name
卸载模块
sudo modprobe -r module_name
显示模块信息
modprobe -c | grep module_name # <font size=5 color=black ><b>显示模块配置</b></font> modprobe -n -v module_name # <font size=5 color=black ><b>干运行,显示详细信息但不实际加载</b></font>
主要选项
| 选项 | 功能 |
|---|---|
-r | 移除模块 |
-f | 强制加载 |
-v | 详细模式 |
-c | 显示当前配置 |
-n | 干运行(不实际执行) |
-l | 列出所有可用模块(已废弃) |
-a | 加载所有匹配模块 |
实际示例
# <font size=5 color=black ><b>加载 USB 存储模块</b></font> sudo modprobe usb-storage # <font size=5 color=black ><b>加载带参数的模块</b></font> sudo modprobe vfat utf8=1 # <font size=5 color=black ><b>移除模块</b></font> sudo modprobe -r vfat # <font size=5 color=black ><b>查看模块依赖关系</b></font> modprobe -D nvidia # <font size=5 color=black ><b>显示 nvidia 模块的依赖信息</b></font> # <font size=5 color=black ><b>强制加载模块</b></font> sudo modprobe -f module_name
配置文件
modprobe 读取以下位置的配置:
/etc/modprobe.d/目录下的配置文件/etc/modprobe.conf/etc/modules-load.d/
配置示例
# <font size=5 color=black ><b>/etc/modprobe.d/blacklist.conf</b></font> blacklist nouveau options vfat utf8=1
与相关命令比较
| 命令 | 功能 | 是否处理依赖 |
|---|---|---|
insmod | 直接加载模块 | 否 |
rmmod | 直接卸载模块 | 否 |
modprobe | 智能加载/卸载 | 是 |
depmod | 生成模块依赖信息 | - |
lsmod | 列出已加载模块 | - |
故障排查
# <font size=5 color=black ><b>查看模块信息</b></font> modinfo module_name # <font size=5 color=black ><b>检查依赖关系</b></font> depmod -n | grep module_name # <font size=5 color=black ><b>查看内核消息</b></font> dmesg | tail -20
modprobe 是系统管理员管理内核模块的首选工具,因其能自动处理复杂的依赖关系,使模块管理更加简单可靠。
3️⃣ 参考 3
我们来详细讲解一下 Linux 中的 modprobe 命令。
什么是 modprobe ?
modprobe 是一个用于在 Linux 内核中智能地添加和移除模块的强大工具。它是 module-init-tools 软件包的一部分,现在通常属于 kmod 包。
与更底层的 insmod 和 rmmod 命令不同,modprobe 的核心优势在于它能自动处理模块依赖关系。
核心概念:内核模块
Linux 内核是高度模块化的。这意味着许多功能(如设备驱动、文件系统、网络协议等)都被编译成独立的模块(通常是 .ko 文件),可以在需要时动态加载到运行中的内核,或在不需要时卸载。这样做的好处是:
- 保持内核小巧:只加载必要的代码,减少内存占用。
- 灵活性高:无需重新编译整个内核或重启系统,就能添加或移除功能。
modprobe 的工作原理
modprobe 不直接去 /lib/modules/$(uname -r) 目录下盲目地查找模块。它依赖于一个由 depmod 命令生成的模块依赖关系列表文件,通常是 modules.dep。
当你运行 depmod(通常在系统启动或安装新内核时自动运行),它会分析所有可用的模块,找出它们之间的依赖关系,并生成 modules.dep 文件。这样,modprobe 在加载一个模块时,就能知道需要先加载哪些其他模块。
基本语法
modprobe [选项] <模块名> [模块参数...]
常用命令和选项
1. 加载模块
sudo modprobe <模块名>
示例: 加载 vboxguest(VirtualBox 客户机增强功能模块)
sudo modprobe vboxguest
如果 vboxguest 依赖于 vboxsf 和 vboxvideo,modprobe 会自动先将这两个依赖模块加载到内核。
2. 卸载模块
使用 -r 或 --remove 选项来卸载一个模块及其不再被使用的依赖模块。
sudo modprobe -r <模块名>
示例: 卸载 vboxguest 模块
sudo modprobe -r vboxguest
3. 查看模块信息
-l或--list:列出所有可用模块(在新版本中已过时,建议使用find命令)。-n或--dry-run:模拟执行,显示将会做什么,但实际上不加载或卸载模块。对于调试非常有用。-v或--verbose:详细模式,显示命令执行过程中的详细信息。--show-depends:显示指定模块的依赖关系,但不加载它。
示例: 查看 vboxguest 的依赖关系
modprobe --show-depends vboxguest
输出可能类似于:
insmod /lib/modules/5.15.0-91-generic/kernel/misc/vboxsf.ko insmod /lib/modules/5.15.0-91-generic/kernel/misc/vboxvideo.ko insmod /lib/modules/5.15.0-91-generic/kernel/misc/vboxguest.ko
4. 向模块传递参数
有时加载模块时需要指定特定的参数。
sudo modprobe <模块名> <参数名>=<参数值>
示例: 加载 usbcore 模块并设置 blinkenlights 参数为 1。
sudo modprobe usbcore blinkenlights=1
配置文件
modprobe 的行为和模块的加载选项可以通过配置文件来控制。这些文件通常位于:
/etc/modprobe.d/目录:这是最主要的配置目录,每个配置都是一个以.conf结尾的文件。/run/modprobe.d/目录:供临时性、运行时配置使用。/usr/lib/modprobe.d/目录:供发行版软件包安装的配置使用。
常见的配置指令:
-
alias:为模块创建别名。# /etc/modprobe.d/alias.conf alias my-net-device e1000e之后就可以使用
sudo modprobe my-net-device来加载e1000e模块。 -
options:为模块设置默认参数。# /etc/modprobe.d/options.conf options e1000e debug=1这样每次加载
e1000e模块时,都会自动带上debug=1参数。 -
blacklist:禁用(黑名单) 一个模块,防止它被自动加载。 非常重要且常用! 常用于解决硬件冲突或阻止有问题的驱动被加载。示例: 禁用有问题的
nouveau(NVIDIA 开源驱动),以便安装官方的 NVIDIA 驱动。# /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau options nouveau modeset=0创建或修改黑名单文件后,需要更新 initramfs 并重启才能生效:
sudo update-initramfs -u sudo reboot -
install和remove:定义加载或卸载模块时要运行的自定义命令,而不是默认的insmod/rmmod。
与相关命令的比较
| 命令 | 功能 | 是否处理依赖 | 推荐度 |
|---|---|---|---|
modprobe | 智能加载/卸载模块 | 是 | ★★★★★ (推荐) |
insmod | 低级模块加载工具 | 否 | ★★☆☆☆ |
rmmod | 低级模块卸载工具 | 否 | ★★☆☆☆ |
lsmod | 列出当前已加载的所有模块 | 不适用 | 用于查看状态 |
depmod | 生成模块依赖关系信息 | 不适用 | 系统自动调用 |
总结
modprobe 是管理 Linux 内核模块的首选工具,因为它安全、智能且功能丰富。它的核心优势在于自动处理依赖关系,避免了手动使用 insmod/rmmod 时可能遇到的“未解决符号”错误。
关键要点:
- 加载模块用
sudo modprobe <模块名>。 - 卸载模块用
sudo modprobe -r <模块名>。 - 配置模块(如黑名单、参数)在
/etc/modprobe.d/目录下创建.conf文件。 - 修改黑名单后,务必记得
sudo update-initramfs -u并重启。
4️⃣ 参考 4
我们来详细讲解一下 Linux 中的 modprobe 命令。
什么是 modprobe?
modprobe 是一个智能的 Linux 内核模块管理工具,用于在运行时向内核添加或移除模块。它的“智能”之处在于它能自动处理模块之间的依赖关系。
内核模块是包含内核代码的可加载对象,通常用于添加设备驱动程序、文件系统支持或系统调用等功能,而无需重新编译整个内核或重启系统。
modprobe 与 insmod/rmmod 的区别
为了更好地理解 modprobe,我们把它和另外两个基础命令做个对比:
| 特性 | insmod / rmmod | modprobe |
|---|---|---|
| 依赖处理 | 不处理依赖关系。你手动加载一个模块,如果它依赖其他模块,你必须先加载那些模块。 | 自动处理依赖关系。加载目标模块时,会自动先加载其依赖的所有模块。 |
| 模块路径 | 需要提供模块的完整路径或文件名。 | 只需要模块名称。它会在标准模块目录(如 /lib/modules/$(uname -r))中搜索。 |
| 配置文件 | 不读取任何配置文件。 | 会读取 /etc/modprobe.d/ 目录下的配置文件,可以设置别名、黑名单、模块参数等。 |
| 使用场景 | 低级操作,适用于调试或特殊情况。 | 日常管理和高级操作的推荐工具。 |
简单比喻:
insmod/rmmod像手动安装一个软件包,需要自己解决所有依赖。modprobe像使用apt或yum安装软件,自动解决依赖问题。
基本语法
modprobe [选项] <模块名> [模块参数...]
常用命令和选项
1. 加载模块
sudo modprobe <模块名>
例如,加载 vboxguest 模块(VirtualBox 增强功能):
sudo modprobe vboxguest
如果 vboxguest 依赖其他模块,modprobe 会自动先加载它们。
2. 卸载模块
使用 -r 或 --remove 选项来卸载一个模块及其不再被使用的依赖模块。
sudo modprobe -r <模块名>
例如,卸载 vboxguest 模块:
sudo modprobe -r vboxguest
3. 查看模块信息
-
查看模块的详细信息(包括依赖关系、参数等):
modinfo <模块名> -
查看已加载的模块:
lsmod
4. 模拟运行(不实际操作)
使用 --dry-run 或 -n 选项,modprobe 会显示它将要做什么,但不会真正执行。这对于调试非常有用。
sudo modprobe --dry-run <模块名>
5. 显示详细输出
使用 -v 或 --verbose 选项,让 modprobe 显示更详细的执行过程。
sudo modprobe -v <模块名>
6. 强制移除模块
即使模块正在被使用,也强制移除它。这是一个危险操作,可能导致系统不稳定,请谨慎使用。
sudo modprobe -r -f <模块名>
配置文件:/etc/modprobe.d/
modprobe 的行为可以通过 /etc/modprobe.d/ 目录下的 .conf 文件进行配置。这个目录允许你为模块设置别名、参数,或者将模块加入黑名单。
常见的配置指令:
-
alias:为模块创建一个别名。# /etc/modprobe.d/alias.conf alias my-net e1000e之后运行
sudo modprobe my-net就等同于sudo modprobe e1000e。 -
options:为模块设置默认参数。# /etc/modprobe.d/options.conf options e1000e InterruptThrottleRate=3000这样每次加载
e1000e网卡驱动时,都会自动带上这个参数。 -
blacklist:阻止模块自动加载。# /etc/modprobe.d/blacklist.conf blacklist nouveau这常用于禁用开源驱动(如
nouveau)以便安装专有驱动(如 NVIDIA 驱动)。注意,blacklist不会阻止用户手动使用modprobe加载它。 -
install和remove:定义加载或卸载模块时要执行的自定义命令。
实际应用示例
场景: 你有一块 Intel 网卡,驱动模块是 e1000e。
-
查看模块信息:
modinfo e1000e输出会显示模块的路径、许可证、依赖项(
depends)和可用的参数。 -
加载模块:
sudo modprobe -v e1000e输出可能类似于:
insmod /lib/modules/5.x.x-generic/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko-v让你看到了它实际执行的底层insmod命令。 -
检查模块是否加载:
lsmod | grep e1000e -
为模块设置参数并永久生效: 假设你想改变中断节流速率。首先,创建一个配置文件:
sudo nano /etc/modprobe.d/e1000e.conf在文件中添加:
options e1000e InterruptThrottleRate=3000保存并退出。然后卸载并重新加载模块,使新参数生效:
sudo modprobe -r e1000e sudo modprobe e1000e现在,模块就使用了新的参数运行。
总结
modprobe 是 Linux 系统管理员和开发者管理内核模块的核心工具。它通过自动处理依赖关系和读取配置文件,使得模块管理变得简单、可靠。在绝大多数情况下,你都应该优先使用 modprobe 而不是底层的 insmod 和 rmmod。
| 动作 | 推荐命令 |
|---|---|
| 加载模块 | sudo modprobe <模块名> |
| 卸载模块 | sudo modprobe -r <模块名> |
| 查看已加载模块 | lsmod |
| 查看模块详细信息 | modinfo <模块名> |
| 配置模块(别名、参数、黑名单) | 编辑 /etc/modprobe.d/*.conf 文件 |
5️⃣ 参考 5
当然,我们来详细讲解一下 Linux 中的 modprobe 命令。
modprobe 是一个用于在 Linux 内核中智能地添加和移除模块的强大工具。它是 module-init-tools 软件包的一部分,现在通常属于 kmod 包。
核心概念:什么是内核模块?
内核模块是一段可以动态加载到运行中的内核或从内核中卸载的代码。它们扩展了内核的功能,而无需重启系统。常见的例子包括:
- 设备驱动程序:如显卡、声卡、USB 设备驱动。
- 文件系统驱动:如
ntfs,vfat,btrfs。 - 系统功能:如虚拟化支持、网络协议。
modprobe 与 insmod / rmmod 的区别
你可能还听说过 insmod 和 rmmod,它们也是用于模块管理的工具,但 modprobe 更高级、更智能。
| 特性 | insmod / rmmod | modprobe |
|---|---|---|
| 依赖处理 | 不处理模块依赖。你必须手动按顺序加载依赖的模块。 | 自动处理模块依赖。它会读取 modules.dep 文件,自动加载所需的所有依赖模块。 |
| 模块路径 | 需要提供模块的完整路径或文件名。 | 只需要模块名称。它会在标准模块目录(如 /lib/modules/$(uname -r)/)中搜索。 |
| 配置识别 | 不读取任何配置文件。 | 会读取 /etc/modprobe.d/ 目录下的配置文件,允许设置别名、黑名单和模块参数。 |
| 智能性 | 低级工具,简单但笨拙。 | 高级工具,推荐在日常中使用。 |
简单来说:modprobe 是 insmod/rmmod 的智能升级版。
modprobe 命令语法和常用选项
modprobe [选项] 模块名 [模块参数...]
1. 加载模块
最基本的用法是加载一个模块及其所有依赖。
sudo modprobe <module_name>
示例: 加载 VFAT 文件系统支持(用于读写 FAT32 U 盘)。
sudo modprobe vfat
执行此命令后,modprobe 会自动检查 vfat 模块是否依赖于其他模块(例如 fat 模块),并按正确顺序加载它们。
2. 卸载模块
使用 -r 或 --remove 选项来卸载一个模块。如果该模块不再被使用,并且没有其他模块依赖它,modprobe 也会尝试卸载其依赖模块。
sudo modprobe -r <module_name>
示例: 卸载 VFAT 模块。
sudo modprobe -r vfat
3. 查看详细信息
使用 -v 或 --verbose 选项可以显示操作的详细信息,包括正在加载或卸载哪些依赖模块。
sudo modprobe -v vfat
输出可能类似于:
insmod /lib/modules/5.xx.x-xx-generic/kernel/fs/fat/fat.ko insmod /lib/modules/5.xx.x-xx-generic/kernel/fs/vfat/vfat.ko
1233

被折叠的 条评论
为什么被折叠?



