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

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

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

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

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

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

rmmod 是“硬拔”——它只检查模块自身的引用计数(used by 列),一旦发现非零(比如有进程正打开该模块创建的设备节点、或另一个模块在 module_depen

ds 中声明了它),就拒绝卸载,报错 ERROR: Module xxx is in use。而 modprobe -r 会反向遍历整个依赖图,先卸载所有依赖当前模块的“子模块”,再清理目标模块,避免卡死。

  • 强制卸载(rmmod -f)极危险:若模块正在处理中断或持有自旋锁,可能引发 Kernel panic,尤其在生产环境应绝对避免
  • 卸载前务必确认无活跃使用:lsmod | grep ^xxxused by 是否为 0;lsof /dev/xxxfind /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 --propertydmesg -w
  • 若需开机自动加载,在 /etc/modules 中追加模块名(一行一个),比写 modprobe/etc/rc.local 更规范,且支持 systemdinitrd 阶段
  • 禁用某个模块自动加载(如屏蔽 nouveau):在 /etc/modprobe.d/blacklist.conf 中写 blacklist nouveau,再运行 sudo depmod -a
模块加载卸载看着只是几条命令,实际是内核符号解析、内存映射、依赖拓扑维护、用户空间协同的一整套机制。最容易被忽略的是:模块的“加载成功”和“功能可用”之间,隔着硬件 probe、设备注册、用户态服务配合三道关卡——别只盯着 lsmod 的输出。


# linux  # usb  # nvidia  # ai  # 配置文件  # 网卡驱动  # 为什么  # red  # NULL  # format  # Error  # 递归  # Property  # symbol  # 事件  # 加载  # 不代表  # 自动加载  # 而非  # 会报  # 的是  # 热插拔  # 看着  # 在这里 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中新建站点并配置端口与物理路径?  如何登录建站主机?访问步骤全解析  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何用5美元大硬盘VPS安全高效搭建个人网站?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  开心动漫网站制作软件下载,十分开心动画为何停播?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  jquery插件bootstrapValidator表单验证详解  JS实现鼠标移上去显示图片或微信二维码  jQuery 常见小例汇总  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何在橙子建站中快速调整背景颜色?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何快速搭建高效简练网站?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel如何创建自定义Facades?(详细步骤)  如何在Tomcat中配置并部署网站项目?  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何使用Service Container和依赖注入?(代码示例)  怎么用AI帮你设计一套个性化的手机App图标?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  实例解析angularjs的filter过滤器  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel如何使用Collections进行数据处理?(实用方法示例)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何用VPS主机快速搭建个人网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何选择可靠的免备案建站服务器?  千库网官网入口推荐 千库网设计创意平台入口  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  晋江文学城电脑版官网 晋江文学城网页版直接进入  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  微信小程序 wx.uploadFile无法上传解决办法  大型企业网站制作流程,做网站需要注册公司吗?  如何彻底卸载建站之星软件?  如何批量查询域名的建站时间记录?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  浅析上传头像示例及其注意事项  详解jQuery中基本的动画方法  如何在建站之星绑定自定义域名?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何处理表单验证?(Requests代码示例)  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程