核心命令
insmod (Insert Module)
insmod 是最基础的命令,用于将一个指定的、完整的模块文件路径加载到内核中。

语法:
sudo insmod /path/to/module/module.ko
特点:
- 绝对路径:必须提供模块文件的完整绝对路径(或相对当前路径的路径)。
- 功能单一:它只做一件事——加载指定的模块文件,它不会自动加载该模块所依赖的其他模块。
- 手动依赖:如果模块有依赖关系,你必须手动确保所有依赖模块都已加载,否则会失败。
示例:
假设你有一个编译好的模块 my_driver.ko 位于 /home/user/my_modules/ 目录下:
# 切换到 root 用户或使用 sudo sudo insmod /home/user/my_modules/my_driver.ko
modprobe (Module Probe)
modprobe 是一个更智能、更强大的命令,它是 insmod 和 rmmod 的增强版,它通过模块间的依赖关系来工作。

语法:
# 加载模块 sudo modprobe [module_name] # 移除模块 sudo modprobe -r [module_name]
特点:
- 模块名:你只需要提供模块的名称(不带
.ko后缀),而不是文件路径。modprobe会在标准的模块搜索路径中查找它。 - 自动处理依赖:这是
modprobe最大的优势,它会自动读取模块依赖信息(通常保存在/lib/modules/<kernel-version>/modules.dep文件中),并自动加载所有需要的依赖模块。 - 配置文件支持:它会读取
/etc/modprobe.d/目录下的配置文件,允许你设置模块的参数、别名或阻止模块加载。 - 推荐使用:在日常管理和脚本中,强烈推荐使用
modprobe。
示例:
假设你需要加载 nvidia 驱动模块,它依赖于其他一些内核模块。
# modprobe 会自动加载 nvidia 模块及其所有依赖项 sudo modprobe nvidia
其他重要相关命令
lsmod (List Modules)
用于查看当前已加载到内核中的所有模块列表。

语法:
lsmod
输出说明:
- Module: 模块名。
- Size: 模块占用的内存大小。
- Used by: 该模块被哪些其他模块或进程使用。
0表示没有其他模块依赖它,可以被安全移除。
示例:
$ lsmod | grep nvidia nvidia 45465856 315 nvidia_drm 69632 4 nvidia nvidia_modeset 1296896 6 nvidia_drm,nvidia nvidia_uvm 1232896 0 drm_kms_helper 253952 1 nvidia_drm drm 616448 8 drm_kms_helper,nvidia_drm ...
这个命令常用于检查模块是否已成功加载。
rmmod (Remove Module)
用于从内核中移除一个已经加载的模块。
语法:
sudo rmmod [module_name]
特点:
- 模块名:使用模块名,而不是文件路径。
- 依赖检查:如果该模块正被其他模块使用(
Used by字段不为 0),rmmod会失败,并提示“Device or resource busy”。 - 与
modprobe -r的区别:rmmod是一个更底层的命令,只移除指定的模块,而modprobe -r在移除主模块后,会尝试移除那些不再被任何其他模块使用的依赖模块(“清理”工作)。
示例:
# 移除 my_driver 模块 sudo rmmod my_driver
实际工作流程示例
假设你想加载一个名为 my_pci_card 的虚拟网卡驱动模块。
-
查找模块文件 你需要知道模块文件在哪里,通常它们在
/lib/modules/$(uname -r)/kernel/drivers/等目录下。# 使用 find 查找 find /lib/modules/$(uname -r) -name "*my_pci_card*" # 假设找到了 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/my/my_pci_card.ko
-
检查是否已加载 在加载前,先检查一下。
lsmod | grep my_pci_card # 如果没有输出,说明模块未加载
-
加载模块 使用
modprobe是最佳选择。# 假设模块名是 my_pci_card sudo modprobe my_pci_card
modprobe找不到这个模块,你可能需要手动加载它:sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/my/my_pci_card.ko
-
验证加载 再次检查模块是否已加载,并查看内核日志(
dmesg)看是否有相关信息。# 检查模块列表 lsmod | grep my_pci_card # 应该能看到 my_pci_card 模块 # 查看内核日志 dmesg | tail # 应该能看到模块加载成功的日志,"my_pci_card: driver loaded"
-
移除模块 当你不再需要时,使用
modprobe -r来移除它。sudo modprobe -r my_pci_card
总结对比
| 命令 | 全称 | 用途 | 特点 |
|---|---|---|---|
insmod |
Insert Module | 加载指定的模块文件 | 需要完整路径,不处理依赖,功能单一。 |
modprobe |
Module Probe | 加载或移除模块 | 推荐使用,只需模块名,自动处理依赖,支持配置。 |
lsmod |
List Modules | 查看已加载模块列表 | 用于检查和诊断。 |
rmmod |
Remove Module | 移除已加载的模块 | 底层命令,不处理依赖的“清理”。 |
配置文件 /etc/modules 和 /etc/modprobe.d/
-
/etc/modules:这个文件可以让你在系统启动时自动加载指定的模块,每行写一个模块名。# /etc/modules my_pci_card 8139too
-
/etc/modprobe.d/:这是一个目录,用于存放更高级的模块配置,文件名通常以.conf你可以在这里设置模块参数或创建别名。# /etc/modprobe.d/my_options.conf # 为 my_pci_card 模块传递参数 options my_pci_card debug=1 tx_queue_len=1000 # 创建一个别名,让 modprobe 可以通过另一个名字加载模块 # alias my_card my_pci_card
重要提示:从 Linux 5.2 开始,depmod 通常会由系统包管理器(如 apt, yum)在内核更新时自动运行,你无需手动执行,它负责生成模块依赖关系文件(modules.dep 和 modules.alias),供 modprobe 使用。
