核心命令
modprobe (推荐使用)
modprobe 是加载模块的首选命令,它比 insmod 更智能、更安全,因为它会自动处理模块的依赖关系。

工作原理:
modprobe 会读取 /lib/modules/<kernel-version>/modules.dep 和 /lib/modules/<kernel-version>/modules.dep.bin 文件(这些文件记录了模块间的依赖关系),当你加载一个模块时,它会自动加载所有其依赖的模块。
基本语法:
sudo modprobe [选项] <模块名>
常用选项:
-v或--verbose: 显示详细的加载过程信息。-r或--remove: 卸载模块(及其依赖,如果不再被其他模块使用)。-c或--showconfig: 显示模块的当前配置参数。-C <文件>或--config <文件>: 指定一个自定义的配置文件,而不是默认的/etc/modprobe.d/下的文件。--first: 强制将指定的模块插入到依赖模块列表的开头。--force: 强制加载一个版本不匹配或有问题的模块(不推荐,可能导致系统不稳定)。
示例:

-
加载
nfs模块:sudo modprobe nfs
nfs模块依赖其他模块(如lockd),modprobe会自动加载它们。 -
详细加载
vfat模块:sudo modprobe -v vfat
你会看到类似
MODPROBE vfat和INSMOD /lib/modules/.../vfat.ko的输出。 -
卸载
nfs模块:sudo modprobe -r nfs
nfs被卸载后,其依赖模块(如lockd)不再被任何其他模块使用,modprobe也会自动卸载它们。
insmod
insmod 是一个更底层的命令,它只加载指定的单个模块,不会处理任何依赖关系,如果缺少依赖模块,加载会失败。
基本语法:
sudo insmod <模块文件的完整路径>
特点:
- 不处理依赖:这是它与
modprobe最大的区别。 - 需要完整路径:你必须提供模块在文件系统中的绝对路径,通常是
/lib/modules/<kernel-version>/下的.ko文件。 - 不常用:在绝大多数情况下,都应该使用
modprobe,只有在需要精确控制加载过程或处理非常特殊的模块时才使用insmod。
示例:
假设你要加载的 vfat.ko 文件位于 /lib/modules/5.15.0-52-generic/kernel/fs/fat/vfat.ko:
sudo insmod /lib/modules/5.15.0-52-generic/kernel/fs/fat/vfat.ko
vfat 依赖 fat 模块,但 fat 模块没有被加载,这个命令就会失败。
辅助命令
为了管理和查看模块状态,还需要以下几个常用命令:
lsmod
lsmod 用于列出当前已经加载到内核中的所有模块,它实际上是读取 /proc/modules 文件。
语法:
lsmod
输出解释:
- Module: 模块名。
- Size: 模块占用的内存大小。
- Used by: 使用该模块的模块数量或进程ID,如果为
0,表示没有其他模块依赖它,可以被安全卸载。
示例:
$ lsmod | grep nvidia nvidia 54538240 515 nvidia_uvm 1224960 1 nvidia nvidia_drm 77824 3 nvidia drm_kms_helper 299008 1 nvidia_drm ...
这表示 nvidia 模块已加载,并被 515 个其他实体使用。
rmmod
rmmod 用于从内核中卸载一个模块,它只卸载指定的模块,不会处理依赖关系,如果其他模块正在使用它,卸载会失败。
语法:
sudo rmmod <模块名>
示例:
sudo rmmod my_custom_module
| 特性 | modprobe |
insmod |
|---|---|---|
| 依赖处理 | 自动处理依赖关系 | 不处理依赖关系 |
| 模块路径 | 只需模块名,无需路径 | 必须提供模块的完整路径 |
| 主要用途 | 日常模块加载/卸载,推荐使用 | 特殊场景,精确控制,不常用 |
| 卸载模块 | modprobe -r <module> |
rmmod <module> |
实际操作流程
假设你有一个新的硬件(比如一个特殊的网卡),需要加载它的驱动模块。
-
找到模块文件: 驱动通常由硬件厂商提供,会包含一个
.ko文件,假设你把它放到了/home/user/my_driver/my_driver.ko。 -
查看当前模块状态:
lsmod | grep my_driver # 确认模块未加载
-
加载模块: 首选方法 (推荐): 将
.ko文件复制到系统模块目录,然后使用modprobe。sudo cp /home/user/my_driver/my_driver.ko /lib/modules/$(uname -r)/kernel/drivers/net/ sudo depmod -a # 更新模块依赖关系数据库,这一步很重要! sudo modprobe my_driver
直接加载方法 (不推荐,除非你知道你在做什么):
sudo insmod /home/user/my_driver/my_driver.ko
-
验证模块是否加载成功:
lsmod | grep my_driver # 应该能看到模块信息 dmesg | tail # 查看系统日志,看是否有模块加载成功的消息
-
卸载模块:
sudo modprobe -r my_driver # 或者 # sudo rmmod my_driver
重要提示
- 权限:加载和卸载模块都需要超级用户权限,因此通常需要使用
sudo。 - 内核版本:模块是为特定的内核版本编译的,如果升级了内核,旧的模块可能无法使用,需要重新编译。
depmod:当你手动添加或移动了.ko文件后,必须运行sudo depmod -a来更新modules.dep文件,否则modprobe可能无法找到正确的依赖关系。
