Lệnh depmod trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng lệnh depmod trong Linux để phân tích cây phụ thuộc của các module kernel. Lệnh depmod được dùng để tạo ra một file phụ thuộc chứa thông tin về các phụ thuộc giữa các module kernel, điều này rất quan trọng để đảm bảo rằng các module cần thiết được tải một cách chính xác. Bạn sẽ bắt đầu bằng cách hiểu mục đích của lệnh depmod, sau đó khám phá cây phụ thuộc của các module kernel, và cuối cùng, học cách khắc phục sự cố các phụ thuộc module bằng cách sử dụng depmod. Lab này sẽ cung cấp cho bạn những ví dụ thực tế và những hiểu biết sâu sắc về cách quản lý các module kernel và các phụ thuộc của chúng trong một hệ thống Linux.

Hiểu Mục Đích của Lệnh depmod

Trong bước này, bạn sẽ tìm hiểu về mục đích của lệnh depmod trong Linux. Lệnh depmod được sử dụng để phân tích các phụ thuộc module của các module kernel Linux.

Lệnh depmod tạo ra một file phụ thuộc, thường nằm tại /lib/modules/<kernel_version>/modules.dep, chứa thông tin về các phụ thuộc giữa các module kernel. File này được sử dụng bởi lệnh modprobe để tự động tải các module kernel cần thiết khi một module được yêu cầu.

Hãy bắt đầu bằng cách chạy lệnh depmod:

sudo depmod

Ví dụ đầu ra:

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

Lệnh depmod quét thư mục /lib/modules/<kernel_version> và các thư mục con của nó để tìm tất cả các module kernel đã được cài đặt. Sau đó, nó tạo ra file modules.dep, chứa thông tin phụ thuộc cho mỗi module.

Bạn có thể xem nội dung của file modules.dep bằng lệnh sau:

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

Ví dụ đầu ra:

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

File modules.dep liệt kê các phụ thuộc cho mỗi module kernel, chỉ ra những module khác cần được tải để một module cụ thể hoạt động chính xác.

Trong bước tiếp theo, bạn sẽ khám phá cây phụ thuộc của các module kernel chi tiết hơn.

Khám Phá Cây Phụ Thuộc của Các Module Kernel

Trong bước này, bạn sẽ học cách khám phá cây phụ thuộc của các module kernel bằng lệnh depmod.

Đầu tiên, hãy liệt kê tất cả các module kernel đã cài đặt trên hệ thống:

sudo modprobe -l

Ví dụ đầu ra:

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
...

Để xem các phụ thuộc cho một module kernel cụ thể, bạn có thể sử dụng lệnh modinfo. Ví dụ, hãy kiểm tra các phụ thuộc cho module acpi_power_meter:

sudo modinfo -d acpi_power_meter

Ví dụ đầu ra:

depends: acpi_ipmi

Đầu ra này cho thấy module acpi_power_meter phụ thuộc vào module acpi_ipmi.

Bạn cũng có thể sử dụng lệnh depmod để tạo ra một cây phụ thuộc chi tiết hơn. Lệnh depmod -n -a sẽ hiển thị cây phụ thuộc mà không thực sự tải các module:

sudo depmod -n -a

Ví dụ đầu ra:

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

Đầu ra này cho thấy cây phụ thuộc đầy đủ cho mỗi module kernel, chỉ ra những module khác cần được tải để một module cụ thể hoạt động chính xác.

Hiểu cây phụ thuộc của các module kernel là quan trọng khi khắc phục các sự cố liên quan đến module kernel, vì bạn cần đảm bảo rằng tất cả các phụ thuộc cần thiết được đáp ứng.

Trong bước tiếp theo, bạn sẽ học cách khắc phục sự cố các phụ thuộc module bằng lệnh depmod.

Khắc Phục Sự Cố Phụ Thuộc Module với depmod

Trong bước cuối cùng này, bạn sẽ học cách sử dụng lệnh depmod để khắc phục sự cố liên quan đến các phụ thuộc module kernel.

Hãy bắt đầu bằng cách tạo một module kernel tùy chỉnh có phụ thuộc vào một module khác. Chúng ta sẽ sử dụng module hello_world làm ví dụ:

## Create a new directory for the module
mkdir ~/project/hello_world
cd ~/project/hello_world

## Create the module source file
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

## Compile the module
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Bây giờ, hãy tạo một module thứ hai phụ thuộc vào module hello_world:

## Create the dependent module source file
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

## Compile the dependent module
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Bây giờ, hãy thử tải module hello_dependent:

sudo insmod hello_dependent.ko

Ví dụ đầu ra:

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

Thông báo lỗi cho biết rằng module hello_dependent không thể tìm thấy module hello_world mà nó phụ thuộc vào.

Để khắc phục sự cố này, chúng ta có thể sử dụng lệnh depmod để cập nhật thông tin phụ thuộc module:

sudo depmod -a

Bây giờ, hãy thử tải lại module hello_dependent:

sudo insmod hello_dependent.ko

Lần này, module sẽ được tải thành công và bạn sẽ thấy thông báo "Hello Dependent Module!" trong nhật ký kernel.

Trong bước này, bạn đã học cách sử dụng lệnh depmod để khắc phục sự cố liên quan đến các phụ thuộc module kernel. Bằng cách cập nhật thông tin phụ thuộc module, bạn có thể đảm bảo rằng tất cả các module cần thiết được tải chính xác, cho phép các module tùy chỉnh của bạn hoạt động như mong đợi.

Tóm tắt

Trong lab này, bạn đã học về mục đích của lệnh depmod trong Linux, được sử dụng để phân tích các phụ thuộc module của các module kernel. Lệnh depmod tạo ra một file phụ thuộc, modules.dep, chứa thông tin về các phụ thuộc giữa các module kernel. File này được sử dụng bởi lệnh modprobe để tự động tải các module kernel cần thiết khi một module được yêu cầu. Sau đó, bạn đã khám phá cây phụ thuộc của các module kernel chi tiết hơn, học cách sử dụng lệnh depmod để liệt kê tất cả các module và các phụ thuộc của chúng, cũng như cách khắc phục sự cố các phụ thuộc module bằng lệnh depmod.

400+ câu lệnh phổ biến trong Linux