当前位置: 首页 > news >正文

insmod 与 modprobe

insmodmodprobe都是 Linux 内核模块加载工具,但核心差异在于依赖解析路径管理,生产环境优先用modprobe

核心差异

维度insmodmodprobe
依赖处理不解析依赖,手动先加载依赖模块自动解析modules.dep,递归加载所有依赖
模块寻址需指定绝对路径(如./mymod.ko/lib/.../mymod.ko/lib/modules/$(uname -r)/搜索,仅需模块名
配置支持无配置文件,仅命令行传参/etc/modprobe.d/,支持别名、参数、黑名单
适用场景调试孤立模块、非标准路径测试生产环境、带依赖的驱动(如网卡、GPU)

典型场景

  1. 生产环境:执行sudo modprobe e1000e,自动加载e1000e及其依赖(如usbcorescsi_mod)。
  2. 调试孤立模块sudo insmod ./mydev.ko(仅当mydev.ko无依赖时可行)。
  3. 传参sudo modprobe bonding mode=4 miimon=100(配置文件或命令行均可)。
  4. 卸载sudo modprobe -r e1000e(连带卸载未使用的依赖)。

insmod 命令参数

insmod功能很少,参数极少,只适合手动加载单个 .ko 文件

基本格式

insmod [参数] 模块文件.ko [模块参数=值...]

常用参数

  1. -V/--version,查看 insmod 版本

    insmod -V
  2. -h/--help,查看帮助

    insmod -h
  3. -f/--force,强制加载(即使内核版本不匹配,危险操作)

    insmod -f mymod.ko
  4. -v/--verbose,显示详细加载过程

    insmod -v mymod.ko

modprobe 命令参数

modprobe是生产环境主力命令,自动找模块、自动装依赖、自动读配置

基本格式

modprobe [参数] 模块名 [模块参数=值...]

最常用参数(必须记住)

  1. -r/--remove,卸载模块(连带卸载无用依赖)

    modprobe -r e1000e
  2. -v/--verbose,显示详细加载过程(调试必备)

    modprobe -v usb_storage
  3. -n/--dry-run,模拟加载,不真正执行(安全测试)

    modprobe -n nvidia
  4. -a/--all,一次加载多个模块

    modprobe -a kvm intel_agp

调试 / 查询类参数

  1. --show-depends,查看模块依赖哪些其他模块

    modprobe --show-depends snd_hda_intel
  2. -D/--show-modversions,显示模块版本信息

  3. -C/--config,指定自定义配置文件

    modprobe -C /etc/modprobe.custom.conf mymod

强制 / 忽略类参数

  1. -f/--force,强制加载(忽略版本检查,危险

    modprobe -f mymod
  2. --force-vermagic,强制忽略内核版本校验

  3. --ignore-install/--ignore-remove,忽略配置文件里的 install/remove 规则

黑名单 / 查询状态

  1. -l/--list(旧版),列出可用模块(新版用lsmodfind /lib/modules/...

  2. -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 的联动流程

  1. 执行modprobe <模块名>时,modprobe读取modules.dep
  2. 查找目标模块及其所有依赖的模块列表
  3. 按依赖顺序递归加载所有未加载的模块
  4. 卸载时反向卸载不再使用的依赖模块⚠️ 若modules.dep未更新,modprobe会报 “找不到模块” 或 “依赖缺失” 错误。

⚠️ 常见问题与排查

  1. 依赖解析失败

    • 现象:modprobe: FATAL: Module x depends for module y not found
    • 处理:执行sudo depmod -a重建依赖索引
  2. 模块加载顺序错误

    • 原理:modules.dep保证正确的加载顺序,无需手动干预
    • 排查:检查modules.dep中对应行的依赖顺序是否正确
  3. 第三方模块未生效

    • 处理:将.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 自动先加载libphyptp等依赖,再加载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 mynet

2. options 模块参数

加载模块时自动传入参数

options kvm ignore_msrs=1 options snd_hda_intel power_save=0

3. blacklist 黑名单

禁止内核自动加载某个模块(常见于禁用独显、冲突驱动)

blacklist nouveau blacklist pcspkr

4. install 自定义加载命令

劫持模块加载,执行自定义逻辑

install nvidia /path/to/nvidia-wrapper install usb_storage /bin/false

modprobe会执行你写的命令,而不是直接加载 ko。

5. remove 自定义卸载命令

remove nvidia rmmod nvidia

和 modules.dep/modules.alias 的关系

  1. 系统自动生成

    • /lib/modules/$(uname -r)/modules.alias
    • /lib/modules/$(uname -r)/modules.dep,depmod生成,不要手动改
  2. 用户配置覆盖

    • /etc/modprobe.d/*.conf,你写的 alias、blacklist、options 会覆盖或追加系统规则。
  3. 加载顺序modprobe执行顺序大致是:

    1. /etc/modprobe.d/自定义规则
    2. modules.alias找到真实模块名
    3. modules.dep加载依赖
    4. 应用options参数
http://www.cnnetsun.cn/news/2031604.html

相关文章:

  • Linux命令:traceroute
  • Linux命令:traceroute6
  • 暗黑破坏神2存档编辑器实战指南:深度解析d2s文件修改与管理
  • 5G打电话为啥会掉到4G?一文拆解EPS Fallback信令流程(含N26接口详解)
  • 【仅限SRE/平台工程师】:Docker集群内核级调试——从dmesg异常到cgroup OOM killer触发链的完整溯源路径(含perf trace实操录屏要点)
  • 干货!无细胞表达GPCR与纳米盘筛选:72小时获得功能性β1AR的技术路径
  • 3分钟掌握VideoSrt:免费开源视频字幕自动生成终极指南
  • 如何快速解锁AI编程助手:智能重置与自动化注册终极指南
  • Hypnos-i1-8B模型安全性与稳定性测试:对抗性Prompt与边界案例
  • ENVI几何精校正保姆级教程:从Image to Map到Image to Image,手把手搞定遥感图像配准
  • Jasminum:Zotero中文文献管理终极解决方案,90%时间效率提升
  • 电动汽车充电:充电桩管理与电网负荷平衡
  • 云原生时代的IDE:GitHub Codespaces与Gitpod初体验
  • 新手必看:在HCL模拟器里用ACL实现网络隔离,从基础到二层过滤保姆级实验
  • Java的java.lang.ModuleLayer加载检测
  • AI教材编写新选择,低查重率超给力,快速产出优质教材!
  • 手把手教你封装一个高复用的uni-app自定义组件
  • Qwen2.5-VL-7B-Instruct实操手册:日志分析定位OoM错误+显存泄漏排查技巧
  • AI 应用回答不稳定、智能体跑偏与 API 成本异常:全流程排查指南
  • BDD100K:终极自动驾驶数据集工具包,10大视觉任务一站式解决方案
  • 基于springboot的超市线上购物管理系统库存上下架
  • 企业微信不能输入中文怎么办?一文讲清 MsCtfMonitor 修复方法
  • Lisp数据结构的C++优化实现
  • 终极视频对比分析工具:如何用FFmpeg和SDL2实现专业级视觉质量评估
  • 终极剪贴板管理神器:Clipy让你的Mac工作效率提升10倍
  • 广东省企业技术中心认定条件、流程、材料清单及好处
  • 2026年本地简易教程:怎么集成OpenClaw?Coding Plan配置与大模型Skill接入
  • Java-RPG-Maker-MV-Decrypter:解锁RPG游戏资源的专业解密工具
  • 工程师转型创业者的技术思维与商业实践
  • MATLAB环境下的结构模态参数识别方法:基于数据驱动的SSI-DATA和协方差驱动的SSI-...