讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux 内核模块是如何加载与卸载的

轻枫同学_5886

轻枫同学_5886

发布时间:2026-01-26 19:51:09

|

899人浏览过

|

来源于php中文网

原创

应优先使用modprobe而非insmod,因其能自动处理依赖、搜索路径、别名和配置;卸载时modprobe -r比rmmod更安全,可递归卸载依赖模块;验证需结合dmesg日志而非仅lsmod。

linux 内核模块是如何加载与卸载的

加载模块:用 insmod 还是 modprobe?关键看依赖

直接加载一个孤立的 .ko 文件,insmod 能行;但绝大多数真实场景(比如网卡驱动、USB 子系统)都存在依赖链,这时必须用 modprobe。它会自动读取 /lib/modules/$(uname -r)/modules.dep,递归加载所有前置模块——比如加载 uas(USB Attached SCSI)前,modprobe 会先确保 usbcore 和 scsi_mod 已就位,而 insmod uas.ko 会直接报 Unknown symbol in module。

  • insmod 只认绝对路径,不查模块搜索路径,也不能处理别名(alias)或参数配置
  • modprobe 从 /lib/modules/$(uname -r)/kernel/ 开始找,支持 /etc/modprobe.d/*.conf 中定义的 alias、options、install 指令
  • 加载带参数的模块:sudo modprobe igb InterruptThrottleRate=3000 比 sudo insmod /lib/modules/.../igb.ko InterruptThrottleRate=3000 更可靠,因为前者能触发配置文件中预设的校验逻辑

卸载模块:为什么 rmmod 常失败,而 modprobe -r 更安全

rmmod 是“硬拔”——它只检查模块自身的引用计数(used by 列),一旦发现非零(比如有进程正打开该模块创建的设备节点、或另一个模块在 module_depends 中声明了它),就拒绝卸载,报错 ERROR: Module xxx is in use。而 modprobe -r 会反向遍历整个依赖图,先卸载所有依赖当前模块的“子模块”,再清理目标模块,避免卡死。

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 强制卸载(rmmod -f)极危险:若模块正在处理中断或持有自旋锁,可能引发 Kernel panic,尤其在生产环境应绝对避免
  • 卸载前务必确认无活跃使用:lsmod | grep ^xxx 看 used by 是否为 0;lsof /dev/xxx 或 find /sys -name "*xxx*" 2>/dev/null 可辅助排查隐式占用
  • 某些模块(如 nvidia)被 X Server 或容器运行时锁定,需先停服务再卸载

验证与调试:光看 lsmod 不够,得盯住内核日志

lsmod 只告诉你模块“在列表里”,不代表初始化成功;真正可靠的判断依据是 dmesg 输出。模块的 init 函数里调用的 printk() 会出现在日志末尾,而错误(如内存分配失败、硬件 probe 失败)也会在这里暴露。

  • 加载后立即执行:dmesg | tail -20,查找 my_module: 或 error/fail 关键字
  • 卸载后同样查 dmesg,确认 exit 函数是否执行完毕,有没有资源泄漏警告(如 “device not unregistered”)
  • modinfo my_module.ko 必须在加载前运行,它能提前暴露兼容性问题:比如 vermagic: 字段与当前 uname -r 不符,modprobe 会静默跳过,但 insmod 会报 Invalid module format

自动加载机制:硬件插入时谁在背后调用 modprobe?

不是内核直接执行命令,而是通过 udev 事件驱动。当 USB 设备接入,内核生成 add@/devices/... 事件,udev 根据 /lib/udev/rules.d/80-drivers.rules 匹配 DRIVER=="?*",最终执行 modprobe $env{DRIVER}。这意味着:手动 modprobe 成功,不代表热插拔一定生效——规则文件缺失、udev 服务未运行、或模块未列入 modules.builtin 都会导致静默失败。

  • 测试热插拔行为,不要只插拔硬件,要同时监控:udevadm monitor --subsystem-match=pci --property 和 dmesg -w
  • 若需开机自动加载,在 /etc/modules 中追加模块名(一行一个),比写 modprobe 到 /etc/rc.local 更规范,且支持 systemd 的 initrd 阶段
  • 禁用某个模块自动加载(如屏蔽 nouveau):在 /etc/modprobe.d/blacklist.conf 中写 blacklist nouveau,再运行 sudo depmod -a
模块加载卸载看着只是几条命令,实际是内核符号解析、内存映射、依赖拓扑维护、用户空间协同的一整套机制。最容易被忽略的是:模块的“加载成功”和“功能可用”之间,隔着硬件 probe、设备注册、用户态服务配合三道关卡——别只盯着 lsmod 的输出。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

989

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3000

2023.10.25

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4170

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3533

2023.06.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn