当前位置: 首页 > news >正文

Linux内核与设备管理:USB存储驱动usb_storage/uas的安全卸载与复原

Linux内核与设备管理:USB存储驱动usb_storage/uas的安全卸载与复原

Linux内核模块安全卸载与复原的十步法

摘要

在Linux系统中,想要安全地卸载并重新加载USB存储驱动,必须先解除文件系统与进程占用,再按依赖关系逆序卸载模块,最后按需恢复加载。本文给出可直接执行的一步一命令实操清单,采用“箭头注释”逐字符解释每条命令,覆盖usb_storage与其依赖uas的处理策略,并以真实场景举例说明判读与排错方法,附流程图与术语表以便系统性理解。

一、前置知识与名词解释

内核模块是可按需装载的功能单元,USB存储链路常由uasusb_storage协作完成。为避免含糊,先统一术语。

名称全称与缩写(首次出现按规范)简要说明
通用串行总线(Universal Serial Bus, USB)USB外设总线标准,常见于U盘、移动硬盘等
小型计算机系统接口(Small Computer System Interface, SCSI)SCSI通用存储访问协议栈概念
USB附加SCSI(USB Attached SCSI, UAS)UAS走SCSI命令集的USB高效传输协议,Linux内核以uas模块实现
USB存储类驱动usb_storage传统USB大容量存储驱动,部分设备在无UAS时退回使用
动态可加载内核模块(Loadable Kernel Module, LKM)LKM通过modprobe/lsmod管理的内核功能单元
挂载点(Mountpoint)文件系统在目录树中的挂载位置
设备断电/解绑通过udisksctl power-offeject/sys写接口让内核不再使用设备

结论先行:处理顺序应为“解除占用→卸载依赖者uas→卸载被依赖者usb_storage→按需恢复加载

二、环境假设与操作目标

你当前的机器状态(来自实际输出)说明如下:

lsmod | grep usb_storage
# 输出:usb_storage            66636  1 uas
lsblk -o NAME,TRAN,MOUNTPOINT
# 输出未见 TRAN=usb 且挂载点非空的分区

结论先行:usb_storage已被uas占用且没有USB分区挂载。目标是安全卸载uasusb_storage,并在需要时恢复。

三、流程总览与关键路径

flowchart LRA[确认模块与占用\nlsmod|grep] --> B[确认挂载点\nlsblk -o ...]B --> C{有挂载?}C -- 是 --> D[umount 分区\nsync]C -- 否 --> E[检查进程占用\nfuser -vm]D --> F[设备断电/解绑\nudisksctl / eject / sysfs delete]E --> FF --> G[先卸载 uas\nmodprobe -r uas]G --> H[再卸载 usb_storage\nmodprobe -r usb_storage]H --> I{需要恢复?}I -- 是 --> J[modprobe usb_storage]I -- 否 --> K[保持卸载状态]

结论先行:无论是否挂载,卸载顺序始终是“先uasusb_storage,否则会提示 in use

四、一步一命令的标准清单(逐字符箭头注释)

说明在前:下面是通用“十步法”的完整清单,每条命令都可单独复制执行。若你的现场“没有挂载且usb_storageuas占用”,请优先看第五章“最短路径实操”。

一、1.1 查看模块加载情况与占用关系

在任何操作前,先确定模块与占用链路,避免盲目卸载。

lsmod | grep usb_storage
# └─┬─┘   └──┬──┘ └──────────┘
#  lsmod     |        usb_storage:要查找的模块名
#            └─ 管道,把 lsmod 的输出交给 grep
# 作用:查看 usb_storage 是否加载、Used by 是否被 uas 占用

一、1.2 列出块设备、传输方式与挂载点

用以判定是否需要先卸载文件系统。

lsblk -o NAME,TRAN,MOUNTPOINT
# └──┬──┘ └─┬─┘ └──────────┘
#  命令    -o    指定输出列
#  NAME/TRAN/MOUNTPOINT:设备名/传输方式/挂载点
# 作用:定位 TRAN=usb 且 MOUNTPOINT 非空的分区

二、2.1 卸载文件系统分区(示例:/dev/sdb1)

若上一步发现已挂载,这一步必须先做。

sudo umount /dev/sdb1
# └──┬┘ └──┬──┘ └─────┘
#  sudo  umount  设备文件
# 以 root 权限卸载,使内核停止使用该分区

二、2.2 同步缓存,降低风险

在移除硬件或卸载模块前,确保缓冲写入磁盘。

