Linux rmmod命令详解

rmmod命令用于从Linux内核中卸载已加载的内核模块,是内核模块管理的重要工具之一。

命令简介

rmmod 是Linux系统中用于卸载(移除)内核模块的命令。它与insmodmodprobe等命令一起构成了Linux内核模块管理系统。rmmod命令直接从运行中的内核中移除指定的模块,前提是该模块没有被其他模块或进程使用。

命令语法

rmmod [选项] 模块名 [模块参数]

选项说明

选项 说明
-f, --force 强制卸载模块,即使模块正在被使用(危险操作)
-s, --syslog 将错误信息输出到系统日志而不是标准错误输出
-v, --verbose 显示详细操作信息
-V, --version 显示命令版本信息
-h, --help 显示帮助信息

常用操作示例

示例1:卸载指定内核模块

卸载一个未使用的内核模块:

sudo rmmod usb_storage

卸载USB存储驱动模块,前提是该模块没有被任何设备使用。

示例2:查看详细卸载过程

sudo rmmod -v usb_storage

显示详细的模块卸载过程信息。

示例3:强制卸载模块

强制卸载正在使用的模块(危险操作):

sudo rmmod -f usb_storage
警告:强制卸载模块可能导致系统不稳定或崩溃,仅在明确知道后果的情况下使用。

示例4:将错误信息输出到系统日志

sudo rmmod -s usb_storage

错误信息将记录到系统日志(如/var/log/syslog)而不是终端。

示例5:卸载多个模块

依次卸载多个模块:

sudo rmmod module1 module2 module3

按顺序卸载module1、module2、module3。

内核模块管理流程

内核模块管理常用操作序列:

  1. 查看已加载模块:lsmod
  2. 查看模块信息:modinfo 模块名
  3. 加载模块:insmod 模块路径modprobe 模块名
  4. 卸载模块:rmmod 模块名
  5. 查看模块依赖关系:modprobe --show-depends 模块名
  6. 查看内核日志:dmesg | tail -20

与modprobe -r的区别

特性 rmmod modprobe -r
依赖处理 仅卸载指定模块,不处理依赖 自动卸载依赖模块(如果不再需要)
模块路径 需要内核中已加载的模块名 使用模块名称,自动查找
配置文件 不使用配置文件 读取/etc/modprobe.d/配置文件
黑名单 不受黑名单影响 尊重黑名单设置
推荐程度 基础操作,手动管理 高级操作,推荐使用

常用内核模块

模块名称 功能描述 典型卸载场景
usb_storage USB存储设备支持 USB设备全部移除后
uvcvideo USB视频类设备驱动 所有USB摄像头移除后
nvidia NVIDIA显卡驱动 更换显卡或驱动前
btusb 蓝牙USB设备驱动 蓝牙设备全部移除后
joydev 游戏手柄设备驱动 游戏手柄移除后
lp 并口打印机驱动 并口打印机移除后

工作原理

rmmod命令的工作流程:

  1. 检查模块是否存在于已加载模块列表(通过/proc/modules
  2. 验证模块是否正在被其他模块或进程使用
  3. 调用内核的delete_module系统调用
  4. 内核执行模块的module_exit函数(如果存在)
  5. 释放模块占用的内存和其他资源
  6. 从内核模块列表中移除该模块
  7. 更新相关系统状态信息

内核模块状态:

  • LIVE:模块已加载且正在使用
  • COMING:模块正在初始化
  • GOING:模块正在卸载
  • UNFORMED:模块尚未完全初始化

注意事项

重要提示:
  1. 需要root权限:卸载内核模块需要超级用户权限
  2. 模块使用检查:如果模块正在被使用,rmmod会失败
  3. 系统依赖模块:不要卸载系统必需的核心模块(如文件系统驱动)
  4. 强制卸载风险-f选项可能导致系统不稳定或数据丢失
  5. 模块依赖关系:卸载模块时,依赖该模块的其他模块可能会失效
  6. 内核版本匹配:卸载模块通常不需要但加载时需要考虑版本兼容性
  7. 恢复方法:卸载错误时,可以重新加载模块或重启系统
实用技巧
  • 查看模块使用计数:lsmod | grep 模块名(第二列显示使用计数)
  • 查看哪些进程正在使用模块:lsof | grep 模块名
  • 安全卸载模块(推荐):sudo modprobe -r 模块名
  • 查看内核日志了解模块操作:dmesg | tail -10
  • 在脚本中检查操作结果:if sudo rmmod module; then echo "成功"; else echo "失败"; fi
  • 备份当前模块配置:lsmod > lsmod_backup.txt
  • 卸载所有未使用模块:sudo modprobe -r --dry-run $(lsmod | awk 'NR>1 && $3==0 {print $1}')

故障排除

常见问题及解决方法:
  1. "Module XXX is in use":模块正在被使用,先停止相关服务或设备:sudo lsof | grep 模块名
  2. "Permission denied":需要使用sudo或切换到root用户
  3. "Module XXX not found":模块未加载或名称错误,检查:lsmod | grep 模块名
  4. "Resource temporarily unavailable":系统忙,稍后重试或重启相关进程
  5. "Invalid module format":模块与当前内核版本不兼容(卸载时较少出现)
  6. 系统不稳定:卸载了系统必需模块,重启系统恢复
  7. 设备停止工作:卸载了硬件驱动模块,重新加载或重启系统

安全操作指南

安全卸载内核模块的建议流程:
  1. 确认模块信息:modinfo 模块名lsmod | grep 模块名
  2. 检查模块依赖:modprobe --show-depends 模块名
  3. 停止使用该模块的服务或设备
  4. 尝试使用推荐命令:sudo modprobe -r 模块名
  5. 如果失败,检查使用情况:sudo lsof | grep 模块名
  6. 必要时使用rmmodsudo rmmod 模块名
  7. 验证卸载结果:lsmod | grep 模块名dmesg | tail -5
  8. 记录操作信息以便恢复

相关命令

相关命令 说明
lsmod 列出当前加载的内核模块
insmod 加载内核模块到运行中的内核
modprobe 智能加载/卸载内核模块,处理依赖关系
modinfo 显示内核模块信息
depmod 生成模块依赖关系文件
dmesg 显示内核环形缓冲区消息