如果没有相关知识,我通常会认为 SATA、SCSI 和 USB 海量存储由不同的驱动程序驱动。然而在 Linux 中,SCSI 子系统驱动所有这些。
为什么 Linux 使用 SCSI 子系统来驱动与 SCSI 没有明确关系的东西?使用完全不同的驱动程序有哪些优点和缺点?为什么 NVMe 和(历史上)PATA 不支持 SCSI 子系统的一部分?
如果没有相关知识,我通常会认为 SATA、SCSI 和 USB 海量存储由不同的驱动程序驱动。然而在 Linux 中,SCSI 子系统驱动所有这些。
为什么 Linux 使用 SCSI 子系统来驱动与 SCSI 没有明确关系的东西?使用完全不同的驱动程序有哪些优点和缺点?为什么 NVMe 和(历史上)PATA 不支持 SCSI 子系统的一部分?
嗯,USB 海量存储实际上就是SCSI ;它使用实际的 SCSI 命令集,只是通过另一种传输方式。(如果您的磁盘支持 UAS,即“USB 连接 SCSI”,则更是如此,但它同样适用于基本 BOT 存储设备。)这意味着,是的,您的外部 USB-SATA 磁盘盒正在转换命令ATA 和 SCSI 之间(使用特殊的“ATA passthrough”命令进行 SMART 访问等操作)。
(如果您曾经拥有过 FireWire HDD 或 iPod,那么这些都是 SBP-2 设备,也就是 SCSI。这是一个非常通用的命令集。)
SATA 支持通过 SCSI 进行,因为在 SATA 推出时,现有的 Linux PATA 子系统(可以追溯到 Linux 的早期)与强大的 SCSI 子系统相比有点垃圾,而且 SATA 在某种程度上已经更接近于 SCSI因此,将 AHCI 视为一种奇怪的 SCSI 控制器可能比将其视为一种奇怪的 PATA 控制器提供更好的性能。
(事实上,在 Windows 获得本机 AHCI 支持之前,当时甚至许多 Windows 系统都有供应商 SATA 驱动程序,将 SATA AHCI 控制器呈现为 SCSI 控制器,例如 Windows XP 知道 SCSI,但不知道 AHCI。)
此支持使用由负责 SCSI 的 T10 工作组制作的官方SCSI 到 ATA 转换文档,并且显然大多数(如果不是全部)都有 1:1 转换,因此我认为这并不像看上去那样是一种黑客攻击。 。尽管如此,当时这似乎被认为是一个临时解决方案,计划为 SATA 设备制作一个新的 Linux 子系统,但这从未发生;我猜“libata”(翻译层)的效果比预期的要好。
(最后一点,所有 ATA CD/DVD 驱动器都使用“ATAPI”协议,即 ATA 数据包内的 SCSI。同样,即使在 Windows 上,您也会看到几乎所有 CD/DVD 刻录软件列表 CD/DVD驱动器就好像它们是 SCSI 设备一样,因为从某种意义上来说它们就是。)
PATA 支持是其中的一部分。多年来,甚至 PATA 磁盘也通过“libata”SCSI-ATA 转换显示为
/dev/sd*
设备,而不是实际的 PATA/dev/hd*
设备。近几个月来,“旧版”PATA 驱动程序已从 Linux 中完全删除,但它们已经很长时间没有使用了。至于 NVMe,我认为它与 T10 邮件列表消息中提到的有关 SATA 的内容相同,其中一个单独的子系统首先是最终目标......并且考虑到 NVMe 被设计为 ATA 的后继者几十年后, SCSI 和 NVMe可能存在太多差异而无法实用,例如,与 SCSI 的设计目的相比,NVMe 允许的极深队列。
也就是说,libata 运行良好是因为 PATA/SATA 是 SCSI 功能的子集,而 NVMe 则更像是一个超集。
(NVMe 子系统最初确实有类似的 SCSI 转换,但最终被删除;提交消息声称部分原因是两者之间存在显着差异。)
SCSI 接口指南对此进行了解释 :
解释是,SCSI 子系统用于掌握跨各种总线的通用 SCSI 协议,因此主要不是控制 SCSI 设备。
有关 SCSI 接口的更多详细信息可以在上面的文章中找到。系统总体结构描述为:
正是底层驱动程序使 SCSI 子系统能够与多种类型的总线和设备连接。
PATA 现已过时,SATA 是大多数消费级存储设备的标准。NVMe 用于提高性能,特别是对于 SSD。SCSI 仍然用于专门的企业环境,以实现兼容性及其高级功能。