sync
# 单词 sync:把内存中未写入磁盘的数据写回磁盘

二、2.3 检查并清理占用进程(可选但常用)

避免因进程占用导致umount失败或模块 in use。

sudo fuser -vm /dev/sdb1
# └──┬┘ └──┬┘ └┬┘ └──────┘
#  sudo fuser -v  -m   目标(分区或挂载点)
# -v:verbose 详细输出
# -m:把参数当作挂载点处理
# 作用:查看有哪些进程仍在占用

若需要强制清理:

sudo fuser -km /dev/sdb1
# └──┬┘ └──┬┘ └┬┘ └──────┘
#  sudo fuser -k  -m   目标
# -k:kill 杀掉占用进程
# -m:挂载点语义

三、3.1 让设备断电或从内核解绑(三选一)

只需任选其一,目的都是让内核彻底不再使用该设备。

sudo udisksctl power-off -b /dev/sdb
# └──┬┘ └──────────────┬─────────┘ └──┬──┘
#  sudo     udisksctl  power-off     -b   /dev/sdb
# 提权      工具名       断电动作    block设备  目标整盘

或:

sudo eject /dev/sdb
# └──┬┘ └──┬┘ └─────┘
#  sudo eject  设备
# 作用:弹出/解绑该块设备

或(最底层方式):

echo 1 | sudo tee /sys/block/sdb/device/delete
# └─┬─┘   └──┬┘ └──┬──┘ └──────────────┘
#  echo 1   管道  sudo  tee   目标文件
# 把“1”写入 delete,通知内核删除 sdb 这个设备

四、4.1 再次确认占用关系(可选)

确认Used by是否归零。

lsmod | grep usb_storage
# 作用:检查 usb_storage 是否仍被其它模块占用

四、4.2 卸载依赖者模块uas

必须先卸载占用者uas,否则usb_storage会 in use

sudo modprobe -r uas
# └──┬──┘ └──────┬──────┘ └─┘
#  sudo  modprobe    -r    uas
#  提权  模块管理   remove 卸载模块  模块名:USB Attached SCSI

四、4.3 卸载usb_storage

此时不应再报 in use。

sudo modprobe -r usb_storage
# └──┬──┘ └──────┬──────┘ └──────────┘
#  sudo  modprobe    -r      usb_storage
#  提权  模块管理   卸载      模块名(USB存储驱动)

五、5.1 按需恢复加载usb_storage

如果你需要恢复USB存储功能,重新加载即可。

sudo modprobe usb_storage
# └──┬──┘ └──────┬──────┘ └──────────┘
#  sudo  modprobe          usb_storage
#  提权  加载模块          模块名

五、5.2 验证加载成功

确认模块已回到内核。

lsmod | grep usb_storage
# 看到 usb_storage 再次出现在列表中即为成功

解释在后:上面的清单把“解除文件系统占用→解绑/断电→卸载依赖者uas→卸载usb_storage→按需恢复”拆成独立、互不合并的命令,任何一步失败都可针对性排查,不会把问题混在一起。

四、1.3 常用命令与作用速查表

命令关键参数作用典型失败原因
lsmod`grep 模块名`查看模块是否加载、被谁占用
lsblk-o NAME,TRAN,MOUNTPOINT查设备传输方式与挂载点
umount设备或挂载点卸载文件系统仍被进程占用
fuser-vm/-km查看或杀占用进程执行环境无psmisc
udisksctlpower-off -b /dev/sdX逻辑断电桌面环境缺失时不可用
eject设备名解绑/弹出设备设备忙
tee/sys/block/.../delete内核层删除设备路径写错
modprobe-r 模块名卸载模块被依赖 in use
modprobe模块名加载模块设备不匹配

五、案例演示:当前状态下的“最短路径实操”

场景复述:usb_storage ... 1 uas 且没有USB分区挂载。结论先行:直接卸载uas再卸载usb_storage即可

二、1.1 卸载占用者模块uas

sudo modprobe -r uas
# └──┬──┘ └──────┬──────┘ └─┘
#  sudo  modprobe    -r    uas
#  提权  模块管理    卸载   模块名

二、1.2 确认uas已卸载

lsmod | grep uas
# 无输出则说明 uas 不在了

二、1.3 卸载usb_storage

sudo modprobe -r usb_storage
# └──┬──┘ └──────┬──────┘ └──────────┘
#  sudo  modprobe    -r      usb_storage

二、1.4 需要恢复时只加载usb_storage

