菜鸟科技网

Linux模块加载命令具体怎么用?

核心命令

insmod (Insert Module)

insmod 是最基础的命令,用于将一个指定的、完整的模块文件路径加载到内核中。

Linux模块加载命令具体怎么用?-图1
(图片来源网络,侵删)

语法:

sudo insmod /path/to/module/module.ko

特点:

  • 绝对路径:必须提供模块文件的完整绝对路径(或相对当前路径的路径)。
  • 功能单一:它只做一件事——加载指定的模块文件,它不会自动加载该模块所依赖的其他模块。
  • 手动依赖:如果模块有依赖关系,你必须手动确保所有依赖模块都已加载,否则会失败。

示例: 假设你有一个编译好的模块 my_driver.ko 位于 /home/user/my_modules/ 目录下:

# 切换到 root 用户或使用 sudo
sudo insmod /home/user/my_modules/my_driver.ko

modprobe (Module Probe)

modprobe 是一个更智能、更强大的命令,它是 insmodrmmod 的增强版,它通过模块间的依赖关系来工作。

Linux模块加载命令具体怎么用?-图2
(图片来源网络,侵删)

语法:

# 加载模块
sudo modprobe [module_name]
# 移除模块
sudo modprobe -r [module_name]

特点:

  • 模块名:你只需要提供模块的名称(不带 .ko 后缀),而不是文件路径。modprobe 会在标准的模块搜索路径中查找它。
  • 自动处理依赖:这是 modprobe 最大的优势,它会自动读取模块依赖信息(通常保存在 /lib/modules/<kernel-version>/modules.dep 文件中),并自动加载所有需要的依赖模块。
  • 配置文件支持:它会读取 /etc/modprobe.d/ 目录下的配置文件,允许你设置模块的参数、别名或阻止模块加载。
  • 推荐使用:在日常管理和脚本中,强烈推荐使用 modprobe

示例: 假设你需要加载 nvidia 驱动模块,它依赖于其他一些内核模块。

# modprobe 会自动加载 nvidia 模块及其所有依赖项
sudo modprobe nvidia

其他重要相关命令

lsmod (List Modules)

用于查看当前已加载到内核中的所有模块列表。

Linux模块加载命令具体怎么用?-图3
(图片来源网络,侵删)

语法:

lsmod

输出说明:

  • Module: 模块名。
  • Size: 模块占用的内存大小。
  • Used by: 该模块被哪些其他模块或进程使用。0 表示没有其他模块依赖它,可以被安全移除。

示例:

$ lsmod | grep nvidia
nvidia              45465856  315
nvidia_drm             69632  4 nvidia
nvidia_modeset       1296896  6 nvidia_drm,nvidia
nvidia_uvm           1232896  0 
drm_kms_helper        253952  1 nvidia_drm
drm                   616448  8 drm_kms_helper,nvidia_drm
...

这个命令常用于检查模块是否已成功加载。

rmmod (Remove Module)

用于从内核中移除一个已经加载的模块。

语法:

sudo rmmod [module_name]

特点:

  • 模块名:使用模块名,而不是文件路径。
  • 依赖检查:如果该模块正被其他模块使用(Used by 字段不为 0),rmmod 会失败,并提示“Device or resource busy”。
  • modprobe -r 的区别rmmod 是一个更底层的命令,只移除指定的模块,而 modprobe -r 在移除主模块后,会尝试移除那些不再被任何其他模块使用的依赖模块(“清理”工作)。

示例:

# 移除 my_driver 模块
sudo rmmod my_driver

实际工作流程示例

假设你想加载一个名为 my_pci_card 的虚拟网卡驱动模块。

  1. 查找模块文件 你需要知道模块文件在哪里,通常它们在 /lib/modules/$(uname -r)/kernel/drivers/ 等目录下。

    # 使用 find 查找
    find /lib/modules/$(uname -r) -name "*my_pci_card*"
    # 假设找到了 /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/my/my_pci_card.ko
  2. 检查是否已加载 在加载前,先检查一下。

    lsmod | grep my_pci_card
    # 如果没有输出,说明模块未加载
  3. 加载模块 使用 modprobe 是最佳选择。

    # 假设模块名是 my_pci_card
    sudo modprobe my_pci_card

    modprobe 找不到这个模块,你可能需要手动加载它:

    sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/my/my_pci_card.ko
  4. 验证加载 再次检查模块是否已加载,并查看内核日志(dmesg)看是否有相关信息。

    # 检查模块列表
    lsmod | grep my_pci_card
    # 应该能看到 my_pci_card 模块
    # 查看内核日志
    dmesg | tail
    # 应该能看到模块加载成功的日志,"my_pci_card: driver loaded"
  5. 移除模块 当你不再需要时,使用 modprobe -r 来移除它。

    sudo modprobe -r my_pci_card

总结对比

命令 全称 用途 特点
insmod Insert Module 加载指定的模块文件 需要完整路径,不处理依赖,功能单一。
modprobe Module Probe 加载或移除模块 推荐使用,只需模块名,自动处理依赖,支持配置。
lsmod List Modules 查看已加载模块列表 用于检查和诊断。
rmmod Remove Module 移除已加载的模块 底层命令,不处理依赖的“清理”。

配置文件 /etc/modules/etc/modprobe.d/

  • /etc/modules:这个文件可以让你在系统启动时自动加载指定的模块,每行写一个模块名。

    # /etc/modules
    my_pci_card
    8139too
  • /etc/modprobe.d/:这是一个目录,用于存放更高级的模块配置,文件名通常以 .conf 你可以在这里设置模块参数或创建别名。

    # /etc/modprobe.d/my_options.conf
    # 为 my_pci_card 模块传递参数
    options my_pci_card debug=1 tx_queue_len=1000
    # 创建一个别名,让 modprobe 可以通过另一个名字加载模块
    # alias my_card my_pci_card

重要提示:从 Linux 5.2 开始,depmod 通常会由系统包管理器(如 apt, yum)在内核更新时自动运行,你无需手动执行,它负责生成模块依赖关系文件(modules.depmodules.alias),供 modprobe 使用。

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