菜鸟科技网

Linux module命令如何查看和管理内核模块?

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

Linux module命令如何查看和管理内核模块?-图1
(图片来源网络,侵删)

Linux 模块的基本概念

Linux 内核模块是编译后的目标文件(通常为 .ko 扩展名),可以在运行时动态加载到内核中或从内核中卸载,模块的主要优势包括:

  1. 灵活性:无需重启系统即可添加或移除功能。
  2. 模块化设计:内核功能按需加载,减少内存占用。
  3. 开发便捷:模块开发和测试无需完整内核编译流程。

模块的核心文件位于 /lib/modules/$(uname -r)/ 目录下,包含模块源码编译后的 .ko 文件以及模块依赖关系文件 modules.depmodules.order

模块管理命令

modprobe 命令

modprobe 是最常用的模块管理工具,位于 /sbin/modprobe,属于 module-init-toolskmod 包,它会自动处理模块依赖关系,并支持配置文件(/etc/modprobe.d/)中的选项。

常用选项

Linux module命令如何查看和管理内核模块?-图2
(图片来源网络,侵删)
  • -r--remove:卸载模块(同时处理依赖)。
  • -c--showconfig:显示当前模块配置。
  • -C--config:指定配置文件路径。
  • -v--verbose:显示详细操作信息。

示例

# 加载模块(自动解决依赖)
sudo modprobe vfat
# 卸载模块
sudo modprobe -r vfat
# 显示模块配置
modprobe -c | grep vfat

insmodrmmod 命令

  • 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 显示模块的元信息,如作者、许可证、描述、参数等。

Linux module命令如何查看和管理内核模块?-图3
(图片来源网络,侵删)
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.depmodules.order),通常在内核更新后执行。

sudo depmod -a

模块参数与配置

模块可以通过参数调整行为,参数传递方式有两种:

  1. 命令行参数
    sudo modprobe module_name param=value
  2. 配置文件:在 /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

常见问题与解决方案

  1. 模块加载失败

    • 检查模块文件是否存在:ls /lib/modules/$(uname -r)/module.ko
    • 查看内核日志:dmesg | tail
    • 检查依赖是否满足:modprobe --show-depends module_name
  2. 模块参数无效

    • 使用 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"

模块安全注意事项

  1. 来源可信:仅加载来自官方仓库或可信来源的模块。
  2. 最小权限:避免以 root 身份运行非必要的模块操作。
  3. 签名验证:启用内核模块签名(如 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: 可以通过以下步骤排查:

  1. 检查内核日志:dmesg | tail -n 20,寻找与模块相关的错误信息(如符号未定义、版本不匹配)。
  2. 使用 modprobe --show-depends module_name 检查依赖是否满足。
  3. 确认模块文件路径正确,且与当前内核版本匹配(通过 uname -rmodinfo 验证)。

Q2: 如何永久禁用某个模块的自动加载?
A2: 在 /etc/modprobe.d/ 目录下创建配置文件(如 disable_module.conf),添加以下内容:

blacklist module_name

禁用 nouveau 显卡驱动:

blacklist nouveau

然后更新 initramfs(如 sudo update-initramfs -u)并重启,如果模块仍被加载,检查是否有其他配置文件或启动参数引用了该模块。

分享:
扫描分享到社交APP
上一篇
下一篇