iSCSI目标器与存储设备的接口方法

文档序号:6574531阅读:167来源:国知局
专利名称:iSCSI目标器与存储设备的接口方法
技术领域
本发明涉及计算机存储技术领域,具体地涉及基于iSCSI (Internet Small Computer System Interface,因特网小型计算机系统接口 ) ll标器与存储设备 的接口方法。
技术背景九十年代以前,存储产品大多作为服务器的组成部分之一,这种形式的 存储被称为SAS (Server Attached Storage,服务器附属存储)或DAS (Direct Attached Storage,直接附属存储)。随着技术发展,进入九十年代以后,人们 逐渐意识到IT系统的数据集中和共享成为一个亟待解决的问题。于是,网络 化存储的概念被提出并得到了迅速发展。从架构上来分,今天的网络化存储 系统主要包括SAN (Storage Area Network,存储区域网)禾H NAS (Network Attached Storage,网络附加存储)两大类。目前,许多网络存储提供商致力于将SAN中使用的FC (Fiber Channel, 光纤通道)设定为一种实用标准,但是其架构需要高昂的建设成本,远非一 般企业所能够承受。与之相比,NAS技术虽然成本低廉,但是却受到带宽消 耗的限制,无法完成大容量存储的应用,而且系统难以满足开放性的要求。 iSCSI (Internet Small Computer System Interface,因特网小型计算机系统接口 ) 在避开了传统NAS/SAN差别之后的以网络为中心的新存储方案(开放存储网络)中同时享受到NAS和SAN拓扑结构的优势。iSCSI标准把存储设备和服务器与应用普通互联网协议建立起来的网络结合在了一起,而不是使用速度 更快但是价格更昂贵、更复杂的光纤通道技术,为众多中小企业对经济合理 和便于管理的存储设备提供了直接访问的能力。iSCSI (因特网小型计算机系统接口)是一种在因特网协议网络上,特别 是以太网上进行数据块传输的标准。它是一个供硬件设备使用的可以在IP (Internet Protocol,网际协议)协议上层运行的SCSI (小型计算机系统接口 ) 指令集。简单地说,iSCSI可以实现在IP网络上运行SCSI协议,使其能够在 诸如高速千兆以太网上进行路由选择。SCSI是以 一种广泛使用的连接硬盘和 计算机的技术标准,而iSCSI则将该技术应用于网络环境中。iSCSI是基于IP 协议的技术标准,是允许网络在TCP/IP (Transfer Control Protocol/Internet Protocol,传输控制协议/网际协议)协议上传输SCSI命令的新协议,实现了 SCSI和TCP/IP协议的连接,该技术允许用户通过TCP/IP网络来构建存储区 域网(SAN)。目前,iSCSI目标器与不同的存储块设备(如磁带、光盘以及不同接口类 型的磁盘等)的接口方法通常有两种l.使用不同的接口实现方法;2.采用统 一的file I/O (文件输入/输出)方法。第一种方法由于针对不同类型的设备实 现了专用的接口方式,效率高,1/0性能好,但是由于存储设备和操作系统版 本的多样性将导致实现不同的接口技术方法非常复杂繁琐,而且没有通用性。 第二种方法虽然屏蔽了存储设备的多样性,但是file I/O方法的read/write (读 /写)依赖于文件系统的读写方法的调用,增加了数据在I/O过程中的内存拷 贝,增长了I/0路径,牺牲了系统的性能和稳定性。发明内容为克服现有技术的缺陷,本发明要解决的技术问题是提供r种通用性好、效率高、性能强、且稳定性好的因特网小型计算机系统接口H标器与存储设备的接口方法。本发明的技术方案是将linux2.6内核中的数据结构的bio结构休和BIO 接口方法应用于该因特网小型计算机系统接口目标器与存储设备的接口方法 中。更进一步地,这种接口方法包括以下步骤(1)初始化过程,即将存储 设备加载到目标器;(2)基于BIO接口方法的读进程,即采用BIO的方法从 存储设备读取数据;(3)基于BIO接口方法的写进程,即采用BIO的方法向 存储中存入数据;(4)结束过程,即存储设备从目标器中卸载。更进一步地,所述步骤(1)包括以下分步骤(l.])为存储块设备创建 第一结构体,该结构体表示存储设备与目标器对应的基本参数;(1.2)获取该存储设备的块设备结构指针,其是表示存储设备的指针,进而得到存储设 备的容量和块大小参数;(1.3)检查该存储设备的I/0请求队列参数;(1.4) 为该存储设备分配读写数据的缓存空间;(1.5)将第一结构体加入设备链表, 完成存储设备的参数加载到目标器的过程。所述步骤(2)包括以下分步骤(2.1) 判断当前的读请求是否在读写数据缓存空间中,是则转步骤(2.5);(2.2) 当前的读请求不在读写数据缓存空间中,根据需要读取的存储数据的 起始地址和长度构造bio链,即将由当前读写请求所产生的bio结构体链接 在一起的链;(2.3)将bio结构体从bio链中逐个摘下,根据bio链中bio 结构体的个数设置bio结构体中的私有数据指针域的参数和回调函数,私有 数据指针域表示存储状态信息的区域,回调函数用于通知读写请求完成的状 态;(2.4)将bio结构体逐个提交给对应的存储设备,当提交请求完成时, 在(2.3)设置的回调函数被执行,以便完成读取完成后的处理过程;(2.5)当前读请求处理结束,转(2.1)继续进行下一读请求的处理。所述步骤(3) 包括以下分步骤(3. l)判断当前写请求是否在读写数据缓存空间中,是则转步骤(3.7); (3.2)根据(3.1)的返回值判断读写存数据缓存空间是否需要腾 空,否则转步骤(3.4); (3.3)根据要腾空的读写数据缓存空间中的内容构造 bio结构并提交给存储设备,将存储数据写入存储设备;(3.4)根据当前写请 求的起始地址和数据长度构造bio链;(3. 5)依次将bio结构体从bio链中 摘下,并根据bio链中的bio结构体的数量填写每个bio结构体中的私有数 据域的参数和回调函数;(3.6)将bio结构体提交给存储设备,执行写入数 据的操作,当该操作完成后,(3.5)步设置的回调函数被执行,以便释放本次 1/0所占用的系统资源;(3.7)当前写请求处理结束,转(2. 1)继续进行下 一写请求的处理。所述步骤(4)包括以下分步骤(4.])清空该存储设备对 应的读写数据缓存空间;(4.2)释放读写存数据缓存空间所占的内存资源; (4.3)将对应的第一结构体从设备链表中摘除;(4.4)释放第一结构体所占 的系统资源;(4.5)存储设备卸载完毕,进程结束。bio结构体是linux2. 6内核中最新定义的一系列数据结构之 一。由于bio 结构体描述的是I/O操作,它可以包括内存中的一个或多个页,相对于以前 的bufferjiead结构体,可以避免不必要的数据块的分割。并且由于bio结 构体是轻量级的,它描述的I/O请求块可以分布在非连续的内存区。对于与 iSCSI目标器的接口,与现有方法不同,BIO接口方法对不同的存储块设备 (如磁盘、磁带、光盘等)是通用的,因此,它具有与采用File l:/0接口方 法同样的优点一一iSCSI目标器与存储设备之间的数据传输与存储设备无关。 同时,又克服了 File I/O方式的读写依赖于对文件系统的读写方法的调用(增 加了内存拷贝和1/0路径,牺牲了系统的性能和稳定性)的缺点。


