为什么Linux SCSI子系统驱动硬件与SCSI没有明显的相关性?

mce*_*ndu 34 linux hard-drive drivers scsi linux-kernel

如果没有相关知识,我通常会认为 SATA、SCSI 和 USB 海量存储由不同的驱动程序驱动。然而在 Linux 中,SCSI 子系统驱动所有这些。

为什么 Linux 使用 SCSI 子系统来驱动与 SCSI 没有明确关系的东西?为什么 NVMe 和(历史上)PATA 不支持 SCSI 子系统的一部分?

use*_*686 48

\n

如果没有相关知识,我通常会认为 SATA、SCSI 和 USB 海量存储由不同的驱动程序驱动。然而在 Linux 中,SCSI 子系统驱动所有这些。

\n
\n

嗯,USB 海量存储实际上就是SCSI 它使用实际的 SCSI 命令集,只是通过另一种传输方式。(如果您的磁盘支持 UAS,即“USB 连接 SCSI”,则更是如此,但它同样适用于基本 BOT 存储设备。)这意味着,是的,您的外部 USB-SATA 磁盘盒正在转换命令ATA 和 SCSI 之间(使用特殊的“ATA passthrough”命令进行 SMART 访问等操作)。

\n

(如果您曾经拥有过 FireWire HDD 或 iPod,那么这些都是 SBP-2 设备,也就是 SCSI。这是一个非常通用的命令集。)

\n

SATA 支持通过 SCSI 进行,因为在 SATA 推出时,现有的 Linux PATA 子系统(可以追溯到 Linux 的早期)与强大的 SCSI 子系统相比有点垃圾,而且 SATA 在某种程度上已经更接近于 SCSI \xe2\x80\x93 队列、标记命令等功能。 \xe2\x80\x93 因此,将 AHCI 视为一种奇怪的 SCSI 控制器(具有 SCSI-ATA 转换层,“libata”)可能会提供比将其视为一种奇怪的 PATA 控制器。

\n

(事实上​​,在 Windows 获得本机 AHCI 支持 \xe2\x80\x93 之前,甚至当时的许多 Windows 系统都有供应商 SATA 驱动程序,将 SATA AHCI 控制器呈现为 SCSI 控制器,例如 Windows XP 知道 SCSI,但不知道 AHCI。)

\n

此支持使用由负责 SCSI 的 T10 工作组制作的官方SCSI 到 ATA 转换文档,显然大多数(如果不是全部)都有 1:1 转换,所以我认为这并不像黑客那么严重。看上去。尽管如此,当时这似乎被认为是一个临时解决方案,计划为 SATA 设备制作一个新的 Linux 子系统,但这从未发生;我猜“libata”(翻译层)的效果比预期的要好。

\n

(最后一点,所有 ATA CD/DVD 驱动器都使用“ATAPI”协议 \xe2\x80\x93,它只是 ATA 数据包内的 SCSI。同样,即使在 Windows 上,您也会看到几乎所有 CD/DVD-刻录软件将 CD/DVD 驱动器视为 SCSI 设备,因为从某种意义上来说它们确实是。)

\n
\n

为什么 NVMe 和 PATA 支持不是 SCSI 子系统的一部分?

\n
\n

PATA 支持其中的一部分。多年来,甚至 PATA 磁盘也/dev/sd*通过“libata”SCSI-ATA 转换显示为设备,而不是实际的 PATA/dev/hd*设备。近几个月来,“旧版”PATA 驱动程序已从 Linux 中完全删除,但它们已经很长时间没有使用了。

\n

至于 NVMe,我认为它与 T10 邮件列表消息中提到的有关 SATA 的内容相同,其中一个单独的子系统首先最终目标......并且考虑到 NVMe 被设计为 ATA 的后继者几十年后, SCSI 和 NVMe可能存在太多差异而无法实用,例如,与 SCSI 的设计目的相比,NVMe 允许的极深队列。

\n

也就是说,libata 运行良好是因为 PATA/SATA 是 SCSI 功能的子集,而 NVMe 则更像是一个超集。

\n

(NVMe 子系统最初确实有类似的 SCSI 转换,但最终被删除;提交消息声称部分原因是两者之间存在显着差异。)

\n

  • 此外,NVMe 的目标之一是消除通过几乎同步、难以并行化的 SATA 通道与高度并行、低延迟的 SSD 存储设备通信所造成的开销。消除线路上的开销相对来说意义不大,而只是在设备驱动程序的软件方面重新引入它。(这当然不会那么糟糕,但告诉人们“购买这种高效的新 SSD,这样我们就可以在其上模拟良好的旧 SCSI”可能不是最好的销售宣传。)(是的,我知道关于 SAS,但 NVMe 仍然更快。) (10认同)

har*_*ymc 13

《 SCSI 接口指南》对此进行了解释:

\n
\n

