Linux入门攻坚——54、SCSI与iSCSI协议初步
存储类型:
DAS:Direct Attached Storage,直接附加存储
NAS:Network Attached Storage,网络附加存储,文件服务协议实现文件服务器,NFS、CIFS。(了解RESTful,也能够实现NAS)
SAN:Storage Area Network,存储区域网络。
Linux的存储模型:

只有在文件系统层次上才有磁盘分区等概念,到了块设备驱动后,只对应具体存储设备的存储块,没有分区的概念。到了Block Device Driver,只是负责具体磁盘的寻道存储操作,将具体数据存储到相应的柱面、扇区上。
我们这里要了解的就是最后的Volume层,即具体存储设备的接口,即DAS的接口类型,有IDE、SCSI,这两种是并行口,SATA、SAS、USB是串行口。
SCSI:Small Computer System Interface
SCSI是一种I/O技术,规范了一种并行的I/O总线和相关协议,其数据传输是以块的方式进行的。
SCSI的特定:
设备无关性:最底层的存储设备可以是任何设备,如磁盘、光盘等,只要提供符合SCSI要求的接口即可,这就是设备无关性;
多设备并行、高带宽、低系统开销;
SCSI总线是SCSI设备之间传输数据的通路,SCSI总线又被称为SCSI通道。

SCSI总线通过SCSI控制器来和硬盘之类的设备进行通信,SCSI控制器逻辑上可分为一个任务管理单元和多个逻辑单元(LU)

一个独立的SCSI总线按照规格不同可以支持8或16个SCSI设备,设备的编号需要通过SCSI ID来进行控制;系统中每个SCSI设备都必须有自己唯一的SCSI ID,SCSI ID实际上就是这些设备的地址。(一个SCSI ID可以叫做一个target)
LUN(Logic Unit Number,逻辑单元号)是为了使用和描述更多设备及对象而引进的一个方法,每个SCSI ID上最多有32个LUN,一个LUN对应一个逻辑设备(这个逻辑设备,有可能是一个分区,也可能是一个磁盘)。
SCSI体系结构,SCSI类似tpc/ip协议,也是分为多个层次的:




SCSI传输协议通过互联协议接口,将数据封装为SCSI物理连接的互联协议报文,在SCSI通道中传输;如果底层传输不是SCSI通道,那么互联协议接口可以将SCSI传输协议报文封装成其他的物理层传输协议,如底层接口是光纤接口,就转换为FC格式的传输报文,如果是以太网接口,就要封装为tcp/ip报文等。
特定设备指令集和基础指令集合成为应用层,这三层在Linux内核中要分别使用不同的模块实现。
而物理层可替换为其他的传输介质,而非必须使用SCSI线缆。
以下是不同物理层实现的示意图,物理层不同,SCSI传输层数据被封装成物理传输层协议报文就要使用不同的封装协议栈:

上图中FC、iSCSI、SRP/iSER及以下各层形成了一个网络,即SAN,存储区域网络。
SAN:利用现有的成熟网路技术承载存储协议SCSI的相关报文。
底层为FC时,形成FCSAN,为iSCSI时,形成IPSAN。
iSCSI协议报文:

理解Initiator与Target:

