介绍
在本实验中,你将学习如何在 Linux 中使用 depmod
命令来分析内核模块的依赖树。depmod
命令用于生成一个包含内核模块之间依赖关系的文件,这对于确保正确加载所需的模块至关重要。你将首先了解 depmod
命令的用途,然后探索内核模块的依赖树,最后学习如何使用 depmod
来排查模块依赖问题。本实验将为你提供实用的示例和见解,帮助你在 Linux 系统中管理内核模块及其依赖关系。
在本实验中,你将学习如何在 Linux 中使用 depmod
命令来分析内核模块的依赖树。depmod
命令用于生成一个包含内核模块之间依赖关系的文件,这对于确保正确加载所需的模块至关重要。你将首先了解 depmod
命令的用途,然后探索内核模块的依赖树,最后学习如何使用 depmod
来排查模块依赖问题。本实验将为你提供实用的示例和见解,帮助你在 Linux 系统中管理内核模块及其依赖关系。
在这一步中,你将学习 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
命令排查与内核模块依赖相关的问题。
让我们从创建一个依赖于另一个模块的自定义内核模块开始。我们将以 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
命令排查模块依赖问题。