尽管旧的并行(快速/宽/超)SCSI 总线已基本不再使用,但 SCSI 命令集的使用比以往更广泛,可通过多种不同的总线与设备进行通信。

\n

SCSI 命令可以通过几乎任何类型的总线进行传输,并且是连接到 USB、SATA、SAS、光纤通道、FireWire 和 ATAPI 设备的存储设备的默认协议。SCSI 数据包通常还通过 Infiniband、I20、TCP/IP (iSCSI)、甚至并行端口进行交换。

\n
\n

解释是,SCSI 子系统用于掌握\n跨各种总线的通用 SCSI 协议,\n因此主要不是控制 SCSI 设备。

\n

有关 SCSI 接口的更多详细信息,请参阅\n上面的文章。系统总体结构描述为:

\n
\n

SCSI 子系统采用三层设计,即上层、中层和下层。涉及 SCSI 子系统的每个操作(例如从磁盘读取扇区)在 3 个级别中的每一层都使用一个驱动程序:一个上层驱动程序、一个下层驱动程序和 SCSI 中间层。

\n

SCSI 上层以 I/O 和 nioctl() 的块和字符设备节点的形式提供用户空间和内核之间的接口。SCSI 底层包含特定硬件设备的驱动程序。

\n

介于两者之间的是 SCSI 中间层,类似于网络路由层,例如 IPv4 堆栈。SCSI 中间层在上层\xe2\x80\x99s /dev 节点和下层相应\n设备之间路由基于数据包的数据协议。它管理命令队列,提供错误处理和电源管理功能,并响应 ioctl() 请求。

\n
\n

正是底层驱动程序使 SCSI 子系统能够与多种类型的总线和设备连接。

\n

PATA 现已过时,SATA 是大多数\n消费级存储设备的标准。NVMe 用于提高性能,\n尤其是 SSD。\nSCSI 仍用于专门的企业环境\n以实现兼容性及其高级功能。

\n


Jör*_*tag 6

“SCSI”是相关的分层协议和定义系统的总称。SCSI 指定了从连接器和电缆的物理尺寸、线路上的电压和电流、时钟机制、线路上的协议到设备理解的命令的所有内容。

显然,连接器、电缆、电气规范和电线协议如今已经过时,并且已经过时很长时间了。

然而,这些命令仍然存在。操作系统不关心插头的大小或电线上的电压或电线上数据的编码方式,它只关心它发送到设备的命令。因此,只要一个设备“理解”SCSI命令,从操作系统的角度来看,它就是一个SCSI设备。操作系统不知道设备如何连接到系统,它只知道设备所说的“语言”。

与竞争对手(尤其是 ATA)相比,SCSI 一直是“更专业”、“更强大”、“更成熟”的替代方案,因此许多新技术简单地采用 SCSI 命令而不是经历麻烦是有道理的创建自己的。

第一个推出的 CD 驱动器非常昂贵,并且是为 Unix 工作站设计的,所以很自然地,它们是 SCSI 驱动器。当第一个 ATA CD 驱动器问世时,ATA 人员​​并没有重新发明 SCSI 人员所做的一切,而是发明了ATAPIATA 数据包接口),它只不过是通过 ATA 传输 SCSI 命令的一种方式。

当ATA硬盘获得了更多“专业”功能,如自我监控、加密、命令队列时,ATA们并没有自行其事,而是从SCSI功能中获得了很大的灵感。

当 Firewire 推出时,他们选择对外部驱动器使用 SCSI 命令。当USB推出时,他们也做了同样的事情。

有趣的是,另一个方向也有技术转移:SAS 协议以及电气和物理布线很大程度上基于 SATA。

当 CD-ROM 被引入 Linux 时,它们是基于 SCSI 子系统的,这导致了一个有趣的状态:连接到同一根电缆的硬盘和 CD-ROM 会出现在两个不同的子系统中。

当USB和Firewire被引入时,它们自然地使用了SCSI子系统。

因此,当 SATA 被引入 Linux 内核时,我们决定将其建立在更简洁、实现更好的 SCSI 子系统的基础上,而不是旧的、粗糙的 ATA 子系统。

在某个时候,我们决定将 PATA 硬盘也移至 SCSI 子系统。

为什么Linux SCSI子系统驱动硬件与SCSI没有明显的相关性?

窃取问题下的评论:因为它们与 SCSI 相关,只是以一种不明显的方式。

它们都使用 SCSI 命令,从操作系统的角度来看,这是唯一相关的。

为什么 NVMe 和(历史上)PATA 不支持 SCSI 子系统的一部分?

NVMe 经过专门设计,与传统存储命令 API不同,因为闪存与传统旋转硬盘或磁带非常不同。

对于亚太旅游协会来说,这是历史性的。如果真正的原因只是 Linus 在 1991 年的计算机没有 SCSI 磁盘,所以 PATA 子系统先出现,我不会感到惊讶。在引入 SATA 支持之后,PATA确实转移到了 SCSI 子系统中。