在 Linux 中管理内核模块

CompTIABeginner
立即练习

介绍

在本实验中,你将学习在 Linux 环境中管理内核模块的基础技术。你将探索如何列出当前已加载的模块以查看系统的活跃组件,并检查单个模块以了解其详细信息,例如用途、依赖关系和其他参数。

在掌握这些检查技能的基础上,你将练习从运行中的内核中动态地卸载和加载模块。最后,你将学习如何配置系统在开机时自动加载特定的内核模块,从而确保在重启后无需手动干预即可使用关键功能。

这是一个引导实验,提供了逐步指导来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实战经验。历史数据表明,这是一个初学者级别的实验,完成率为 95%。它获得了学习者 100% 的好评率。

使用 lsmod 和 modinfo 列出并检查内核模块

在这一步中,你将学习如何列出当前已加载的内核模块并检查其详细信息。Linux 内核是模块化的,这意味着它的部分功能可以根据需要进行加载或卸载。这些动态可加载的部分被称为内核模块,它们通常对应于设备驱动程序、文件系统驱动程序或系统调用。

首先,让我们查看当前加载到系统内核中的所有模块状态。lsmod 命令提供了一个整洁且易读的列表。由于列表可能很长,我们将通过管道将输出传递给 less 工具以便于浏览。

在终端中执行以下命令:

lsmod | less

你会看到一个模块列表。输出结果分为三列:Module(模块名)、Size(大小)和 Used by(使用者)。

  • Module:内核模块的名称。
  • Size:模块的大小,以字节为单位。
  • Used by:当前正在使用此模块的其他模块或进程的数量,后面跟着依赖该模块的模块列表。

你的输出将类似于:

Module                  Size  Used by
nls_iso8859_1          16384  1
nls_cp437              20480  1
vfat                   20480  1
fat                    69632  1 vfat
...

你可以使用方向键滚动列表。按 q 键退出 less 查看器并返回命令提示符。

现在你已经知道如何列出模块,让我们获取特定模块的详细信息。modinfo 命令可以显示内核模块的各种细节,例如其文件名、许可证、描述、作者和依赖项。

让我们检查一下与并行端口相关的 parport 模块。

modinfo parport

该命令将显示关于 parport 模块的详细信息。

filename:       /lib/modules/x.x.x-xx-generic/kernel/drivers/parport/parport.ko
license:        GPL
description:    Parallel port driver
author:         Philip Blundell, Tim Waugh, Grant Grundler
srcversion:     <some_version_string>
depends:
retpoline:      Y
intree:         Y
vermagic:       x.x.x-xx-generic SMP mod_unload
sig_id:         ...
signer:         ...
sig_key:        ...
sig_hashalgo:   ...
signature:      ...

此输出告诉了你模块文件(.ko 文件)的确切位置、其许可证、简短描述等。请注意 depends 字段为空,这表明该模块没有依赖项。

模块通常依赖于其他模块。depmod 命令通过分析 /lib/modules/$(uname -r) 中的模块来创建模块依赖关系列表。这使得系统能够自动加载所需的模块。让我们生成这个依赖文件。此命令需要 root 权限,因此我们将使用 sudo

sudo depmod

该命令在成功执行后通常不会产生任何输出。它会在内核模块目录中创建或更新一个名为 modules.dep 的文件。路径中的 $(uname -r) 部分是一个命令替换,它会插入你当前内核的发行版本号。

现在,让我们查看刚刚构建的依赖文件。

less /lib/modules/$(uname -r)/modules.dep

该文件包含模块及其依赖项的列表,供自动管理模块的工具使用。你可以按 q 退出 less

使用 rmmod 卸载内核模块

在这一步中,你将学习如何使用 rmmod 命令从运行中的内核中卸载内核模块。卸载模块对于排除硬件故障、释放系统内存或在不再需要某个模块时非常有用。需要注意的是,你只能卸载当前未被系统或其他模块使用的模块。

我们以提供摇杆支持的 joydev 模块为例。首先,检查该模块是否已加载。我们可以将 lsmodgrep 结合使用来过滤输出。

lsmod | grep joydev

