depmod命令用于生成内核模块的依赖关系文件。它会分析/lib/modules/目录中的内核模块,生成modules.dep文件,供modprobe命令使用。
depmod [选项] [内核版本]
modules.dep和modules.dep.bin文件modprobe命令提供依赖信息depmod通常在安装或删除内核模块后运行/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 | 模块软依赖(加载顺序) |
为当前运行的内核生成模块依赖关系:
# 查看当前内核版本
$ 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
为指定的内核版本生成模块依赖关系:
# 查看系统中安装的内核版本
$ 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*
使用-a参数为所有内核版本生成依赖:
# 为所有已安装的内核生成依赖关系
$ sudo depmod -a
# 详细模式查看过程
$ sudo depmod -a -v
WARNING: could not open /tmp/modules.dep.tmp: Permission denied
... (处理过程输出)
使用-A参数仅在有模块更新时生成依赖:
# 仅在模块比依赖文件新时更新
$ sudo depmod -A
# 结合-v查看详细过程
$ sudo depmod -A -v
使用-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
使用-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
使用-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
安装新内核模块后的标准流程:
# 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
查看生成的模块依赖关系文件:
# 查看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
/lib/modules/目录需要root权限depmod命令depmod -e检查未解析的符号/etc/modules-load.d/和/etc/modprobe.d/配置文件modules.dep.bin二进制文件比文本文件加载更快A: depmod生成模块依赖关系文件,modprobe使用这些文件自动加载模块及其依赖。没有depmod生成的依赖文件,modprobe无法知道模块之间的依赖关系。
A: 1) 安装新内核模块后;2) 升级内核后;3) 删除内核模块后;4) 手动修改模块目录结构后。
A: 通常很安全,但如果模块有问题,可能导致系统无法正确加载模块。建议在重要系统上先测试。
A: 删除整个内核模块目录:sudo rm -rf /lib/modules/旧内核版本/
A: 可能是权限问题或磁盘空间不足。确保有足够的权限和磁盘空间,并检查/tmp目录是否可写。
modprobe - 加载内核模块(使用depmod生成的依赖关系)insmod - 加载内核模块(不处理依赖)rmmod - 移除内核模块lsmod - 列出已加载的内核模块modinfo - 显示内核模块信息dkms - 动态内核模块支持(自动处理模块编译和安装)make modules_install - 安装编译的内核模块并自动运行depmod