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

Linux内核模块的加载与卸载不是简单执行一条命令就完事,关键在于理解依赖关系、使用场景和验证方式。用对工具、看对日志,才能避免“看似加载成功,实则未初始化”或“卸载失败却硬来导致系统卡死”这类问题。
查看已加载模块及依赖状态
运行 lsmod 可列出所有当前在内存中的模块,但重点要看三列:
- Module:模块名(不含.ko后缀)
- Size:模块占用内存大小
- Used by:该模块被哪些其他模块或进程引用;若显示数字(如 5)或模块名(如 i915),说明它正被使用,不能直接卸载
进一步确认占用来源,可用:
lsof /dev/xxx(查设备节点占用)
find /sys -name "*模块名*" 2>/dev/null(查 sysfs 中的关联路径)
cat /sys/module/模块名/refcnt(直接读取引用计数)
加载模块:优先用 modprobe,慎用 insmod
modprobe 模块名 是常规首选,它会自动完成以下动作:
- 从 /lib/modules/$(uname -r)/kernel/ 下搜索模块文件
- 读取 /lib/modules/$(uname -r)/modules.dep,递归加载所有前置依赖(如加载 uas 前先确保 usbcore 和 scsi_mod 已就位)
- 应用 /etc/modprobe.d/*.conf 中定义的 alias、options 或 install 指令(例如预设参数或黑名单)
而 insmod /path/to/module.ko 仅适合调试孤立模块,它不查路径、不处理依赖、不读配置——直接执行大概率报 Unknown symbol in module 错误。
带参数加载示例:
sudo modprobe igb InterruptThrottleRate=3000
比手写完整路径加参数更可靠,因为能触发配置文件中预设的校验逻辑。
卸载模块:用 modprobe -r,别碰 rmmod -f
modprobe -r 模块名 是安全卸载的核心手段:
- 反向遍历依赖图,先卸载所有“依赖于目标模块”的子模块(如卸载 i915 前自动卸载 drm_kms_helper)
- 支持 --dry-run 预演:sudo modprobe -r --dry-run 模块名,提前看到将被移除的模块列表
rmmod 模块名 是底层命令,只检查本模块的引用计数,一旦 Used by ≠ 0 就拒绝,报错 Module xxx is in use。
rmmod -f(强制卸载)极危险:若模块正持有自旋锁、处理中断或有未释放资源,可能引发 Kernel panic,生产环境严禁使用。
验证是否真正生效:盯紧 dmesg,别只信 lsmod
lsmod 显示模块名 ≠ 模块已初始化成功。真正可靠的判断依据是内核日志:
- 加载后立即执行:dmesg | tail -20,查找 my_module:、init、error、fail 等关键字
- 模块 init 函数中调用的 printk() 会出现在日志末尾;probe 失败、内存分配失败等错误也在此暴露
- 卸载后同样查 dmesg,确认 exit 函数是否执行完毕,有无资源泄漏警告(如 device not unregistered)
加载前还可运行 modinfo 模块名.ko,检查 vermagic 字段是否匹配当前内核版本(uname -r),提前规避兼容性问题。



















