菜鸟科技网

Linux加载模块命令有哪些?

核心命令

modprobe (推荐使用)

modprobe 是加载模块的首选命令,它比 insmod 更智能、更安全,因为它会自动处理模块的依赖关系。

Linux加载模块命令有哪些?-图1
(图片来源网络,侵删)

工作原理: modprobe 会读取 /lib/modules/<kernel-version>/modules.dep/lib/modules/<kernel-version>/modules.dep.bin 文件(这些文件记录了模块间的依赖关系),当你加载一个模块时,它会自动加载所有其依赖的模块。

基本语法:

sudo modprobe [选项] <模块名>

常用选项:

  • -v--verbose: 显示详细的加载过程信息。
  • -r--remove: 卸载模块(及其依赖,如果不再被其他模块使用)。
  • -c--showconfig: 显示模块的当前配置参数。
  • -C <文件>--config <文件>: 指定一个自定义的配置文件,而不是默认的 /etc/modprobe.d/ 下的文件。
  • --first: 强制将指定的模块插入到依赖模块列表的开头。
  • --force: 强制加载一个版本不匹配或有问题的模块(不推荐,可能导致系统不稳定)。

示例:

Linux加载模块命令有哪些?-图2
(图片来源网络,侵删)
  • 加载 nfs 模块:

    sudo modprobe nfs

    nfs 模块依赖其他模块(如 lockd),modprobe 会自动加载它们。

  • 详细加载 vfat 模块:

    sudo modprobe -v vfat

    你会看到类似 MODPROBE vfatINSMOD /lib/modules/.../vfat.ko 的输出。

  • 卸载 nfs 模块:

    sudo modprobe -r nfs

    nfs 被卸载后,其依赖模块(如 lockd)不再被任何其他模块使用,modprobe 也会自动卸载它们。


insmod

insmod 是一个更底层的命令,它只加载指定的单个模块不会处理任何依赖关系,如果缺少依赖模块,加载会失败。

基本语法:

sudo insmod <模块文件的完整路径>

特点:

  • 不处理依赖:这是它与 modprobe 最大的区别。
  • 需要完整路径:你必须提供模块在文件系统中的绝对路径,通常是 /lib/modules/<kernel-version>/ 下的 .ko 文件。
  • 不常用:在绝大多数情况下,都应该使用 modprobe,只有在需要精确控制加载过程或处理非常特殊的模块时才使用 insmod

示例: 假设你要加载的 vfat.ko 文件位于 /lib/modules/5.15.0-52-generic/kernel/fs/fat/vfat.ko

sudo insmod /lib/modules/5.15.0-52-generic/kernel/fs/fat/vfat.ko

vfat 依赖 fat 模块,但 fat 模块没有被加载,这个命令就会失败。


辅助命令

为了管理和查看模块状态,还需要以下几个常用命令:

lsmod

lsmod 用于列出当前已经加载到内核中的所有模块,它实际上是读取 /proc/modules 文件。

语法:

lsmod

输出解释:

  • Module: 模块名。
  • Size: 模块占用的内存大小。
  • Used by: 使用该模块的模块数量或进程ID,如果为 0,表示没有其他模块依赖它,可以被安全卸载。

示例:

$ lsmod | grep nvidia
nvidia              54538240  515
nvidia_uvm          1224960  1 nvidia
nvidia_drm          77824  3 nvidia
drm_kms_helper       299008  1 nvidia_drm
...

这表示 nvidia 模块已加载,并被 515 个其他实体使用。

rmmod

rmmod 用于从内核中卸载一个模块,它只卸载指定的模块,不会处理依赖关系,如果其他模块正在使用它,卸载会失败。

语法:

sudo rmmod <模块名>

示例:

sudo rmmod my_custom_module

特性 modprobe insmod
依赖处理 自动处理依赖关系 不处理依赖关系
模块路径 只需模块名,无需路径 必须提供模块的完整路径
主要用途 日常模块加载/卸载,推荐使用 特殊场景,精确控制,不常用
卸载模块 modprobe -r <module> rmmod <module>

实际操作流程

假设你有一个新的硬件(比如一个特殊的网卡),需要加载它的驱动模块。

  1. 找到模块文件: 驱动通常由硬件厂商提供,会包含一个 .ko 文件,假设你把它放到了 /home/user/my_driver/my_driver.ko

  2. 查看当前模块状态

    lsmod | grep my_driver  # 确认模块未加载
  3. 加载模块首选方法 (推荐): 将 .ko 文件复制到系统模块目录,然后使用 modprobe

    sudo cp /home/user/my_driver/my_driver.ko /lib/modules/$(uname -r)/kernel/drivers/net/
    sudo depmod -a  # 更新模块依赖关系数据库,这一步很重要!
    sudo modprobe my_driver

    直接加载方法 (不推荐,除非你知道你在做什么):

    sudo insmod /home/user/my_driver/my_driver.ko
  4. 验证模块是否加载成功

    lsmod | grep my_driver  # 应该能看到模块信息
    dmesg | tail          # 查看系统日志,看是否有模块加载成功的消息
  5. 卸载模块

    sudo modprobe -r my_driver
    # 或者
    # sudo rmmod my_driver

重要提示

  • 权限:加载和卸载模块都需要超级用户权限,因此通常需要使用 sudo
  • 内核版本:模块是为特定的内核版本编译的,如果升级了内核,旧的模块可能无法使用,需要重新编译。
  • depmod:当你手动添加或移动了 .ko 文件后,必须运行 sudo depmod -a 来更新 modules.dep 文件,否则 modprobe 可能无法找到正确的依赖关系。
分享:
扫描分享到社交APP
上一篇
下一篇