sudo modprobe usb_storage
# └──┬──┘ └──────┬──────┘ └──────────┘
#  提权  加载模块          模块名

解释在后:该“最短路径”省略了卸载分区与断电步骤,因为你现场没有挂载点;若未来插入U盘自动挂载,务必先umount后再做模块操作。

六、扩展与排错:自动加载、强制卸载与三种解绑方式差异

结论先行:不要用强制卸载rmmod -f,更不要在生产环境里图快

三、1.1 三种解绑方式对比

方法层级优点注意点
udisksctl power-off -b /dev/sdX桌面服务层逻辑断电,温和安全依赖udisks2
eject /dev/sdX工具层简单直观有时仅逻辑弹出,未必断电
echo 1 > /sys/block/sdX/device/delete内核/sysfs最底层,效果直接必须确认路径准确,误删风险高

三、1.2 防止UAS自动加载(可选)

部分老U盘在UAS下表现不稳定,可临时禁用UAS回退到usb_storage

echo "blacklist uas" | sudo tee /etc/modprobe.d/disable-uas.conf
# └──┬──┘ └──────────┬──────────┘ └──────────────┘
#  echo 文本   管道       sudo  tee      目标配置文件
# 写入一行:blacklist uas,用于阻止内核自动加载 uas

更新initramfs(部分发行版需要):

sudo update-initramfs -u
# └──┬──┘ └──────────┬──┘
#  sudo   update-initramfs  -u
# 以 root 权限更新 initramfs,使黑名单在早期启动生效

恢复UAS自动加载:

sudo rm /etc/modprobe.d/disable-uas.conf
# └──┬┘ └──────────┬──────────┘
#  sudo      rm      配置文件
# 删除黑名单文件,允许 uas 再次自动加载

三、1.3 常见报错与对策

  • modprobe: FATAL: Module usb_storage is in use
    先卸载uas或其它依赖者,再卸载usb_storage。若仍失败,检查是否有挂载或进程占用。
  • umount: target is busy
    fuser -vm找出进程并fuser -km清理,或确认是否在该目录中工作导致“自占用”。

七、结论或总结

安全地卸载并恢复USB存储驱动的关键在于“先解除占用,再按依赖逆序卸载,最后按需恢复加载”。在实务中,占用者通常是uas,被占用者是usb_storage,顺序错误将直接导致 in use。结合流程图、一步一命令与箭头注释,配合fuserlsblk的判读,你可以在任何发行版上稳定复现该流程并快速定位问题根因。

http://www.dtcms.com/a/441791.html

相关文章:

  • fallocate: fallocate failed: Text file busy
  • visio实现扇形图绘制的方式方法-以三等分扇形为例
  • 以太坊私有链搭建与智能合约部署指南
  • 网站开发 教学大纲网页设计图片与图片的位置
  • python+flask_socketio+pyautogui实现简易远程桌面功能
  • flask_socketio+pyautogui实现的具有加密传输功能的极简远程桌面
  • 深入了解linux网络—— TCP网络通信(上)
  • Android Jetpack 核心组件实战:ViewModel + LiveData + DataBinding 详解
  • 商务厅网站建设意见怎么做网站注册推广
  • Fragment 崩溃恢复后出现重叠问题的复现方式
  • 设计模式(C++)详解——策略模式(2)
  • 使客户能够大规模交付生产就绪的人工智能代理
  • Layui 前端和 PHP 后端的大视频分片上传方案
  • 无状态HTTP的“记忆”方案:Spring Boot中CookieSession全栈实战
  • Java 内存模型(JMM)面试清单(含超通俗生活案例与深度理解)
  • 2015网站建设专业建网站设计公司
  • vue+springboot项目部署到服务器
  • QT肝8天17--优化用户管理
  • QT肝8天19--Windows程序部署
  • 【开题答辩过程】以《基于 Spring Boot 的宠物应急救援系统设计与实现》为例,不会开题答辩的可以进来看看
  • 成都seo网站建设沈阳网站建设推广服务
  • 网站栏目名短链接在线生成官网免费
  • Task Schemas: 基于前沿认知的复杂推理任务架构
  • 第三十七章 ESP32S3 SPI_SDCARD 实验
  • 企业营销型网站特点企业信息查询系统官网山东省
  • docker-compose 安装MySQL8.0.39
  • Go语言入门(18)-指针(上)
  • Django ORM - 聚合查询
  • 【STM32项目开源】基于STM32的智能老人拐杖
  • YOLO入门教程(番外):卷积神经网络—汇聚层