最稳妥的usb存储屏蔽方式是在/etc/modprobe.d/中同时blacklist并install usb-storage和uas为/bin/false,以彻底阻止内核加载;需用dmesg验证无scsi/uas日志、lsblk无新块设备,且支持按vid:pid白名单或临时软链解禁。

直接阻止模块加载:/etc/modprobe.d/ 里写死规则
最常用也最稳妥的方式,是让内核在尝试加载 usb-storage 时直接失败,而不是等它加载后再卸载。这避免了短暂的设备可见窗口,也防止普通用户用 sudo modprobe usb-storage 手动绕过。
操作步骤如下:
- 创建或编辑配置文件:
sudo nano /etc/modprobe.d/disable-usb-storage.conf - 写入两行(必须都加,缺一不可):
blacklist usb-storageinstall usb-storage /bin/false - 保存后无需重启,但需运行
sudo rmmod usb-storage uas清掉当前已加载的实例(若存在)
blacklist 只影响 modprobe 的自动依赖解析,不拦手动加载;install 行才是关键——它把加载动作替换成执行 /bin/false,必然失败且无副作用。
为什么还要禁用 uas 模块?
很多现代移动硬盘默认走 uas 协议(USB Attached SCSI),它和 usb-storage 是并行的两条驱动路径。只封 usb-storage,设备仍可能通过 uas 成功挂载,尤其在麒麟、统信等国产系统上更常见。
所以实际屏蔽必须覆盖两者:
blacklist uasinstall uas /bin/false
注意:uas 依赖 usb-storage 的部分符号(如 usb_stor_suspend),因此两个模块要一起拉黑,否则 modprobe uas 可能因找不到符号而报错,但错误本身不影响屏蔽效果。
验证是否真生效:别只看 lsmod
lsmod | grep -E 'usb-storage|uas' 为空,不代表万事大吉。真正要确认的是“插入设备后内核是否完全跳过初始化”。
实操验证方法:
- 插上U盘或移动硬盘,立即执行:
dmesg | tail -20 - 如果看到
usb 1-1: new high-speed USB device但**没有**后续的scsi hostX: uas或usb-storage相关日志,说明模块没加载成功 - 再执行
lsblk,确认输出中**完全没有**类似sdb、sdc这样的USB块设备节点
只要 lsblk 不出现新设备,就代表屏蔽成功。dmesg 里有 USB 枚举日志是正常的——那是 USB 总线层的事,跟存储驱动无关。
永久生效但不锁死:留一条应急通道
生产环境里,完全封死 USB 存储可能带来运维风险(比如紧急恢复需插盘)。可以在禁用规则基础上,加一个临时放行机制:
- 在
/etc/modprobe.d/disable-usb-storage.conf末尾加一行:options usb-storage ignore_device=1234:5678(把1234:5678换成你信任设备的 vendor:product ID,用lsusb查) - 这样只有该特定设备能绕过屏蔽,其他一律拦截
- 或者更简单:保留
/bin/false规则,但把/bin/false临时软链到/bin/true,即可全局解禁(需 root 权限)
真正难的不是写几行配置,而是确认设备枚举后内核有没有走到存储驱动那一层——这个边界点,很多人卡在 dmesg 日志里漏看一行 “usb-storage: probe of 1-1:1.0 failed with error -19”,就以为失败了,其实那正是屏蔽生效的证据。