图1为本发明的iSCSI目标器的硬件结构示意图;图2为本发明的iSCSI目标器的软件模块结构示意图;图3a是构造bio链的流程图,图3b是将数据填充到bio结构体中的流 程图;图4a为本发明的基于BIO接口方法的bio读函数的流程图,图4b为bio 读回调函数的流程图;图5a为本发明的基于BIO接口方法的bio写函数的流程图,图5b为bio 写回调函数的流程图;图6为本发明的存储设备的初始化过程的流程图;图7为本发明的存储设备的结束过程的流程图。
具体实施方式
下面参照附图,将详细叙述本发明的具体实施方式
。Linux内核(2.6及后续版本)中定义的bio结构体与本发明密切相关, bio结构体定义如下 struct bio {sector_t bi_sector; /*起^台扇区号*/struct bio*M_next; /* bio链*/struct block—device *bi—bdev;unsignedlongbi—flags;ims ignedlongbi—rw;/*读写命令才示志*/unsignedshortbi—vent;/*页向量长度*/unsignedshortbi一idx; /*当前页向量指针*/unsignedshortbi_phys-segments;uns ignedshortbi—hw_segments;unsignedintbi—size) /*未完成10的数据长度unsignedintbi_hw—f rout—sizejunsigned intbi —hw—back—s ize;unsigned intbi-max一vecs; /*页向量的最大长度*/struct bio—vec化i一io一vec; /* io页向量*/ *bi_end_io; /*回调函数*/bio—end—io—tatomic—tvoid*bi_private;/*私有数据域指针*/bio—destructor_t *bi_destructor;};在上述的bio结构体中,凡是本发明所涉及的都加以中文注释。 为了实现BIO方法,定义了以下必须的数据结构(1) scst—blockio_tgt—dev结构体(第一结构体) struct scst—blockio—tgt_dev {spinlock_t biodev—lock; 〃自旋锁int shutdown; 〃是否关机标志struct block—device * bdev ; 〃块设备结构指针struct list—head biodev—cmd一list; 〃命令结构链头wait—queue_head_t biodev一waitQ; //等待队歹寸atomic —t threads — count; 〃执行命令的线程数blockio—cacheread—cache [READ—CACHE —NR]; 〃读緩存头blockio—cachewr i te_cache [WRITE—CACHE —NR]; 〃写纟爰存头struct semaphore shutdown—mutex; //互斥信号量struct list—head biotgt —list—entry; //Target纟#构链头};(2) scst—blockio—dev结构体(第二结构体) struct scst—blockio—dev {uint32 —t block —size; 〃i殳备块大小sector —t nblocks; //块数int block_shift; 〃块大小与字节数间的转换移位数loff一t dev-capacity; //设备容量,以字节为单位int rd—only—flag:1;int wt_flag: 1;int create —flag:int o—direct_flag: 1;int media — changed: 1;int prevent — al low—medium—removal: 1; 〃设备权卩艮标志位 char name [16+1]; 〃设备名称struct list_head blockio—dev—1 ist —entry; //block io设备链头 struct list—head biotgt一list; // target结构链头 struct semaphore biotgt —1 ist—mutex; 〃互斥信号量};(3) bio—cmd结构体(第三结构体) struct bio—cmd {unsigned short use一sg ; 〃聚散标志 sector_t lsector; 〃起始逻辑扇区号 int bufflen ; 〃数据长度int rw ; 〃读写标识void *buffer ; //数据緩存区 unsigned int atomic—buf: 1; //原子标识 struct block—device * bdev; 〃块结构指针};图1为本发明的iSCSI目标器设备硬件结构示意图,基于PCI的通用服 务器主板分别与以太网接口、 ATA接口卡、内存、FLASH DISK互连。图2为本发明的iSCSI目标器模块结构示意图,包括前端目标驱动(FETD, Front End Target Device)、 BIO处理子系统、IO子系统、硬件子系统。图3为本发明的构造bio函数示意图,它是实现BIO方法的关键。在图 3a中,若数据长度小于一页,则仅申请一个bio并提交,如长度大于一个页, 则根据bio_vec的最大个数构造每个bio的bio—vec结构,并依次构造bio 链。如图3b所示,该函数填充bio的bio—vec向量。对于已经支持聚散的命 令(目前绝大多数硬件都支持聚散方式),则直接根据聚散表获得页面(page) 信息,然后将page逐个加入到bio的bio—vec中,直到不能加入为止,返回 已经加入的页数(数据长度为附属返回值)。对于非聚散操作,则重新申请页 内存,若是写命令,则将源数据复制到页中,否则不需要复制数据。然后将 页逐个加入bio中,直到不能再加入为止,返回已经加入的数据长度(已加 入的页数为附属返回值)。图4为本发明的读函数示意图,该函数负责处理来自上层(目标器中间 层,Target—Mid—Level)的读请求。图4a说明当新的读请求到达时,首先判 断该读请求是否在读缓冲区中,若请求数据在读缓冲区中,则直接将对应数 据返回;若不在,则根据返回的第三结构体获得读请求的起始块地址及请求 的数据长度,进而调用bio,构造相应的bio链,并且负责填写每个bio的私 有数据指针域以及相关的回调函数,然后调用系统内核块1/0层提供的 submit—bio函数,将所构造的bio均提交到对应块设备的请求队列中。图4b 表明读bio回调函数的处理流程,当单个bio完成时,原子计数器的值减l, 当计数器值为零时,说明本次请求全部完成,释放本次读请求所申请的资源, 并向上层(Target—Mid—Level)报告命令完成的状态。图5为本发明的写函数示意图,进行下述步骤写函数与渎函数流程基本一样,只是在最后不需要数据拷贝操作。该函数处理流程如T:当写请求到达时,首先判断是否在写缓冲区中。若在,则更新写缓冲区内的数据,并返回;若返回"No Cache"(该请求不支持写缓冲区)或"Cache Busy"(写缓冲区正在腾空,被锁定)时,根据该写请求的信息填充第三结构体,并调用构造bio,构造相应的bio链。最后将bio逐个通过submit—bio函数提交 给对应的块设备;若返回"Cache Unhit"(写缓冲区没有足够的空间存放当 前的数据),则首先构造腾空写缓冲区的bio链并提交到块设备执行腾空任务, 然后再将根据本次请求的参数构造bio链并提交给设备执行写操作。在图5b 的bio回调函数中,对计数器进行减l,当计数器为0时,说明所有的该请求 对应的所有bio都己完成,则释放本次写请求占用的资源与写存储数据的空 间,并向上层报告完成。图6为本发明的存储设备的初始化过程的流程图,其主要是获得要加载 的存储块设备结构体,并通过该结构获得要加载的块设备的相关信息。其中 涉及到为结构分配空间和初始化等。最后根据获得的块设备参数设置存储块 设备结构体的请求队列的参数(即参数make一request一queue)。具休步骤首先申请一个新的第一结构体,并初始化其各数据参数。然后打开底层挂载的 标准块设备,进而获得块设备的参数,根据块设备参数设置其请求队列参数。 最后,还负责申请该块设备对应的读写缓存空间,并将完成的数据结构对象 链接在第二结构体的链尾。图7为本发明的存储设备的结束过程的流程图。其主要是用来释放所链 接的请求阵列的相关数据结构体。具体步骤首先,从相应的第二结构体链 中摘除,并置shutdown (关机)标志,唤醒所有阻塞在该设备t的请求,并 完成这些请求;然后,释放该第二结构体对应的存储设备及其成员的内存空 间,释放该设备对应的读写缓存空间。最后,关闭存储设备,并释放所构造 的第二结构体的内存空间。本发明特点如下1. 实现了 iSCSI目标器与存储块设备的统一接口,屏蔽了设备的复杂多 样性,既简化了系统实现的复杂度,又方便了用户的操作与使用。2. 避免了通过文件系统访问存储设备,减少数据存储过程中的内存拷贝,优化了 1/0路径,提高了存储的1/0性能。3. 方便处理高端内存,因为它处理的是物理页而不是直接指针。4. Bio结构体既可以代表普通页1/0,同时也可以代表直接1/0 (指那些不通过页高速缓存的I/O操作)。5. Bio结构体便于进行聚/散块的l/0操作,操作中的数据可取fi多个物理页面。6. Bio结构体相比缓冲区头(buffer head),属于轻量级的结构体。因 为它只需要包含块I/O操作所需要的信息就行了,不用包含与缓冲区本身相 关的不必要信息,减少了系统的复杂度。因此,本发明适用于构造具有高性价比的存储系统。
权利要求
1. iSCSI(因特网小型计算机系统接口)目标器与存储设备的接口方法,其特征在于将linux2.6内核中的数据结构的bio结构体和BIO接口方法应用于该因特网小型计算机系统接口目标器与存储设备的接口方法中。
2、 按照权利要求1的接口方法,包括以下步骤(1) 初始化过程,即将存储设备加载到目标器;(2) 基于BIO接口方法的读进程,即采用BIO的方法从存储设备中读取 数据;(3) 基于BIO接口方法的写进程,即采用BIO的方法向存储设备中写入 数据;(4) 结束过程,即存储设备从目标器中卸载。
3、 按照权利要求2的接口方法,其特征在于所述歩骤(1)包括以下分 步骤(1.1) 为存储块设备创建第一结构体,该结构体表示存储设备与H标器对应 的基本参数;(1.2) 获取该存储设备的块设备结构指针,其是表示存储设备的指针,进而 得到存储设备的容量和块大小参数;(1. 3)检查该存储设备的I/O请求队列参数;(1.4) 为该存储设备分配读写数据缓存空间;(1.5) 将第一结构体加入设备链表,完成存储设备加载到目标器的过程。
4、 按照权利要求2的接口方法,其特征在于所述歩骤(2)包括以下分步骤(2.1) 判断当前的读请求是否在读写缓存空间中,是则转步骤(2.5);(2.2) 当前的读请求不在读写缓存空间中,根据需要读取的存储数据的起始 地址和长度构造bio链,即将由当前请求所产生的tno结构体链接在一起的链;(2.3)将bio结构体从bio链中逐个摘下,根据bio链中bio结构体的个数 设置bio结构体中的私有数据指针域的参数和回调函数,私有数据指针域表 示存储状态信息的区域,回调函数用于通知读/写请求完成的状态; (2. 4)将bio结构体逐个提交给对应的存储设备,当提交请求完成时,在(2. 3) 设置的回调函数被执行,以便完成读取完成后的处理过程;(2.5) 当前读请求处理结束,转(2.1)继续进行下一读请求的处理。
5、 按照权利要求2的接口方法,其特征在于所述歩骤(3)包括以下分 步骤(3. l)判断当前写请求是否在读写数据缓存空间中,是则转步骤(3. 7);(3.2) 根据(3.1)的返回值判断读写数据缓存空间是否需要腾空,否则转步骤 (3. 4);(3.3) 根据要腾空的读写数据缓存空间中的内容构造bio结构并提交给存储 设备,将存储数据写入存储设备;(3. 4)根据当前写请求的起始地址和数据长度构造bio链;(3. 5)依次将bio结构体从bio链中摘下,并根据bio链中的bio结构体的数量填写每个bio结构体中的私有数据域的参数和回调函数;(3.6) 将bio结构体提交给存储设备,执行写入数据的操作,当该操作完成 后,(3.5)步设置的回调函数被执行,以便释放本次I/()所占用的系统资源;(3.7) 当前写请求处理结束,转(2.1)继续进行下一"请求的处理。
6、 按照权利要求2的接口方法,其特征在于所述步骤(4)包括以下分 步骤(4.1) 清空该存储设备对应的读写数据缓存空间;(4.2) 释放读写数据缓存所占的内存资源;(4.3) 将对应的第一结构体从设备链表中摘除;(4.4) 释放第一结构体所占的系统资源;(4.5)存储设备卸载完毕,进程结束。
全文摘要
本发明公开了iSCSI目标器与存储设备的接口方法。将linux2.6内核中的数据结构的bio结构体和BIO接口方法应用于该iSCSI目标器与存储设备的接口方法中。bio结构体是linux2.6内核中最新定义的一系列数据结构之一。由于bio结构体描述的是I/O操作,它可以包括内存中的一个或多个页,相对于以前的buffer_head结构体,可以避免不必要的数据块的分割。并且由于bio结构体是轻量级的,它描述的I/O请求块可以分布在非连续的内存区。这种方法屏蔽了对不同的存储块设备的访问接口的差异性,对所有块级存储设备通用,而且还具有效率高、性能好、稳定性强的特点。
文档编号G06F9/44GK101266541SQ20071008742
公开日2008年9月17日 申请日期2007年3月16日 优先权日2007年3月16日
发明者任会波, 可 周, 曾令仿, 波 毛, 陈俭喜 申请人:武汉海恒信息存储有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1