rmmod命令用于卸载已加载且使用计数为0的内核模块,需先用lsmod确认模块存在且未被占用,再执行sudo rmmod模块名;若失败可尝试modprobe -r递归卸载,最后通过dmesg和/sys/module验证是否彻底移除。

直接用 rmmod 模块名 即可卸载。所谓“正在运行中但未被占用”,指模块已加载(出现在 lsmod 列表里),且使用计数(Used 列)为 0 —— 这正是 rmmod 成功执行的必要条件。
确认模块状态再操作
卸载前必须验证两点:是否已加载、是否无引用。
- 运行
lsmod | grep 模块名,确认模块在列表中,且第二列(Used)显示为 0 - 若该列数值大于 0,说明有其他模块或内核子系统正依赖它,不能直接卸载
- 也可检查
/sys/module/模块名/refcnt,内容为0才表示真正空闲
基础卸载命令
满足空闲条件后,执行标准卸载:
-
sudo rmmod 模块名—— 最常用方式,无输出即成功 -
sudo rmmod -v 模块名—— 加-v可看到模块退出函数执行、内存释放等过程,便于确认流程完整 - 卸载后再次运行
lsmod | grep 模块名,应无任何输出
遇到“in use”却显示 Used=0?试试 modprobe -r
有些模块虽 Used 为 0,但因隐式依赖(如通过 sysfs 或 proc 接口被间接引用)仍被内核判定不可卸载。此时 rmmod 会报错“Module is in use”,而 modprobe -r 更智能:
-
sudo modprobe -r 模块名—— 它会递归检查依赖链,若目标模块无活跃依赖,会自动触发卸载 - 加
--dry-run参数可预览影响:sudo modprobe -r --dry-run 模块名 - 比
rmmod -f安全,不绕过内核校验逻辑
卸载后验证是否生效
仅靠 lsmod 不足,还需确认资源已释放:
- 运行
dmesg | tail -10,查看最后几行是否有 “unregistering”、“exiting” 或 “removed” 类日志 - 检查对应设备节点是否消失(如
/dev/xxx)、网络接口是否移除(如ip link中不见相关虚拟设备) - 若模块提供 sysfs 接口(如
/sys/module/模块名/),该目录应已不存在


















