Linux 模块(Linux Module)是 Linux 内核的一种动态加载机制,允许在不需要重新编译内核的情况下扩展内核功能,模块通常用于驱动程序、文件系统、网络协议栈等功能,其加载、卸载和管理通过 modprobe、insmod、rmmod 等命令实现,以下是关于 Linux 模块及相关命令的详细说明。

Linux 模块的基本概念
Linux 内核模块是编译后的目标文件(通常为 .ko 扩展名),可以在运行时动态加载到内核中或从内核中卸载,模块的主要优势包括:
- 灵活性:无需重启系统即可添加或移除功能。
- 模块化设计:内核功能按需加载,减少内存占用。
- 开发便捷:模块开发和测试无需完整内核编译流程。
模块的核心文件位于 /lib/modules/$(uname -r)/ 目录下,包含模块源码编译后的 .ko 文件以及模块依赖关系文件 modules.dep 和 modules.order。
模块管理命令
modprobe 命令
modprobe 是最常用的模块管理工具,位于 /sbin/modprobe,属于 module-init-tools 或 kmod 包,它会自动处理模块依赖关系,并支持配置文件(/etc/modprobe.d/)中的选项。
常用选项:

-r或--remove:卸载模块(同时处理依赖)。-c或--showconfig:显示当前模块配置。-C或--config:指定配置文件路径。-v或--verbose:显示详细操作信息。
示例:
# 加载模块(自动解决依赖) sudo modprobe vfat # 卸载模块 sudo modprobe -r vfat # 显示模块配置 modprobe -c | grep vfat
insmod 和 rmmod 命令
insmod:位于/sbin/insmod,用于加载单个模块,但不处理依赖关系,需手动确保依赖模块已加载。sudo insmod /path/to/module.ko
rmmod:位于/sbin/rmmod,用于卸载模块,但不会自动处理依赖。sudo rmmod module_name
lsmod 命令
lsmod 列出当前已加载的模块及其信息(依赖关系、内存占用等),它实际上读取 /proc/modules 文件。
lsmod
输出示例:
Module Size Used by
vfat 17408 0
fat 61440 1 vfat
modinfo 命令
modinfo 显示模块的元信息,如作者、许可证、描述、参数等。

modinfo vfat
输出示例:
filename: /lib/modules/5.4.0-42-generic/kernel/fs/fat/vfat.ko
license: GPL
author: Gordon Goff <ggoff@hpe.com>
description: VFAT filesystem support
...
depmod 命令
depmod 扫描 /lib/modules/$(uname -r)/ 下的所有模块,生成模块依赖关系文件(modules.dep 和 modules.order),通常在内核更新后执行。
sudo depmod -a
模块参数与配置
模块可以通过参数调整行为,参数传递方式有两种:
- 命令行参数:
sudo modprobe module_name param=value
- 配置文件:在
/etc/modprobe.d/下创建配置文件(如my_module.conf):options module_name param=value
模块加载顺序与依赖管理
模块依赖关系由 modprobe 自动处理,加载 vfat 模块前会先加载 fat 模块,依赖关系通过 modules.dep 文件定义:
/lib/modules/5.4.0-42-generic/kernel/fs/fat/vfat.ko: /lib/modules/5.4.0-42-generic/kernel/fs/fat/fat.ko
常见问题与解决方案
-
模块加载失败:
- 检查模块文件是否存在:
ls /lib/modules/$(uname -r)/module.ko。 - 查看内核日志:
dmesg | tail。 - 检查依赖是否满足:
modprobe --show-depends module_name。
- 检查模块文件是否存在:
-
模块参数无效:
- 使用
modinfo查看支持的参数:modinfo module_name | grep "parm:"。 - 确保参数名称和值正确,避免拼写错误。
- 使用
模块开发基础
模块开发需包含以下核心元素:
- 模块初始化函数:
module_init(init_function)。 - 模块清理函数:
module_exit(exit_function)。 - 模块许可证:
MODULE_LICENSE("GPL")(否则会触发内核警告)。 - 头文件:
#include <linux/module.h>和#include <linux/kernel.h>。
示例模块代码(hello.c):
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void) {
printk(KERN_INFO "Hello, world!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
编译命令:
gcc -c -fno-stack-protector hello.c -o hello.o ld -r hello.o -o hello.ko
模块与内核版本兼容性
模块与内核版本必须匹配,可通过以下方式检查:
- 内核版本:
uname -r。 - 模块编译时的内核版本:
modinfo hello.ko | grep "vermagic"。
模块安全注意事项
- 来源可信:仅加载来自官方仓库或可信来源的模块。
- 最小权限:避免以
root身份运行非必要的模块操作。 - 签名验证:启用内核模块签名(如
CONFIG_MODULE_SIG_FORCE)。
| 命令 | 功能 | 示例 |
|---|---|---|
modprobe |
加载/卸载模块(处理依赖) | sudo modprobe vfat |
insmod |
加载单个模块 | sudo insmod /path/to/module.ko |
rmmod |
卸载单个模块 | sudo rmmod module_name |
lsmod |
列出已加载模块 | lsmod |
modinfo |
显示模块元信息 | modinfo vfat |
depmod |
生成模块依赖关系 | sudo depmod -a |
相关问答FAQs
Q1: 如何查看模块加载失败的具体原因?
A1: 可以通过以下步骤排查:
- 检查内核日志:
dmesg | tail -n 20,寻找与模块相关的错误信息(如符号未定义、版本不匹配)。 - 使用
modprobe --show-depends module_name检查依赖是否满足。 - 确认模块文件路径正确,且与当前内核版本匹配(通过
uname -r和modinfo验证)。
Q2: 如何永久禁用某个模块的自动加载?
A2: 在 /etc/modprobe.d/ 目录下创建配置文件(如 disable_module.conf),添加以下内容:
blacklist module_name
禁用 nouveau 显卡驱动:
blacklist nouveau
然后更新 initramfs(如 sudo update-initramfs -u)并重启,如果模块仍被加载,检查是否有其他配置文件或启动参数引用了该模块。
