GNU/Linux 和 SCSI 是很好的一个组合,因为二者在各自的环境中具有类似的特征。GNU/Linux 是一种安全可靠的操作系统,可以不间断地运行。SCSI 适合于可靠和高性能存储。二者都是开源的。您可以下载和查阅 International Committee on Information Technology Standards (INCITS) T10 Technical Committee 的各种 SCSI 规范。同样地,您也可以下载 GNU/Linux 源代码以理解其实现。它们在各自的行业都具有主导性,所以相对其他操作系统而言,GNU/Linux 能更好地支持 SCSI,这一点就不足为奇了。
SCSI 的演化SCSI 是一种很有趣的接口,它是早期的接口之一,如今还在不断演化。第一种 SCSI 标准称为 SCSI-1,是由 Shugart Associates 在 1979 年前后创建的。SCSI-1 定义了一种具有 5MHz 数据时钟的 8-bit 并行接口,能提供最高 5 兆字节每秒(5 MB/s)的数据传输速率。
SCSI-2 标准出现于 1985 年,它的出现使数据速率更快(10MHz),总线也更宽(16 位)。被称为 Fast/Wide 的 SCSI-2 允许的数据传输速率高达 20 MB/s,并具有与 SCSI-1 的向后兼容性,但是速率也会限制到 SCSI-1 的数据速率。
SCSI-3 的开发开始于 1993 年,现已成为了一组标准集,可以定义协议、命令集和信令方法。在 SCSI-3 中,包含一组命名为 Ultra 的并行 SCSI 标准和基于串行 SCSI 的协议,比如 IEEE 1394 (FireWire)、Fibre Channel,、Internet SCSI (iSCSI) 和新兴的 SAS。这些标准通过引入存储网络技术(比如 FC-AL 或 iSCSI)改变了传统的存储理念,将数据速率扩展到了 1 Gbit/s,将最大的可寻址设备数增加到了 100 以上,并将最大的电缆长度扩展到了 25 米。图 1 展示了从 1986 至 2007 年 SCSI 的数据速率的变化
图 1. SCSI 数据速率的演化 SCSI 工作原理 SCSI 实现了一种客户机/服务器风格的通信架构。发起者向目标设备发送命令请求。该目标处理此请求并向发起者返回响应。发起者可以是托管计算机中的一个 SCSI 设备,而 SCSI 目标则可以是一个磁盘、光盘和磁带设备或特殊设备(比如箱体设备)。
SCSI 命令 SCSI 传输所采用的协议已经时过境迁,SCSI 命令却保持了最初的元素。SCSI 命令是在 Command Descriptor Block (CDB) 中定义的。CDB 包含了用来定义要执行的特定操作的操作代码,以及大量特定于操作的参数。
SCSI 命令支持读写数据(各有四个变量)以及很多非数据命令,比如 test-unit-ready(设备是否已就绪)、inquiry(检索有关目标设备的基本信息)、read-capacity(检索目标设备的存储容量)等等。目标设备支持何种命令取决于设备的类型。发起者通过 inquiry 命令识别设备类型。表 1 列出了最常用的 SCSI 命令。
表 1. 常见 SCSI 命令命令用途Test unit ready查询设备是否已经准备好进行传输Inquiry请求设备基本信息Request sense请求之前命令的错误信息Read capacity请求存储容量信息Read从设备读取数据Write向设备写入数据Mode sense请求模式页面(设备参数)Mode select在模式页面配置设备参数
借助大约 60 种可用命令,SCSI 可适用于许多设备(包括随机存取设备,比如磁盘和像磁带这样的顺序存储设备)。SCSI 也提供了专门的命令以访问箱体服务(比如存储箱体内部当前的传感和温度)。更多信息,请参见 部分。
Linux 内核中的 SCSI 架构 图 2 显示了 SCSI 子系统在 Linux 内核中的位置。内核的顶部是系统调用接口,处理用户空间调用到内核中合适的目的地的路由(例如 open、read 或 write)。而虚拟文件系统(VFS) 是内核中支持的大多数文件系统的抽象层。它负责将请求路由到合适的文件系统。大多数文件系统都通过缓冲区缓存来相互通信,这种缓存通过缓存最近使用的数据来优化对物理设备的访问。接下来是块设备驱动器层,它包括针对底层设备的各种块驱动器。SCSI 子系统是这种块设备驱动器之一。
图 2. SCSI 子系统在 Linux 内核中的位置 与 Linux 内核中的其他主流子系统不同,SCSI 子系统是一种分层的架构,共分为三层。顶部的那层叫做较高层,代表的是内核针对 SCSI 和主要设备类型的驱动器的最高接口。接下来的是中间层,也称为公共层或统一层。在这一层包含 SCSI 堆栈的较高层和较低层的一些公共服务。最后是较低层,代表的是适用于 SCSI 的物理接口的实际驱动器(参见图 3)。
图 3. Linux SCSI 子系统的分层架构 在 ./linux/drivers/scsi 可以找到 SCSI 子系统(SCSI 较高层、中间层和各种驱动器)的源代码。SCSI 数据结构则位于 SCSI 源目录,在 ./linux/include/scsi 也可以找到。 |