linux 如何取消加载模块
- Linux
- 2025-07-26
- 8
Linux系统中,取消加载(卸载)内核模块是一个需要谨慎操作的过程,以下是详细的步骤和相关命令说明,涵盖多种场景及注意事项:
查看已加载的模块信息
-
列出所有已加载的模块:使用lsmod命令可显示当前系统中加载的所有内核模块及其依赖关系,输出内容包括模块名称、大小以及被引用的次数等信息,例如运行lsmod | grep <关键词>能快速定位目标模块;
-
获取单个模块的详细信息:通过modinfo <模块名>可以查看指定模块的版本号、作者、路径、许可证等元数据,帮助确认是否为需要卸载的对象;
-
检查模块的使用状态:若怀疑某模块正被其他进程占用,可用sudo lsof /dev/<模块对应设备文件>查找相关进程PID,进而决定是否需要终止这些进程才能安全卸载。

基础卸载方法
-
使用rmmod命令直接卸载
- 语法:sudo rmmod <模块名>
- 这是最常用的手动卸载方式,执行后系统会尝试将该模块从内核中移除,成功时无输出;失败则提示错误原因(如被占用或存在依赖项);
- 示例:要卸载名为my_driver的模块,运行sudo rmmod my_driver;
- 限制:如果模块处于使用中状态(即有其他模块或进程依赖它),此命令将失败,此时需先解决依赖问题。
-
通过modprobe强制卸载
- 语法:sudo modprobe -r <模块名>
- 该命令相当于组合了rmmod的功能,并额外处理部分依赖关系,参数-r明确表示“移除”(remove),适用于那些难以用普通方式卸载的情况;
- 优势:相比单纯的rmmod,它能更好地解析模块间的嵌套依赖结构。
-
防止系统重启后自动重载:若要永久禁用某个模块,应在配置文件中声明黑名单,推荐路径包括:

- /etc/modprobe.d/blacklist.conf(全局通用);
- 专门为该模块创建的文件如/etc/modprobe.d/<模块名>.conf只需一行blacklist <模块名>;
- 修改后运行sudo depmod -a更新模块数据库以使更改生效;
-
验证配置变更:重启后检查dmesg日志或再次执行lsmod,确认目标模块未被加载。
-
核心模块不可随意卸载:涉及网络、存储等关键功能的内置驱动一旦移除可能导致系统崩溃,操作前务必确认其作用;
-
备份重要数据:尽管大多数情况下仅影响特定功能,但仍建议提前做好文件系统的快照;
-
权限要求:所有上述命令均需以root权限执行,普通用户可通过sudo提权;
-
调试辅助工具:遇到问题时,查阅/var/log/messages或使用dmesg查看内核消息缓冲区,获取错误堆栈信息。
-
Q:为什么执行rmmod后提示“Device or resource busy”?
A:这通常意味着有活跃进程正在使用该模块提供的功能,应先用lsof定位进程ID,再通过kill -9强制终止相关进程后方可继续卸载。
-
Q:如何确保下次启动时不再加载此模块?
A:编辑/etc/modprobe.d/blacklist.conf添加黑名单条目,或者创建独立的配置文件(如/etc/modprobe.d/my_module.conf),写入blacklist my_module,然后执行`depmod -a
处理复杂依赖与冲突场景
问题类型 解决方案 具体操作示例 模块被其他进程占用 找出并终止相关进程 sudo lsof /dev/模块名 → 记下PID → sudo kill -9 PID 存在反向依赖(其他模块依赖目标模块) 先卸载上层模块再逐级向下 根据lsmod输出的顺序,从最顶层开始依次rmmod 配置文件自动重新加载 修改黑名单配置 编辑/etc/modprobe.d/blacklist.conf,添加blacklist 模块名 持久化禁用需求 创建专属配置文件 新建/etc/modprobe.d/模块名.conf,写入install 模块名 /bin/false 高级配置与持久化管理
注意事项与风险控制
FAQs
