![有人知道为什么旧款 USB 驱动器盒有 2TB 的大小限制吗?](https://linux22.com/image/1371481/%E6%9C%89%E4%BA%BA%E7%9F%A5%E9%81%93%E4%B8%BA%E4%BB%80%E4%B9%88%E6%97%A7%E6%AC%BE%20USB%20%E9%A9%B1%E5%8A%A8%E5%99%A8%E7%9B%92%E6%9C%89%202TB%20%E7%9A%84%E5%A4%A7%E5%B0%8F%E9%99%90%E5%88%B6%E5%90%97%EF%BC%9F.png)
我最近将自制的外置硬盘从 1TB 升级到了 3TB。升级过程中,我发现它的桥接板不支持大于 2TB 的硬盘。我不得不买一个更新的外壳来支持这个硬盘。
有谁知道为什么这是真的吗?
从 SATA 接口的角度来看,应该没有问题。LBA-28 识别块系统施加了 128GiB 的限制(假设通常为 512 字节块),但十多年来这一直不是一个严重的问题。从那时起,所有东西(包括所有 SATA 设备)都支持 LBA-48,最高可达 128PiB,因此应该很容易支持 3TB。
我知道 MBR 分区表存在 2TB 限制的问题,但这不应该影响 SATA-USB 桥接芯片,因为它(或应该)只是在两种协议之间转换磁盘块。
我认为这可能只是芯片制造商偷懒的一个例子,他们使用 32 位整数来处理真正需要支持 48 位值的应用程序。事情真的这么简单吗(在我看来,这是不可原谅的)还是我忽略了其他什么?
只是好奇,但我还无法通过谷歌从任何地方找到答案。
答案1
好的,30 分钟后,我开始回答自己的问题。我一直在寻找原因,我想我找到了。这不是支持 48 位块地址的 ATA 规范。实际上是 USB 规范。
根据维基百科 (http://en.wikipedia.org/wiki/USB_mass_storage_device_class#Device_access)USB 大容量存储类实现了 SCSI 透明命令集。查看各种 SCSI 读取命令(https://www.seagate.com/files/staticfiles/support/docs/manual/Interface%20manuals/100293068j.pdf,第 3.15 至 3.19 节)我看到该命令有几个不同的版本:
- READ(6) 使用 21 位块地址,对具有 512 字节块的设备施加 1 GiB 的限制。
- READ(10) 和 READ(12) 使用 32 位块地址,对具有 512 字节块的设备施加 2 TiB 的限制。
- READ(16) 和 READ(32) 使用 64 位块地址,施加 8 ZiB 限制(8 GB)。
至此,我认为答案已经很清楚了。最初的芯片没有实现 64 位地址调用,认为这样做没有意义。然后,当 3TB 驱动器面世时,它们得到了增强,以支持 64 位地址调用。