insmod 与 modprobe
insmod与modprobe都是 Linux 内核模块加载工具,但核心差异在于依赖解析与路径管理,生产环境优先用modprobe。
核心差异
| 维度 | insmod | modprobe |
|---|---|---|
| 依赖处理 | 不解析依赖,手动先加载依赖模块 | 自动解析modules.dep,递归加载所有依赖 |
| 模块寻址 | 需指定绝对路径(如./mymod.ko或/lib/.../mymod.ko) | 从/lib/modules/$(uname -r)/搜索,仅需模块名 |
| 配置支持 | 无配置文件,仅命令行传参 | 读/etc/modprobe.d/,支持别名、参数、黑名单 |
| 适用场景 | 调试孤立模块、非标准路径测试 | 生产环境、带依赖的驱动(如网卡、GPU) |
典型场景
- 生产环境:执行
sudo modprobe e1000e,自动加载e1000e及其依赖(如usbcore、scsi_mod)。 - 调试孤立模块:
sudo insmod ./mydev.ko(仅当mydev.ko无依赖时可行)。 - 传参:
sudo modprobe bonding mode=4 miimon=100(配置文件或命令行均可)。 - 卸载:
sudo modprobe -r e1000e(连带卸载未使用的依赖)。
insmod 命令参数
insmod功能很少,参数极少,只适合手动加载单个 .ko 文件。
基本格式
insmod [参数] 模块文件.ko [模块参数=值...]常用参数
-V/--version,查看 insmod 版本insmod -V-h/--help,查看帮助insmod -h-f/--force,强制加载(即使内核版本不匹配,危险操作)insmod -f mymod.ko-v/--verbose,显示详细加载过程insmod -v mymod.ko
modprobe 命令参数
modprobe是生产环境主力命令,自动找模块、自动装依赖、自动读配置。
基本格式
modprobe [参数] 模块名 [模块参数=值...]最常用参数(必须记住)
-r/--remove,卸载模块(连带卸载无用依赖)modprobe -r e1000e-v/--verbose,显示详细加载过程(调试必备)modprobe -v usb_storage-n/--dry-run,模拟加载,不真正执行(安全测试)modprobe -n nvidia-a/--all,一次加载多个模块modprobe -a kvm intel_agp
调试 / 查询类参数
--show-depends,查看模块依赖哪些其他模块modprobe --show-depends snd_hda_intel-D/--show-modversions,显示模块版本信息-C/--config,指定自定义配置文件modprobe -C /etc/modprobe.custom.conf mymod
强制 / 忽略类参数
-f/--force,强制加载(忽略版本检查,危险)modprobe -f mymod--force-vermagic,强制忽略内核版本校验--ignore-install/--ignore-remove,忽略配置文件里的 install/remove 规则
黑名单 / 查询状态
-l/--list(旧版),列出可用模块(新版用lsmod或find /lib/modules/...)-q/--quiet,静默模式,不输出错误(脚本常用)modprobe -q some_module
modules.dep
modules.dep是 Linux 内核模块依赖的核心索引文件,由depmod生成,供modprobe读取以自动解析依赖链,是模块加载体系的基石。
🔍 核心定位与作用
- 位置:
/lib/modules/$(uname -r)/modules.dep - 功能:为每个模块记录完整依赖列表,确保
modprobe按序加载所有前置模块 - 配套:同目录下的
modules.dep.bin是其二进制快速索引版本
文件格式
ASCII 文本,每行对应一个模块,格式为:模块路径:依赖模块 1 依赖模块 2 ...
示例:
kernel/drivers/net/ethernet/intel/e1000e.ko: kernel/net/ethernet/intel/e1000e/e1000e_lib.ko空行或#开头的行被视为注释并忽略。
⚙️ 生成与维护(depmod)
由depmod工具自动生成,是模块依赖管理的核心工具。
常用命令
| 命令 | 作用 | 场景 |
|---|---|---|
sudo depmod | 默认更新当前内核的依赖文件 | 日常 / 安装新模块后 |
sudo depmod -a | 强制重新生成所有模块依赖 | 内核升级 / 批量更新 |
sudo depmod -A | 仅增量更新新增 / 变更模块 | 快速更新,效率更高 |
sudo depmod -v | 详细输出,便于调试 | 排查依赖问题 |
sudo depmod 5.15.0 | 为指定内核版本生成依赖 | 多内核环境 |
触发时机
- 内核安装 / 升级后自动运行
- 手动安装第三方
.ko模块后必须执行 - 系统启动时
systemd-modules-load.service会触发
🤝 与 modprobe 的联动流程
- 执行
modprobe <模块名>时,modprobe读取modules.dep - 查找目标模块及其所有依赖的模块列表
- 按依赖顺序递归加载所有未加载的模块
- 卸载时反向卸载不再使用的依赖模块⚠️ 若
modules.dep未更新,modprobe会报 “找不到模块” 或 “依赖缺失” 错误。
⚠️ 常见问题与排查
依赖解析失败
- 现象:
modprobe: FATAL: Module x depends for module y not found - 处理:执行
sudo depmod -a重建依赖索引
- 现象:
模块加载顺序错误
- 原理:
modules.dep保证正确的加载顺序,无需手动干预 - 排查:检查
modules.dep中对应行的依赖顺序是否正确
- 原理:
第三方模块未生效
- 处理:将
.ko放入/lib/modules/$(uname -r)/对应目录,然后执行sudo depmod
- 处理:将
📌 关键要点
- 优先使用
modprobe,避免手动依赖管理 - 任何模块变动(安装 / 升级 / 删除)后务必执行
depmod - 生产环境严禁手动篡改
modules.dep,应通过配置文件(/etc/modprobe.d/)管理别名、参数等
modules.dep 与模块别名(modules.alias)、符号表(modules.symbols)的协同关系
都在同一个目录:
/lib/modules/$(uname -r)/modules.dep ——依赖关系表
- 作用:记录哪个模块依赖哪些其他模块
- 格式:
模块路径: 依赖模块1 依赖模块2 ... - 给谁用:
modprobe加载时按顺序加载依赖
modules.alias ——别名映射表
- 作用:把设备 ID、总线类型、驱动别名映射到真实模块名
- 格式示例:
alias pci:v00008086d0000100E* e1000e alias usb:v1234p5678* usb_storage alias char-major-10-* misc - 给谁用:
- udev / 内核自动加载驱动
modprobe 别名自动找到真实模块
modules.symbols ——符号 / 设备匹配表
- 作用:记录模块提供的内核符号、设备 ID、firmware、总线匹配
- 格式示例:
alias symbol:usb_register_driver usbcore alias pci:v000010DEd* nvidia - 给谁用:
- 内核热插拔、设备发现时自动匹配驱动
- modprobe 自动找对应模块
三者协同工作流程
以插入一个 PCI 网卡为例,完整流程如下:
① 硬件触发 → 内核识别设备 ID
内核读到:pci:v00008086d00001570sv…sd…
② 内核 /udev 查找 modules.alias/modules.symbols
找到映射:
alias pci:v00008086d00001570* e1000e→ 确定驱动模块名是e1000e
③ modprobe 加载 e1000e
此时modules.dep上场:
kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko: kernel/drivers/net/phy/libphy.ko kernel/net/core/ptp.ko ...modprobe 自动先加载libphy、ptp等依赖,再加载e1000e
④ 驱动注册成功
驱动通过modules.symbols里导出的符号(如 register_netdev)完成注册
总结关系
- modules.alias / modules.symbols:负责 “找到应该加载哪个模块”(设备 → 模块名)
- modules.dep:负责 “按正确顺序加载所有依赖”(模块 → 依赖链)
三者都是depmod一次性生成的,缺一不可。
全部由depmod生成:
depmod -a执行后会刷新:
- modules.dep / modules.dep.bin
- modules.alias / modules.alias.bin
- modules.symbols / modules.symbols.bin
- modules.devname
- modules.builtin
- modules.order
直观对比表
| 文件 | 作用 | 关键词 | 使用者 |
|---|---|---|---|
| modules.dep | 模块依赖关系 | 依赖、顺序、加载链 | modprobe |
| modules.alias | 别名 → 真实模块 | alias、设备 ID、总线 | udev、内核、modprobe |
| modules.symbols | 符号 / 设备 → 模块 | symbol、设备匹配、firmware | 内核热插拔、自动加载 |
/etc/modprobe.d/
/etc/modprobe.d/是 Linux 下内核模块的全局配置目录,用来给模块设置别名、参数、黑名单、加载规则等,优先级比/lib/modules/...下的系统自动生成文件更高。
基本信息
- 路径:
/etc/modprobe.d/ - 文件格式:
*.conf - 作用对象:
modprobe命令、内核自动加载模块、udev 加载驱动 - 优先级:高于系统默认配置,用户自定义优先
核心语法
1. alias 别名
给模块起别名,方便加载或匹配设备
alias mynet e1000e之后就可以:
modprobe mynet2. options 模块参数
加载模块时自动传入参数
options kvm ignore_msrs=1 options snd_hda_intel power_save=03. blacklist 黑名单
禁止内核自动加载某个模块(常见于禁用独显、冲突驱动)
blacklist nouveau blacklist pcspkr4. install 自定义加载命令
劫持模块加载,执行自定义逻辑
install nvidia /path/to/nvidia-wrapper install usb_storage /bin/falsemodprobe会执行你写的命令,而不是直接加载 ko。
5. remove 自定义卸载命令
remove nvidia rmmod nvidia和 modules.dep/modules.alias 的关系
系统自动生成
/lib/modules/$(uname -r)/modules.alias/lib/modules/$(uname -r)/modules.dep,由depmod生成,不要手动改。
用户配置覆盖
/etc/modprobe.d/*.conf,你写的 alias、blacklist、options 会覆盖或追加系统规则。
加载顺序
modprobe执行顺序大致是:- 读
/etc/modprobe.d/自定义规则 - 查
modules.alias找到真实模块名 - 查
modules.dep加载依赖 - 应用
options参数
- 读