在DAS类型中的SCSI存储中,Initiator就是主机上的SCSI接口上的控制器(适配卡Adapter),SCSI通道就是SCSI总线,Target就是连接的SCSI存储设备的接口加上接口上的控制电路,然后是里面的存储盘片,就是磁盘。Initiator的作用就是将SCSI传输层报文封装为SCSI物理传输层协议报文,通过SCSI端口驱动程序,通过SCSI端口,将数据通过SCSI总线,传输到SCSI存储设备上。Target就是连接到SCSI总线上的SCSI存储设备,这个设备也是有接口的,这个接口实现接收SCSI物理层协议格式的报文,然后通过其控制电路,实现将数据解封装,后通过内部电路驱动磁盘读写数据到磁盘盘片上。
现在将物理链路层进行替换,如替换为FC或Ethernet,这里以替换为以太网为例,这时,Initiator要实现的功能,在SCSI Layer后,要通过iSCS进行封装,然后要调用TCP/IP栈将报文封装为以太网报文,然后通过以太网接口,借助TCP/IP网络传输到Target;那么在Target端,此时的Target的接口就必须能够接收TCP/IP报文,然后通过解封装TCP/IP报文,得到iSCSI报文,上传给SCSI Layer层,然后通过调用Target上的SCSI驱动(或SCSI芯片、电路),将数据读写到磁盘上。那么实现Target这一系列功能的设备,完全可以是一台主机,这台主机拥有以太网接口,可以接收处理TCP/IP报文,然后内核中增加iSCSI层和SCSI层,实现对SCSI报文的处理,如果本机有SCSI磁盘,通过SCSI驱动读写本机的SCSI存储磁盘,如果本机是其他存储设备,如IDE磁盘,则将SCSI的指令转换为IDE的指令,然后可以调用本机的磁盘驱动完成读写IDE磁盘。也就是说,此时具体的存储设备可以是任意类型的存储设备,而不需要必须是SCSI磁盘。所以,所谓SCSI存储设备,实际上只需要具有SCSI协议功能即可,也就是Target只要对外表现为具有Target功能特性即可,由此可以用一台主机来作为Target。类似的,对Initiator,也不必要使用SCSI专用设备,只要能够实现SCSI相关协议报文的处理,并实现其功能,也是一种Initiator,这样,就可以使用几台主机联网来实现SCSI存储,这就是IPSAN。


SAN与NAS的不同:

SAN其实就是DAS(SCSI)的延展,通过网络技术扩展了SCSI协议。SAN主机(Initiator)与存储(Target)之间传输调用接口是块级别的,更多的处理是在主机(Initiator)上的;而NAS是由存储(Target)组织文件系统,并且向外输出的是文件系统接口,主机的处理要简单的多,更多的压力在存储端。
iSCSI的工作示意图:

对于直接的DAS模型的专用SCSI,SCSI磁盘上电,主机中的控制器就可以感知到存储设备,但是在iSCSI的SAN中,模拟Target的是主机,并且是通过网络传输数据,此时网络上的Initiator可能很多,为了安全,存储端要有安全控制,如仅允许哪些Initiator可以存取数据,可以基于用户账号授权访问,也可以基于IP授权访问。并且一旦授权后,Initiator与Target之间要建立永久会话链接,以保证数据可以立即存取,提高性能。
关于多路径multipath问题:
因为数据使用网络进行传输,为了避免业务数据与存储数据挣用带宽,以及为了避免单路径故障,有时Initiator和Target上有多个网络接口,此时Initiator有可能将一个Target识别成多个不同的Target,此时需要配置主机(Initiator)工作在多路径(Multipath)模式。
关于存储性能的问题:因为Target可以使用一台Linux主机模拟,此时的Linux要能够处理TCP/IP报文,要能够处理iSCSI和SCSI协议报文,所以压力会很多,性能会大幅下降,此时可以使用专用的网卡,减轻Linux内核处理TCP/IP报文的压力。普通的网卡只能处理到以太网层报文,但高级的网卡可以在硬件层就能识别IP层甚至TCP层报文,这样Linux内核只需要处理iSCSI报文,性能大幅提高:

TOE —— TCP/IP Offload Engine:TCP/IP减负引擎,是一种通过硬件加速网络协议处理的技术,旨在降低主机处理器负载并提升网络传输性能。
iSCSI HBA卡 ,HBA —— Host Bus Adapter,主机总线适配器,开始是使用在光纤通道中,全称Fibre Channel Host Bus Adapter,FC HBA,使用于iSCSI中,叫做iSCSI HBA。
