如何安全卸载 Linux 内核模块
卸载 Linux 内核模块是系统管理中的高级操作,通常用于调试、更新模块或释放资源。核心命令是 rmmod
和 modprobe -r
,但需严格遵循安全流程,否则可能导致系统崩溃,以下是详细步骤和注意事项:
卸载前的关键检查
-
确认模块未被占用
使用lsmod | grep 模块名
检查模块状态(lsmod | grep nvidia
)。- 输出说明:
- 第一列:模块名称
- 第二列:占用内存大小
- 第三列:被依赖计数(若 >0 则不可卸载)
- 第四列:依赖此模块的其他模块
$ lsmod | grep nvidia nvidia 3538944 42 # 此处"42"表示有42个进程/模块依赖它
- 输出说明:
-
查找依赖关系
若存在依赖项(第三列 >0),用modinfo 模块名
查看依赖此模块的组件:$ modinfo nvidia | grep depends depends: i2c-core,ipmi_msghandler,drm
-
终止相关进程
通过lsof
或fuser
查找占用模块的进程并停止:sudo lsof /dev/nvidia* # 查看使用NVIDIA显卡的进程 sudo kill -9 <进程ID> # 强制结束进程
卸载模块的两种方法
-
基础命令:
rmmod
(需 root 权限)sudo rmmod 模块名 # sudo rmmod nvidia
- 适用场景:无依赖的独立模块。
-
高级命令:
modprobe -r
(自动处理依赖)sudo modprobe -r 模块名 # sudo modprobe -r nvidia
- 优势:自动卸载依赖此模块的其他模块(按依赖树逆序操作)。
常见错误及解决方案
-
错误:
rmmod: ERROR: Module 模块名 is in use
原因:模块仍被进程占用或存在依赖。
解决:- 用
lsmod
确认依赖计数是否为 0。 - 结束相关进程(参考步骤一)。
- 若为驱动模块(如网卡),先禁用设备:
sudo ip link set eth0 down # 禁用网卡eth0
- 用
-
错误:
rmmod: ERROR: Module 模块名 not found
原因:模块名拼写错误或未加载。
解决:用lsmod
或cat /proc/modules
核对名称。
风险与注意事项
- 系统稳定性:卸载关键模块(如文件系统、硬件驱动)可能导致宕机。
- 依赖链断裂:强制卸载可能破坏依赖此模块的服务(如
sudo rmmod -f
仅限紧急情况)。 - 恢复方案:
- 重新加载模块:
sudo modprobe 模块名
- 重启系统:
sudo reboot
- 重新加载模块:
操作示例(卸载 nvidia
显卡驱动)
# 2. 结束相关进程(如Xorg、CUDA应用) sudo killall Xorg # 3. 卸载模块(自动处理依赖) sudo modprobe -r nvidia # 4. 验证卸载 lsmod | grep nvidia # 无输出即成功
卸载内核模块的核心是 “确保模块无占用” 和 “按依赖顺序操作”,优先使用 modprobe -r
可降低风险,操作前务必:
- 备份重要数据
- 在测试环境中验证
- 避免在生产环境强制卸载
引用说明参考 Linux 官方文档(kernel.org)及
man
手册(man lsmod
,man rmmod
,man modprobe
),操作需 root 权限,请谨慎执行。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9995.html