Linux命令-rmmod(卸载内核模块 —— 安全移除已加载的内核驱动)

Linux命令-rmmod(卸载内核模块 —— 安全移除已加载的内核驱动) Linux命令-rmmod卸载内核模块 —— 安全移除已加载的内核驱动 简介内核模块的层次关系安装位置 语法⚙️ 选项 示例示例 1基本卸载 —— 安全移除模块示例 2处理模块依赖 —— 级联卸载示例 3查看并解决模块被进程占用示例 4详细模式卸载示例 5强制卸载危险操作示例 6实际场景 —— 网络驱动热替换示例 7处理常见的卸载失败场景⚠️ 注意rmmod vs modprobe -r 对比各发行版差异安全卸载检查清单 总结 相关命令快速参考rmmod用于从正在运行的 Linux 内核中卸载移除已加载的内核模块驱动。它是modprobe -r的底层工具不会自动处理模块依赖关系。在执行卸载前必须确认目标模块没有被其他模块或进程使用否则卸载会失败。强制卸载-f可能导致系统不稳定甚至内核崩溃。 简介Linux 内核采用模块化设计允许在系统运行时动态加载和卸载功能模块。rmmod是实现模块卸载功能的基础命令之一直接通过系统调用delete_module与内核交互。内核模块的层次关系# 查看当前已加载的所有内核模块lsmod|head-20# 输出示例# Module Size Used by# e1000 155648 0# e1000e 253952 0# i915 3112960 5# drm_kms_helper 237568 1 i915# drm 610304 5 drm_kms_helper,i915# nf_conntrack 163840 5 nf_nat,nf_conntrack_netlink,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_ipv4Used by列显示了依赖关系 —— 模块被卸载前其所有使用者必须先卸载。安装位置# rmmod 命令本身的路径whichrmmod# 输出/usr/sbin/rmmod# 内核模块存放路径不同发行版略不同ls/lib/modules/$(uname-r)/kernel/drivers/net/ethernet/intel/e1000/# 输出e1000.ko.xz (CentOS 8)# 输出e1000.ko (CentOS 7) 语法rmmod [选项] 模块名...模块名要卸载的模块名称不含.ko后缀不区分是否已压缩⚙️ 选项选项长选项说明-f--force强制卸载危险仅在 CONFIG_MODULE_FORCE_UNLOAD 启用时有效-w--wait等待模块变为可卸载状态模块不再被使用后自动卸载-s--syslog将错误信息输出到系统日志而非标准错误-v--verbose显示详细的卸载过程信息⚠️重要提示-f强制卸载是一个极端操作可能造成内核状态不一致。只有在内核编译时启用了CONFIG_MODULE_FORCE_UNLOAD选项时该参数才有效。强制卸载一个正在被使用的模块很可能导致系统崩溃。 示例示例 1基本卸载 —— 安全移除模块# 1. 先确认模块状态lsmod|grepe1000# 输出# e1000 155648 0# ^^^容量 ^^^使用计数0表示未被使用# 2. 安全卸载Used by 0sudormmod e1000# 3. 验证卸载结果lsmod|grepe1000# 无输出 卸载成功示例 2处理模块依赖 —— 级联卸载# 查看模块依赖关系lsmod|grep-EModule|drm# 输出# Module Size Used by# drm_kms_helper 237568 1 i915# drm 610304 5 drm_kms_helper,i915# 直接卸载 drm 模块会失败因为有依赖者sudormmod drm# 输出rmmod: ERROR: Module drm is in use by: drm_kms_helper i915# 正确做法按依赖顺序卸载# 先卸载最上层模块再卸载底层模块sudormmod i915# 先卸载使用者sudormmod drm_kms_helper# 再卸载中间层sudormmod drm# 最后卸载底层模块# 更简单的做法使用 modprobe -r自动处理依赖sudomodprobe-rdrm# 自动级联卸载所有依赖模块示例 3查看并解决模块被进程占用# 查看模块使用状态lsmod|grepe1000e# 输出# e1000e 253952 0# ^^ 使用计数为0但可能仍有进程使用# 使用 lsof 查找使用该模块设备的进程sudolsof|grep-E/dev/|e1000# 输出示例# dhclient 1234 root 5u IPv4 56789 0t0 UDP *:bootpc# 先停止相关进程sudokill1234# 停止 dhclient# 关闭网络接口sudoiplinkseteth0 down# 关闭网卡接口# 现在可以卸载模块sudormmod e1000e# 如果需要重新加载sudomodprobe e1000e# 重新加载模块sudoiplinkseteth0 up# 重新启用网卡示例 4详细模式卸载# 使用 -v 查看详细输出sudormmod-ve1000# 输出# rmmod: removing module e1000# 使用 -s 将错误输出到系统日志sudormmod-se1000# 无标准输出错误信息写入 /var/log/messagestail-5/var/log/messages# 输出示例# Jun 14 14:35:22 server01 kernel: e1000: removed successfully示例 5强制卸载危险操作# 查看内核编译配置grepMODULE_FORCE /boot/config-$(uname-r)# 输出CONFIG_MODULE_FORCE_UNLOADy 或 # CONFIG_MODULE_FORCE_UNLOAD is not set# 仅在 CONFIG_MODULE_FORCE_UNLOADy 时以下命令才有效# ⚠️ 警告强制卸载可能导致# - 内核 panic# - 数据丢失# - 系统崩溃# 强制卸载非安全区域且后果自负sudormmod-fe1000# 输出成功时# rmmod: force-removing module e1000# 系统日志中可见# kernel: e1000: module has been force-unloaded示例 6实际场景 —— 网络驱动热替换# 场景需要升级网卡驱动先卸载旧的再加载新的# 1. 查看当前网卡使用的驱动ethtool-ieth0# 输出# driver: e1000e# version: 3.2.6-k# firmware-version: 1.0-0# 2. 停止网络接口sudoiplinkseteth0 down# 3. 卸载旧驱动sudormmod e1000e# 可能失败需要先处理依赖lsmod|grepe1000e# 输出# e1000e 253952 1 ptp# 依赖ptp模块使用了e1000e# 4. 卸载依赖模块sudormmod ptpsudormmod e1000e# 5. 安装新驱动假设在 /tmp/new_e1000/ 下cd/tmp/new_e1000sudomakeinstallsudomodprobe e1000e# 6. 启用网络接口并验证sudoiplinkseteth0 upethtool-ieth0# 输出# driver: e1000e# version: 3.8.4 # 版本已更新# firmware-version: 1.2-1示例 7处理常见的卸载失败场景# 场景1模块正在被其他模块使用sudormmod nf_conntrack# 输出rmmod: ERROR: Module nf_conntrack is in use by:# xt_conntrack nf_nat nf_conntrack_netlink# 解决方案1卸载所有使用者sudormmod xt_conntrack nf_nat nf_conntrack_netlink nf_conntrack# 或使用 modprobe -r 一次性处理sudomodprobe-rnf_conntrack# 场景2模块编译到内核中内置模块sudormmod ext4# 输出rmmod: ERROR: Module ext4 is not currently loaded# 这说明 ext4 是内置模块编译进内核不是可加载模块# 验证cat/boot/config-$(uname-r)|grepCONFIG_EXT4_FS# 输出CONFIG_EXT4_FSy # y 表示内置m 表示模块⚠️ 注意rmmod vs modprobe -r 对比# rmmod底层工具# - 直接操作单个模块# - 不处理依赖关系# - 需要手动按顺序卸载# - 完整控制每一步操作# modprobe -r高层工具# - 自动分析并处理依赖# - 智能卸载整个依赖树# - 同时清理 /etc/modprobe.d/ 中的配置# - 推荐日常使用# 对比演示# rmmod 方式手工4步sudormmod i915sudormmod drm_kms_helpersudormmod drm# 需要确保顺序正确# modprobe -r 方式一步完成sudomodprobe-ri915# 自动卸载 i915、drm_kms_helper、drm各发行版差异# CentOS/RHEL 7模块后缀 .kols/lib/modules/$(uname-r)/kernel/drivers/net/ethernet/intel/e1000/# 输出e1000.ko# CentOS/RHEL 8模块压缩为 .ko.xzls/lib/modules/$(uname-r)/kernel/drivers/net/ethernet/intel/e1000/# 输出e1000.ko.xz# Ubuntu/Debian通常使用 .ko 格式ls/lib/modules/$(uname-r)/kernel/drivers/net/ethernet/intel/e1000/# 输出e1000.ko# 注意无论模块文件是什么后缀rmmod 只用模块名称不含后缀sudormmod e1000# 正确sudormmod e1000.ko# 错误rmmod: ERROR: Module e1000.ko not found安全卸载检查清单# 卸载模块前请按以下步骤检查# 1. 检查模块使用计数lsmod|grep模块名|awk{print 使用计数:, $4}# 2. 查看是否有进程在使用sudofuser/dev/设备文件2/dev/null# 3. 检查依赖关系lsmod|grep模块名|awk{print 被使用者:, $4}# 4. 确认不是关键系统模块# 如 ahciSATA控制器、nvmeNVMe磁盘、# xhci_hcdUSB控制器等不能随意卸载# 5. 检查内核配置是否为内置模块grepCONFIG_$(echo模块名|tr[:lower:][:upper:])/boot/config-$(uname-r) 总结rmmod是 Linux 内核模块管理的底层工具精要如下核心功能从运行中的内核移除可加载模块依赖处理不自动处理依赖需手动按顺序卸载推荐使用modprobe -r自动处理安全原则卸载前必须检查Used by计数、停止相关进程、关闭相关设备危险操作-f强制卸载可能导致系统崩溃仅在测试环境且明确后果时使用日常推荐使用modprobe -r替代rmmod前者能安全地处理依赖关系 相关命令命令说明lsmod列出所有已加载的内核模块modprobe推荐替代智能加载/卸载模块并处理依赖insmod加载单个模块底层工具不处理依赖modinfo查看模块详细信息路径、描述、参数、依赖depmod生成模块依赖关系数据库dmesg查看内核日志模块加载/卸载记录lspci -k查看 PCI 设备及其使用的驱动模块