linux depmod命令

depmod命令用于生成内核模块的依赖关系文件。它会分析/lib/modules/目录中的内核模块,生成modules.dep文件,供modprobe命令使用。

语法格式

depmod [选项] [内核版本]

命令功能

  • 分析内核模块的依赖关系
  • 生成modules.depmodules.dep.bin文件
  • 生成模块符号信息文件
  • modprobe命令提供依赖信息
  • 支持多版本内核的模块管理

📝 重要说明

  • depmod通常在安装或删除内核模块后运行
  • 需要root权限才能更新系统模块目录
  • 生成的文件位于/lib/modules/内核版本/目录中
  • 内核模块通常以.ko扩展名结尾(Kernel Object)
  • 依赖关系基于模块的符号导出和导入

内核模块目录结构

/lib/modules/内核版本/ 目录结构:

/lib/modules/5.4.0-100-generic/
├── modules.alias
├── modules.alias.bin
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.order
├── modules.softdep
├── modules.symbols
├── modules.symbols.bin
├── kernel/
│   ├── drivers/
│   ├── fs/
│   ├── net/
│   └── ...
└── updates/

参数说明

参数 说明
内核版本 指定内核版本。如果省略,使用当前运行的内核版本
-a, --all 为所有内核版本生成依赖关系
-A, --quick 仅检查是否有模块比依赖文件新,如果是则更新
-b, --basedir 目录 使用指定的基本目录而不是/
-e, --errsyms 报告未解析的符号
-E, --symvers 使用Module.symvers文件检查符号版本
-F, --filesyms 文件 使用System.map文件作为符号参考
-h, --help 显示帮助信息
-n, --show 将结果输出到标准输出而不是写入文件
-P, --symbol-prefix 前缀 内核符号前缀(某些架构需要)
-v, --verbose 详细模式,显示处理过程
-V, --version 显示版本信息
-w 警告模式,报告所有问题

生成的文件说明

文件 说明
modules.dep 模块依赖关系的文本文件
modules.dep.bin 模块依赖关系的二进制文件(更快)
modules.symbols 模块符号信息文件
modules.alias 模块别名文件,用于设备驱动匹配
modules.softdep 模块软依赖(加载顺序)

常用示例

示例1:基本用法 - 为当前内核生成依赖

为当前运行的内核生成模块依赖关系:

# 查看当前内核版本
$ uname -r
5.4.0-100-generic

# 生成依赖关系(需要root权限)
$ sudo depmod

# 查看生成的文件
$ ls -l /lib/modules/$(uname -r)/modules.dep*
-rw-r--r-- 1 root root 123456 Mar 10 10:00 modules.dep
-rw-r--r-- 1 root root  98765 Mar 10 10:00 modules.dep.bin

示例2:为指定内核版本生成依赖

为指定的内核版本生成模块依赖关系:

# 查看系统中安装的内核版本
$ ls /lib/modules/
5.4.0-100-generic  5.4.0-99-generic  5.8.0-50-generic

# 为指定内核版本生成依赖
$ sudo depmod 5.8.0-50-generic

# 检查生成的文件
$ ls -l /lib/modules/5.8.0-50-generic/modules.dep*

示例3:为所有内核生成依赖

使用-a参数为所有内核版本生成依赖:

# 为所有已安装的内核生成依赖关系
$ sudo depmod -a

# 详细模式查看过程
$ sudo depmod -a -v
WARNING: could not open /tmp/modules.dep.tmp: Permission denied
... (处理过程输出)

示例4:仅检查更新

使用-A参数仅在有模块更新时生成依赖:

# 仅在模块比依赖文件新时更新
$ sudo depmod -A

# 结合-v查看详细过程
$ sudo depmod -A -v

示例5:显示依赖关系到标准输出

使用-n参数将结果输出到屏幕而不是文件:

# 将依赖关系输出到屏幕
$ sudo depmod -n

# 输出示例:
kernel/arch/x86/kvm/kvm.ko:
kernel/drivers/char/tpm/tpm_vtpm_proxy.ko: kernel/drivers/char/tpm/tpm.ko
kernel/drivers/hid/hid.ko: kernel/drivers/hid/hid-ids.ko
...

# 输出到文件
$ sudo depmod -n > /tmp/modules.dep.txt

示例6:检查未解析的符号

使用-e参数报告未解析的符号:

# 检查模块中未解析的符号
$ sudo depmod -e

