open-iscsi/scst 追踪一 (scst 架构)

        scst 是一款开源的企业级iscsi target系统,scst 经常被用在网络存储架构中,之前在相关项目中频繁用到,并对其做过功能扩展,借此把其源码分析写一下,总结一下,通过源码分析,我们可以较为清晰的看到iscsi协议在target端的处理全过程。(scst官方主页在http://git.etherboot.org/scm/mirror/scst/www/index.html)

       本篇先总体介绍 技术架构和iscsi命令在达到target后,其处理全过程。

(一)open-iscsi/scst 内核架构

我们首先看看open-scsi scst 在内核系统中的架构,如下图,左边是本地scsi存储设备访问的结构图,右边是通过网络协议进行访问的结构图,通过两张图可以先大概知道target系统在操作系统内核中的位置。

open-iscsi/scst 追踪一 (scst 架构)_第1张图片

 (二)scst技术架构

技术架构如下图,摘自wikipedia,有兴趣的同仁可以去http://en.wikipedia.org/wiki/SCST 阅读:

 open-iscsi/scst 追踪一 (scst 架构)_第2张图片

 

虚线上方主要是用户态管理工具,scst core实现在内核中,中间蓝色为核心子系统,其代码框架设计合理,将target具体驱动封装成可注册的插件驱动,如我们经常会用到的就是iscsi-scst插件,通过这个驱动程序我们可以在以太网上做iscsi协议的访问,即iscsi over tcp/ip,后续会继续分析initiator端开源驱动open-iscsi,再详细介绍iscsi协议。

 

同时除了必备的target插件驱动,scst内核核心系统也支持了几个存储设备驱动,从外部使用上就是我们经常在配置scsi设备导出时可选择的导出方式,比如blockio 或者 fileio导出,或者 pass through,这几种导出方式在scst 内核其实是由几个专用的存储驱动完成的,它们也实现为可注册插件的形式。

 

这样我们可以很清楚总结一下,如果想要开发特定的target驱动或者存储驱动,我们在熟悉了scst core 子系统的基础上,可以灵活开发。

 

本次系列分析也将以iscsi-scst target插件驱动和blockio storage插件驱动进行分析。

 

(三)iscsi命令处理

我们以scst1.0版本为例分析,当前2.X版本其核心处理逻辑是不变的,分析低版本,主要是尽快把握好iscsi协议的核心处理,iscsi命令达到target后处理过程如下图所示:

 open-iscsi/scst 追踪一 (scst 架构)_第3张图片

 

本篇我们先不涉及具体的数据结构和API函数,先从整体上把握一下iscsi命令到达target端后的处理状态流程,上图是总结分析后制作的,我们解读一下,后续分析代码过程中,需要与此对应。

1. 当我们在initiator端通过open-iscsi将target链接之后(login),我们会在客户端本地发现标准scsi 设备,然后就像使用本地设备一样对其进行读写访问,请求经过bio->scsi cmd->iscsi cmd -> tcp/ip parket ,最终通过以太网协议发送到target端,在iscsi-scst target驱动中,有两个命令处理状态机,实现为两个命令进出处理的内核线程,如上图所示,iscsi session是 initiator端与target端所建立的会话,当前open-iscsi和iscsi-scst只支持单链接,即一个session中只有一个connection,命令通过此connection所对应的socket套接字进入,收到一个数据包,iscsi-scst的命令接收处理线程会被唤醒,开始对数据包进行解码。

 

2. 首先会分配一个iscsi-cmd 数据结构,用以描述和保存解码后的iscsi命令数据,第一次分析是先对协议数据单元进行拆封分析,即pdu,PDU就是iscsi协议放在tcp数据包中的头部数据段内容,解析完PDU,iscsi-scst就知道是什么命令,比如是读,还是写,或者iscsi管理类的命令,随后iscsi-scst会与scst core子系统进行一下交互,调用scst core中的分配scst cmd函数接口,分配一个scst core子系统处理需要的scst  cmd 命令结构,此处正是scst core能够实现为插件灵活注册的核心之处,即不管target驱动如何处理命令,到达scst core后,它统一只处理自己定义的scst cmd命令,包括为读写命令中的数据分配实际的内存空间也是在scst core中进行,分配完后,会继续进入iscsi-scst命令接收线程处理的状态机中。

 

3.iscsi-scst状态机中会继续处理命令,由于此时scst cmd命令已经准备好,所以会进一步由iscsi-scst选择接收命令的数据内容(比如写命令),或者数据到位后 又或者是写命令的话,直接继续唤醒scst core的处理线程处理命令。

 

4.scst core 处理命令结束后,会将命令提交给iscsi-scst负责应答的处理线程,如上图中间下面的框图所示,应答处理中做的操作会比较快速,直接将scst cmd所对应的iscsi-cmd命令找到,提充好PDU,即可将命令发送回initoator端。

 

我们根据上图简单描述了下iscsi命令在target端处理过程,比较粗糙,还未涉及具体数据结构和代码,但是通过此图和分析,我们可以较为清楚的从整体上把握住iscsi协议的处理过程,后续我们会专注于细节解读。

 

P.S.:Fusion-IO已经收购了SCST:

http://www.h-online.com/open/news/item/PCI-SSD-maker-Fusion-io-acquires-Linux-SCST-developer-ID7-1825685.html

 

你可能感兴趣的:(存储系统/架构)