侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux depmod命令教程:生成模块依赖和映射文件(附实例和注意事项)

Linux depmod命令介绍

Linux depmod命令是用于生成模块依赖和映射文件的工具。Linux内核模块可以提供服务(称为“符号”)给其他模块使用(使用代码中的EXPORT_SYMBOL变体之一)。如果一个模块使用了另一个模块提供的符号,那么这个模块就明显依赖于另一个模块。这些依赖关系可能非常复杂。depmod命令通过读取/lib/modules/目录下的每个模块,确定它导出和需要的符号,然后根据这些符号创建一个类似于Makefile的依赖文件,名为modules.dep,并在同一目录下创建一个二进制哈希版本,名为modules.dep.bin。如果在命令行中给出了文件名,那么只有这些模块会被检查(这很少有用,除非列出了所有模块)。depmod命令还会创建一个模块提供的符号列表,文件名为modules.symbols,以及它的二进制哈希版本,modules.symbols.bin。最后,如果模块提供了特殊的设备名(devname),那么depmod命令会输出一个名为modules.devname的文件,这些设备名应该在启动时在/dev中创建(由类似于systemd-tmpfiles的工具来完成)。

Linux depmod命令适用的Linux版本

depmod命令是一个通用的Linux命令,可以在多数Linux发行版(如Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian)的主要终端命令解释器(包括bash、zsh、csh、ksh、fish、tcsh)中使用。如果你的系统没有安装depmod命令,你可以使用你的包管理器来安装它。例如,在Ubuntu或Debian上,你可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo apt update
[linux@bashcommandnotfound.cn ~]$ sudo apt install kmod

在Fedora或CentOS上,你可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ sudo dnf update
[linux@bashcommandnotfound.cn ~]$ sudo dnf install kmod

或者:

[linux@bashcommandnotfound.cn ~]$ sudo yum update
[linux@bashcommandnotfound.cn ~]$ sudo yum install kmod

Linux depmod命令的基本语法

depmod命令的基本语法格式如下:

depmod [options] [version] [filename...]

其中,options是可选的参数,用于指定不同的选项;version是可选的内核版本,用于指定要处理的模块目录,如果省略,则使用当前内核版本(由uname -r返回);filename是可选的模块文件名,用于指定要检查的模块,如果省略,则检查所有模块。

Linux depmod命令的常用选项说明

depmod命令的常用选项如下表所示:

选项说明
-a, --all分析所有可用的模块。这是默认选项,如果没有给出文件名。
-b, --basedir指定一个基础目录,用于代替/lib/modules目录。这在模块不在正常的位置时很有用。
-e, --errsyms输出无法解析的符号。
-F, --filesyms指定一个符号表文件,用于代替System.map文件。这在内核没有安装时很有用。
-h, --help显示帮助信息并退出。
-n, --dry-run将结果输出到标准输出,而不是写入模块目录。这对于调试很有用。
-P, --symbol-prefix指定一个前缀字符,用于忽略一些架构特定的符号。例如,有些架构会在符号前加上一个下划线。
-q, --quiet安静模式,不输出任何信息。
-r, --show-depends输出模块依赖的模块文件名,而不是符号。
-u, --unresolved-error如果有无法解析的符号,返回一个错误。
-v, --verbose输出详细的信息。
-V, --version显示版本信息并退出。

Linux depmod命令的实例

以下是一些depmod命令的实例:

1. 分析所有模块并生成依赖和映射文件

[linux@bashcommandnotfound.cn ~]$ sudo depmod -a

这个命令会分析/lib/modules/目录下的所有模块,并生成modules.dep, modules.dep.bin, modules.symbols, modules.symbols.bin, modules.devname等文件。这些文件通常在内核或模块安装时自动生成,但有时可能需要手动运行这个命令来更新它们。

2. 分析指定内核版本的模块

[linux@bashcommandnotfound.cn ~]$ sudo depmod -a 5.10.0-8-amd64

这个命令会分析/lib/modules/5.10.0-8-amd64目录下的所有模块,并生成相应的依赖和映射文件。这在你有多个内核版本时很有用,你可以指定要处理的内核版本。

3. 分析指定的模块文件

[linux@bashcommandnotfound.cn ~]$ sudo depmod -a /lib/modules/5.10.0-8-amd64/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko

这个命令会分析指定的模块文件,并生成相应的依赖和映射文件。这在你只想检查某个模块时很有用,但是这很少有用,除非你列出了所有模块,否则可能会导致依赖不完整。

4. 输出无法解析的符号

[linux@bashcommandnotfound.cn ~]$ sudo depmod -e

这个命令会输出所有无法解析的符号,这些符号可能是由于模块缺失或不兼容导致的。这对于排查模块加载问题很有用。

5. 使用指定的符号表文件

[linux@bashcommandnotfound.cn ~]$ sudo depmod -F /boot/System.map-5.10.0-8-amd64

这个命令会使用指定的符号表文件,而不是默认的System.map文件。这在你的内核没有安装时很有用,你可以使用内核源码中的Module.symvers文件来代替。

6. 将结果输出到标准输出

[linux@bashcommandnotfound.cn ~]$ sudo depmod -n

这个命令会将结果输出到标准输出,而不是写入模块目录。这对于调试很有用,你可以查看生成的依赖和映射文件的内容,而不会影响原有的文件。

7. 忽略前缀字符

[linux@bashcommandnotfound.cn ~]$ sudo depmod -P _

这个命令会忽略前缀字符_,这在一些架构中很有用,因为它们会在符号前加上一个下划线。这样可以避免重复或错误的符号。

8. 输出模块依赖的模块文件名

[linux@bashcommandnotfound.cn ~]$ sudo depmod -r

这个命令会输出模块依赖的模块文件名,而不是符号。

Linux depmod命令的注意事项

在使用depmod命令时,有一些注意事项需要注意:

  • depmod命令需要root权限,所以你需要使用sudo或者su来执行它。
  • depmod命令会覆盖原有的依赖和映射文件,所以你需要在确定没有问题后再运行它,或者使用-n选项来预览结果。
  • depmod命令会读取/lib/modules/目录下的所有模块,所以你需要确保这个目录下的模块是正确的,没有损坏或者不兼容的模块。
  • depmod命令会根据内核版本来处理模块,所以你需要确保你的内核版本和模块版本是匹配的,或者使用-v选项来指定内核版本。
  • depmod命令会根据System.map文件来获取内核符号,所以你需要确保这个文件是正确的,没有缺失或者不一致的符号,或者使用-F选项来指定符号表文件。
  • 如果你的系统没有安装depmod命令,你可能会遇到bash: depmod: command not found的错误,这时你需要使用你的包管理器来安装kmod包,它包含了depmod命令。
0

评论区