# 如果有未解析的符号,会输出类似:
WARNING: Module /lib/modules/5.4.0-100-generic/kernel/drivers/net/ethernet/example.ko
needs unknown symbol some_unresolved_symbol

示例7:使用System.map文件

使用-F参数指定System.map文件:

# 使用特定的System.map文件
$ sudo depmod -F /boot/System.map-$(uname -r)

# 如果System.map文件不在标准位置
$ sudo depmod -F /usr/src/linux-headers-$(uname -r)/System.map

示例8:安装新模块后运行depmod

安装新内核模块后的标准流程:

# 1. 编译模块
$ make
# 假设生成了 mymodule.ko

# 2. 安装模块到系统目录
$ sudo cp mymodule.ko /lib/modules/$(uname -r)/kernel/drivers/mydriver/

# 3. 生成模块依赖关系
$ sudo depmod

# 4. 加载模块测试
$ sudo modprobe mymodule

# 5. 检查模块是否加载
$ lsmod | grep mymodule

示例9:查看模块依赖关系文件内容

查看生成的模块依赖关系文件:

# 查看modules.dep文件内容
$ head -20 /lib/modules/$(uname -r)/modules.dep

# 示例输出:
kernel/arch/x86/kvm/kvm.ko:
kernel/drivers/block/floppy.ko:
kernel/drivers/block/loop.ko:
kernel/drivers/char/agp/agpgart.ko: kernel/drivers/char/agp/agp.ko
kernel/drivers/char/hw_random/hw_random.ko:
kernel/drivers/char/ipmi/ipmi_devintf.ko: kernel/drivers/char/ipmi/ipmi_msghandler.ko
kernel/drivers/char/ipmi/ipmi_msghandler.ko:
kernel/drivers/char/ipmi/ipmi_poweroff.ko: kernel/drivers/char/ipmi/ipmi_msghandler.ko
kernel/drivers/char/ipmi/ipmi_si.ko: kernel/drivers/char/ipmi/ipmi_msghandler.ko
kernel/drivers/char/ipmi/ipmi_watchdog.ko: kernel/drivers/char/ipmi/ipmi_msghandler.ko

# 查看特定模块的依赖
$ grep "mymodule.ko" /lib/modules/$(uname -r)/modules.dep

⚠️ 注意事项

  1. 权限要求:修改/lib/modules/目录需要root权限
  2. 内核版本匹配:确保为正确的内核版本生成依赖关系
  3. 模块兼容性:内核模块必须与内核版本匹配
  4. 文件完整性:如果模块损坏,depmod可能无法正确分析依赖关系
  5. 系统更新:内核升级后,旧版本的模块依赖文件不会被自动删除

💡 实用技巧

  1. 自动化脚本:在模块安装脚本中包含depmod命令
  2. 调试模块问题:使用depmod -e检查未解析的符号
  3. 清理旧内核:删除不再使用的内核及其模块目录
  4. 备份配置:备份/etc/modules-load.d//etc/modprobe.d/配置文件
  5. 性能优化:使用modules.dep.bin二进制文件比文本文件加载更快

常见问题

Q: depmod和modprobe有什么关系?

A: depmod生成模块依赖关系文件,modprobe使用这些文件自动加载模块及其依赖。没有depmod生成的依赖文件,modprobe无法知道模块之间的依赖关系。

Q: 什么时候需要运行depmod?

A: 1) 安装新内核模块后;2) 升级内核后;3) 删除内核模块后;4) 手动修改模块目录结构后。

Q: 运行depmod会有什么风险?

A: 通常很安全,但如果模块有问题,可能导致系统无法正确加载模块。建议在重要系统上先测试。

Q: 如何删除旧内核的模块依赖文件?

A: 删除整个内核模块目录:sudo rm -rf /lib/modules/旧内核版本/

Q: depmod错误"could not open modules.dep.tmp"怎么办?

A: 可能是权限问题或磁盘空间不足。确保有足够的权限和磁盘空间,并检查/tmp目录是否可写。

相关命令

  • modprobe - 加载内核模块(使用depmod生成的依赖关系)
  • insmod - 加载内核模块(不处理依赖)
  • rmmod - 移除内核模块
  • lsmod - 列出已加载的内核模块
  • modinfo - 显示内核模块信息
  • dkms - 动态内核模块支持(自动处理模块编译和安装)
  • make modules_install - 安装编译的内核模块并自动运行depmod