如果模块已加载,你将看到类似以下的输出。具体大小可能会有所不同。

joydev                 24576  0

Used by 列中的 0 表示该模块已加载,但当前未被任何进程或其他模块使用。这使其成为可以安全移除的对象。如果这个数字大于零,rmmod 可能会失败,从而防止你卸载系统所依赖的模块。

现在,让我们移除 joydev 模块。由于此操作会修改运行中的内核,因此需要 root 权限,我们将通过 sudo 获取。

sudo rmmod joydev

如果执行成功,rmmod 命令通常不会产生任何输出。为了确认模块已成功卸载,我们可以再次运行相同的 lsmod | grep joydev 命令。

lsmod | grep joydev

这一次,该命令应该不会产生任何输出。这种静默状态即确认了 joydev 模块已不再加载于内核中。

使用 insmod 加载内核模块

在这一步中,你将学习如何使用 insmod 命令手动将内核模块加载到运行中的内核中。这是 rmmod 的对应操作。虽然现代系统通常使用更高级的工具 modprobe(它可以自动处理依赖关系),但了解 insmod 对于学习内核模块的工作原理至关重要。

在上一步中,你卸载了 joydev 模块。现在,我们要把它加载回来。insmod 命令要求你提供模块对象文件的完整路径,该文件具有 .ko(内核对象)扩展名。

内核模块的标准目录是 /lib/modules/$(uname -r)/kernel/,其中 $(uname -r) 会展开为你当前的内核版本。joydev 模块通常位于 drivers/input/ 子目录下。

让我们使用完整路径加载 joydev 模块。此操作需要 root 权限。

sudo insmod /lib/modules/$(uname -r)/kernel/drivers/input/joydev.ko

rmmod 一样,如果成功,insmod 不会产生任何输出。

要确认模块已加载,你可以再次使用 lsmod | grep joydev 命令。

lsmod | grep joydev

运行命令后,你应该能在输出中看到 joydev 模块,确认它已成功重新加载到内核中。

joydev                 24576  0

配置内核模块在开机时自动加载

在这一步中,你将学习如何确保内核模块在每次系统启动时自动加载。使用 insmod 手动加载模块是临时性的,重启后不会保留。要使更改永久生效,你需要配置系统在引导过程中加载该模块。

在采用 systemd 的现代 Linux 系统上,开机自动加载内核模块的标准方法是在 /etc/modules-load.d/ 目录中添加配置文件。该目录中任何以 .conf 结尾的文件都会被读取,系统会尝试加载其中列出的每个模块(每行一个)。

让我们配置 joydev 模块自动加载。我们将在 /etc/modules-load.d/ 中创建一个名为 joydev.conf 的文件,并将单词 joydev 写入其中。我们可以使用 echotee 配合 sudo 通过一条命令完成此操作。

echo joydev | sudo tee /etc/modules-load.d/joydev.conf

该命令的工作原理如下:

  • echo joydev 打印文本「joydev」。
  • 管道符 | 将此文本作为输入发送给下一个命令。
  • sudo tee /etc/modules-load.d/joydev.conf 接收该文本。tee 命令将其接收到的输入写入指定文件(/etc/modules-load.d/joydev.conf),同时也显示在屏幕上。我们使用 sudo 是因为该目录受保护,需要 root 权限才能写入。

你应该会看到以下输出,即写入文件的内容:

joydev

要确认文件已正确创建,可以使用 cat 命令显示其内容:

cat /etc/modules-load.d/joydev.conf

输出应该是你刚刚添加的模块名称:

joydev

现在,每次系统启动时,它都会自动加载 joydev 模块。你已成功配置了持久化的模块加载。

总结

在本实验中,你学习了在 Linux 环境中管理内核模块的基础操作。你练习了使用 lsmod 命令列出所有当前加载的模块,并使用 modinfo 命令检查特定模块的详细信息(如文件名和描述)。

你还获得了通过 rmmod 卸载模块和通过 insmod 加载模块来动态更改内核的实战经验。最后,你学习了如何配置模块在开机时自动加载,确保必要的驱动程序或功能在系统重启后依然可用。这些技能对于有效管理设备驱动程序和内核特性至关重要。