USB 本身不直接执行 SCSI 命令,但 USB 存储设备(如 U 盘、移动硬盘)内部通常使用 SCSI 协议来管理其闪存或磁盘。

它们之间通过一个叫做 “USB 大容量存储类” (USB Mass Storage Class, UMSC) 的标准桥接起来。
两个独立的概念:USB 和 SCSI
我们需要明白它们是两种不同层面的技术:
USB (Universal Serial Bus - 通用串行总线)
- 是什么:一种外设总线标准,它定义了物理接口(Type-A, Type-C 等)、电气信号、数据传输方式和通信协议。
- 作用:为计算机和外部设备(如键盘、鼠标、打印机、U 盘、摄像头)提供一个标准化的连接通道。
- 视角:它像一个“公路系统”,负责把数据包(货物)从源头(CPU/内存)运送到目的地(设备)或反之,它关心的是“如何运输”,而不是“运输的是什么”。
SCSI (Small Computer System Interface - 小型计算机系统接口)
- 是什么:一种设备级命令集和协议标准,它定义了如何与存储设备(如硬盘、光驱、磁带机)进行通信,告诉设备要执行什么操作,如“读取扇区 100-200 的数据”或“写入数据到扇区 300”。
- 作用:为存储设备提供一套标准化的指令集。
- 视角:它像一个“订单和语言”,它规定了你给设备下什么指令(命令),以及设备如何响应,它关心的是“要做什么操作”。
桥接者:USB 大容量存储类 (UMSC)
既然 USB 只管运输,SCSI 只管命令,U 盘(一种 USB 设备)是如何理解 SCSI 命令的呢?
答案就是 USB Mass Storage Class (UMSC) 协议。

你可以把 UMSC 想象成一个“翻译官”,它位于 USB 协议和 SCSI 协议之间。
工作流程如下:
- 操作系统 (如 Windows, macOS, Linux) 想要对 U 盘进行操作,比如拷贝一个文件。
- 操作系统并不直接和 USB 通信,而是通过通用存储驱动程序(如
disk.sys在 Windows 中)发出SCSI 命令,它会发出一个“读取逻辑块地址 512 处的 512 字节数据”的 SCSI Read (10) 命令。 - 这个 SCSI 命令被打包成一个 Command Block Wrapper (CBW) 数据包。
- 这个 CBW 数据包通过 USB 总线发送到 U 盘,USB 只是把 CBW 当作一个普通的“数据包”来运输。
- U 盘内部的主控芯片(一个微控制器 MCU)运行着固件,这个固件实现了 UMSC 协议。
- UMSC 协议在 U 盘端扮演“逆向翻译官”的角色,它接收到 CBW 数据包后,从中解包出原始的 SCSI 命令。
- U 盘主控芯片执行这个 SCSI 命令,它会根据命令中的地址和长度,从内部的闪存芯片中读取数据。
- 读取完成后,U 盘将数据打包成一个 Command Status Wrapper (CSW) 数据包(包含数据和执行状态),再通过 USB 总线发送回计算机。
- 计算机端的 USB 驱动程序接收到 CSW,UMSC 协议从中解包出数据,并将最终结果返回给操作系统。
常见的 SCSI 命令示例
即使你是在使用一个 U 盘,当你进行文件操作时,底层的存储设备实际上也在执行这些经典的 SCSI 命令:
- READ (6) / READ (10) / READ (16):读取指定逻辑块地址的数据,这是最常用的命令之一。
READ(10)可以访问高达 2TB 的空间(2^28个扇区),而READ(16)则支持更大容量。 - WRITE (6) / WRITE (10) / WRITE (16):向指定逻辑块地址写入数据。
- TEST UNIT READY:检查设备是否已准备好接收命令,通常在初始化或超时后使用。
- INQUIRY:请求设备的基本信息,如厂商、产品型号、序列号等,操作系统在识别设备时会用到这个命令。
- MODE SENSE / MODE SELECT:获取或设置设备的操作参数,如写入缓存是否启用、磁盘扇区大小等。
- READ CAPACITY:获取设备总容量信息,如逻辑块大小和总块数,这是操作系统确定磁盘大小的关键命令。
- START STOP UNIT:启动或停止设备(关闭硬盘的电机)。
- PREVENT ALLOW MEDIUM REMOVAL:锁定或解锁可移除介质(对于 U 盘,这通常表现为“安全弹出”功能的前置步骤)。
USB 大容量存储类的变体
虽然 SCSI 是最经典的底层协议,但 UMSC 协议也支持其他几种设备级命令集,以适应不同类型的存储介质:
- Transparent SCSI Command Set (最常见):如上所述,直接桥接 SCSI 命令,适用于大多数 U 盘、SD 读卡器、移动硬盘。
- RBC (Reduced Block Commands):精简版的块命令集,主要用于光驱和磁带机等。
- 0 (ATA Command Set):直接桥接 ATA 命令(也就是我们常说的 IDE/PATA 硬盘的命令),一些早期的移动硬盘盒或直接使用笔记本硬盘的设备会使用这个。
- QIC-157:主要用于磁带机。
当你插入一个 USB 存储设备时,系统会通过 INQUIRY 命令来确定它使用的是哪种命令集,然后加载相应的驱动程序。
如何查看和调试这些命令?(高级内容)
如果你是开发者或高级用户,可以使用工具来观察这些底层的 SCSI 命令:
- Linux:
sg3_utils工具集:sg_raw可以手动发送原始 SCSI 命令。sg_inq可以执行INQUIRY命令。dmesg或journalctl:可以查看内核识别和与设备通信时的日志信息。
- Windows:
- WinUSB 或 libusb 配合工具:可以使用
usbhid-dump等工具来观察 USB 流量,但直接观察 SCSI 命令比较复杂。 - OSR Driver 提供的 USB 分析工具:可以深入分析 USB 通信,包括 UMSC 的 CBW/CSW 包。
- WinUSB 或 libusb 配合工具:可以使用
- macOS:
system_profiler SPCIDataType:可以列出已连接的 SCSI 设备及其信息。iostat -x:可以观察磁盘 I/O 统计信息。
| 特性 | USB (通用串行总线) | SCSI (小型计算机系统接口) |
|---|---|---|
| 层级 | 总线/传输层 | 命令/协议层 |
| 作用 | 定义物理连接和数据如何传输 | 定义与存储设备如何通信的指令集 |
| 关系 | USB 是公路,SCSI 是语言,两者通过 USB 大容量存储类 (UMSC) 协议桥接。 | |
| 命令 | 无,只有数据包传输、控制传输、中断传输等。 | 有丰富的命令集,如 READ, WRITE, INQUIRY 等。 |
| 设备 | U 盘、键盘、鼠标等所有 USB 设备。 | 硬盘、光驱、磁带机等存储设备。 |
USB 提供了通往 U 盘的“路”,而 SCSI 是路上跑的“车”所使用的“交通规则和语言”,当你在电脑上操作 U 盘时,实际上是在通过 USB 这条路,用 SCSI 这套语言在和 U 盘内部的控制器对话。
