内核模块
100%

内核 · 第 6 课

内核模块

学习如何检查、加载、配置并安全移除特定 Linux 内核版本的模块。

可加载内核模块是能够用驱动程序、文件系统、网络功能或其他子系统扩展正在运行内核的特权代码。模块可以避免将每个可选功能都内置到同一个内核映像中,但加载模块也会扩大可信内核的攻击面。

列出和检查模块

列出当前已加载的模块:

$ lsmod

输出来自 /proc/modules 等内核状态,包含模块名称、大小以及使用计数或依赖关系。看似为零的计数并不能充分证明可以安全移除;驱动程序仍可能拥有活动设备或参与子系统状态。

检查当前内核可用的某个模块:

$ modinfo MODULE_NAME

modinfo 可以显示文件名、别名、参数、许可证、描述和签名信息。应把元数据视为描述,而不是模块可信或适合当前工作负载的证明。

lsmod 显示什么?

使用 `modprobe` 加载

按名称加载模块:

$ sudo modprobe MODULE_NAME

modprobe 会查询 /lib/modules/$(uname -r)/ 下当前内核的依赖索引、别名和配置。它会加载所需依赖项,并传递已配置的参数。insmod 则直接插入一个指定模块文件,不提供同样的依赖解析流程。

加载前,应确认模块来源、签名策略、内核版本兼容性、参数、预期硬件绑定和回滚方案。安全启动或内核锁定可能拒绝未签名模块;强行加载不兼容代码可能导致崩溃或系统失陷。

为什么通常优先使用 modprobe 而不是直接使用 insmod

模块参数与启动时加载

持久的参数和别名策略应写入 /etc/modprobe.d/ 下的 .conf 文件:

options example_module mode=careful

该行会影响 modprobe 加载模块的方式,但本身不会请求在启动时加载模块。简单的启动时加载列表通常放在 /etc/modules-load.d/ 下:

example_module

硬件别名通常会触发自动加载,无需显式列表。对于早期启动阶段所需的模块,修改配置后应按照发行版规定的流程更新 initramfs。

/etc/modprobe.d/ 中的 options 行会做什么?

黑名单及其局限

modprobe 配置可以包含:

blacklist example_module

黑名单通常会阻止通过模块别名自动加载。它不会卸载已加载模块,不会将模块从 initramfs 中移除,也不一定能阻止按确切名称显式加载或作为依赖项加载。安全加固需要结合具体威胁,从模块可用性、签名强制、initramfs 内容、启动参数和策略等方面采取措施。

基本的 modprobe blacklist 行主要阻止什么?

安全移除模块

请求移除模块:

$ sudo modprobe -r MODULE_NAME

modprobe 可以根据情况移除不再使用的依赖项。当普通引用跟踪显示模块正忙时,内核会拒绝移除,但不能只依赖这一项安全检查。移除支持活动硬件的代码前,应停止服务、卸载文件系统、分离设备、让网络停止活动,并确认已有其他驱动程序或恢复通道。

绝不要在需要保持稳定的系统上强制卸载模块。移除缺陷或未完成的活动可能导致内核崩溃或数据损坏。

哪个命令会按名称请求以依赖感知方式移除模块?

课程已完成

你已完成 内核模块

现在,你可以在充分考虑内核级风险的前提下管理模块。

  • 使用 lsmod 查看实时状态,使用 modinfo 查看可用元数据。

  • 使用 modprobe 按别名和依赖关系加载模块。

  • 区分 modprobe 参数与启动时加载请求。

  • 将黑名单视为有限策略,而不是绝对禁止。

  • 执行 modprobe -r 前,让每个使用者停止活动。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
返回 内核