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 会先确保 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_depen 中声明了它),就拒绝卸载,报错 
ERROR: Module xxx is in use。而 modprobe -r 会反向遍历整个依赖图,先卸载所有依赖当前模块的“子模块”,再清理目标模块,避免卡死。
- 强制卸载(
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
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主题设置教程

