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
.