Linux depmod 命令实战示例

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何在 Linux 中使用 depmod 命令来分析内核模块的依赖树。depmod 命令用于生成一个包含内核模块之间依赖关系的文件,这对于确保正确加载所需的模块至关重要。你将首先了解 depmod 命令的用途,然后探索内核模块的依赖树,最后学习如何使用 depmod 来排查模块依赖问题。本实验将为你提供实用的示例和见解,帮助你在 Linux 系统中管理内核模块及其依赖关系。

Linux 命令速查表


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("`Linux`")) -.-> linux/PackagesandSoftwaresGroup(["`Packages and Softwares`"]) linux/PackagesandSoftwaresGroup -.-> linux/software("`Linux Software`") subgraph Lab Skills linux/software -.-> lab-422631{{"`Linux depmod 命令实战示例`"}} end

理解 depmod 命令的用途

在这一步中,你将学习 Linux 中 depmod 命令的用途。depmod 命令用于分析 Linux 内核模块的模块依赖关系。

depmod 命令会生成一个依赖文件,通常位于 /lib/modules/<kernel_version>/modules.dep,其中包含内核模块之间的依赖关系信息。modprobe 命令会使用该文件在请求加载某个模块时自动加载所需的内核模块。

让我们从运行 depmod 命令开始:

sudo depmod

示例输出:

Scanning /lib/modules/5.15.0-1023-aws for modules
Scanning /lib/modules/5.15.0-1023-aws/kernel for modules
Scanning /lib/modules/5.15.0-1023-aws/updates for modules
Scanning /lib/modules/5.15.0-1023-aws/weak-updates for modules

depmod 命令会扫描 /lib/modules/<kernel_version> 目录及其子目录,以查找所有已安装的内核模块。然后,它会生成 modules.dep 文件,其中包含每个模块的依赖信息。

你可以使用以下命令查看 modules.dep 文件的内容:

cat /lib/modules/5.15.0-1023-aws/modules.dep

示例输出:

kernel/drivers/acpi/acpi_power_meter.ko: kernel/drivers/acpi/acpi_ipmi.ko
kernel/drivers/acpi/acpi_thermal_rel.ko: kernel/drivers/acpi/acpi_ipmi.ko
kernel/drivers/acpi/apei/ghes.ko: kernel/drivers/acpi/apei/apei-base.ko
kernel/drivers/acpi/apei/erst-lib.ko: kernel/drivers/acpi/apei/apei-base.ko

modules.dep 文件列出了每个内核模块的依赖关系,表明某个模块正常运行需要加载哪些其他模块。

在下一步中,你将更详细地探索内核模块的依赖树。

探索内核模块的依赖树

在这一步中,你将学习如何使用 depmod 命令探索内核模块的依赖树。

首先,让我们列出系统中所有已安装的内核模块:

sudo modprobe -l

示例输出:

kernel/drivers/acpi/acpi_power_meter.ko
kernel/drivers/acpi/acpi_thermal_rel.ko
kernel/drivers/acpi/apei/ghes.ko
kernel/drivers/acpi/apei/erst-lib.ko
...

要查看特定内核模块的依赖关系,可以使用 modinfo 命令。例如,让我们检查 acpi_power_meter 模块的依赖关系:

sudo modinfo -d acpi_power_meter

示例输出:

depends: acpi_ipmi

此输出显示 acpi_power_meter 模块依赖于 acpi_ipmi 模块。

你还可以使用 depmod 命令生成更详细的依赖树。depmod -n -a 命令将显示依赖树,而不会实际加载模块:

sudo depmod -n -a

示例输出:

kernel/drivers/acpi/acpi_power_meter.ko:
 kernel/drivers/acpi/acpi_ipmi.ko

kernel/drivers/acpi/acpi_thermal_rel.ko:
 kernel/drivers/acpi/acpi_ipmi.ko

kernel/drivers/acpi/apei/ghes.ko:
 kernel/drivers/acpi/apei/apei-base.ko

kernel/drivers/acpi/apei/erst-lib.ko:
 kernel/drivers/acpi/apei/apei-base.ko

此输出显示了每个内核模块的完整依赖树,表明某个模块正常运行需要加载哪些其他模块。

理解内核模块的依赖树对于排查与内核模块相关的问题非常重要,因为你需要确保所有必需的依赖关系都得到满足。

在下一步中,你将学习如何使用 depmod 命令排查模块依赖问题。

使用 depmod 排查模块依赖问题

在这最后一步中,你将学习如何使用 depmod 命令排查与内核模块依赖相关的问题。

让我们从创建一个依赖于另一个模块的自定义内核模块开始。我们将以 hello_world 模块为例:

## 为模块创建一个新目录
mkdir ~/project/hello_world
cd ~/project/hello_world

## 创建模块源文件
cat << EOF > hello_world.c
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple hello world kernel module");

static int __init hello_world_init(void)
{
    printk(KERN_INFO "Hello, World!\n");
    return 0;
}

static void __exit hello_world_exit(void)
{
    printk(KERN_INFO "Goodbye, World!\n");
}

module_init(hello_world_init);
module_exit(hello_world_exit);
EOF

## 编译模块
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

接下来,我们创建一个依赖于 hello_world 模块的第二个模块:

## 创建依赖模块的源文件
cat << EOF > hello_dependent.c
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A module that depends on the hello_world module");
MODULE_DEPENDS_ON("hello_world");

static int __init hello_dependent_init(void)
{
    printk(KERN_INFO "Hello Dependent Module!\n");
    return 0;
}

static void __exit hello_dependent_exit(void)
{
    printk(KERN_INFO "Goodbye Dependent Module!\n");
}

module_init(hello_dependent_init);
module_exit(hello_dependent_exit);
EOF

## 编译依赖模块
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

现在,让我们尝试加载 hello_dependent 模块:

sudo insmod hello_dependent.ko

示例输出:

insmod: ERROR: could not insert module hello_dependent.ko: Unknown symbol in module

错误信息表明 hello_dependent 模块无法找到它所依赖的 hello_world 模块。

为了排查这个问题,我们可以使用 depmod 命令更新模块依赖信息:

sudo depmod -a

现在,让我们再次尝试加载 hello_dependent 模块:

sudo insmod hello_dependent.ko

这一次,模块应该会成功加载,并且你应该在内核日志中看到 "Hello Dependent Module!" 消息。

在这一步中,你学习了如何使用 depmod 命令排查与内核模块依赖相关的问题。通过更新模块依赖信息,你可以确保所有必需的模块都能正确加载,从而使你的自定义模块能够按预期运行。

总结

在本实验中,你首先学习了 Linux 中 depmod 命令的用途,该命令用于分析内核模块的模块依赖关系。depmod 命令会生成一个依赖文件 modules.dep,其中包含内核模块之间的依赖关系信息。modprobe 命令会使用该文件在请求加载某个模块时自动加载所需的内核模块。接着,你更详细地探索了内核模块的依赖树,学习了如何使用 depmod 命令列出所有模块及其依赖关系,以及如何使用 depmod 命令排查模块依赖问题。

Linux 命令速查表

您可能感兴趣的其他 Linux 教程