smartctl 读 SATA 盘的 SMART,靠的是 ATA pass-through(0x85/0xA1) 这条命令穿过 USB 桥接芯片转发给硬盘。但各家桥接芯片(JMicron / ASMedia / Realtek / Sunplus / Cypress…)对这条命令的封装方式互不兼容,甚至是私有的。
Windows 上 CrystalDiskInfo / HDDScan 这类工具内置了十几家桥接芯片的私有适配表(按 VID:PID 硬编码),所以常见硬盘盒都能读。
Linux 上 smartctl 同样有这张表(drivedb.h / 内部 USB 表),但表里没收录的 VID:PID 就直接报错,且不会自己“猜”
在 Linux 中
硬盘(ATA) ←→ 桥接芯片 ←→ USB ←→ SCSI 层 ←→ sd 驱动 ←→ /dev/sda
直接接上的硬盘,smartctl 看到的直接是 ATA 设备,自动识别,不用写 -d。
NVMe:看 /dev/nvme0 自动识别。
对于 USB硬盘盒,smartctl 看到的只是 SCSI 设备,它不知道桥接芯片底下是什么、用什么翻译方式,所以需要手动指定。不然会报报 Unknown USB bridge,我这次遇到的用的是-d sat
sat:SCSI to ATA Translation 的缩写,是一个 ANSI T10 标准。
| 写法 | 含义 | 适用场景 |
|---|---|---|
-d ata |
原生 ATA 协议 | 直连 SATA 硬盘(/dev/sda) |
-d scsi |
只走 SCSI 层 | 硬盘盒默认行为,读不到 ATA SMART |
-d sat |
标准 SCSI→ATA 翻译(SAT) | 支持透传的 USB 硬盘盒 |
-d sat,12 |
SAT,强制 12 字节 ATA PASS-THROUGH(0xA1) | 桥接只认 12 字节命令时 |
-d sat,16 |
SAT,强制 16 字节 ATA PASS-THROUGH(0x85) | 桥接只认 16 字节命令时 |
-d usbjmicron |
JMicron 私有桥接协议 | JMicron JMS 系列硬盘盒 |
-d usbjmicron,x |
JMicron 私有协议 + 指定端口 | 双盘位 JMS 硬盘盒 |
-d usbcypress |
Cypress 私有桥接协议 | Cypress AT2LP 等芯片 |
-d usbsunplus |
Sunplus 私有桥接协议 | Sunplus 芯片硬盘盒 |
-d usbasm1352r |
ASMedia ASM1352R 协议 | ASMedia ASM1352R 硬盘盒 |
-d jmb39x |
JMicron JMB39x RAID 模式 | JMicron JMB39x 双盘盒 |
-d sntjmicron |
JMicron 另一组私有协议 | 部分 JMS 硬盘盒 |
-d nvme |
NVMe 协议 | 直连 NVMe SSD(/dev/nvme0) |
-d sat,VID:PID |
按 USB 厂商号:产品号直接指定 | 型号表未收录的桥接 |