iSCSI Enterprise Target,简称IET. 是开源的iSCSI Target软件,西方在源码阅读基础上获得,可由http://iscsitarget.sourceforge.net/获取。
IET,由用户层模块和内核层模块共同组成,它们之间通过NETLINK机制进行通信。
一、用户模块(ietd daemon)
它是IET的管理工具,主要功能可描述为:
1)用来配置参数信息,如iSCSI Target的端口、uid、gid等;
2)从iSCSI Target配置文件/etc/ietd.conf中读取配置信息,提交给内核模块;
二、内核模块(iscsi_trgt.ko)
IET的绝大部分工作是在内核完成,如数据的接收、发送,而在用户态主要完成会话的建立和授权、登录等。包含了很多功能模块,描述如下:
1)IOTYPE
负责建立导出到iSCSI Initiator的iSCSI Lun. 设备类型(或者说,设备IO类型),如fileio/blockio,就在这个模块注册。
用户态程序ietd daemon与此模块通信,内容包括具体的配置信息,详情可参看/etc/ietd.conf.
这种模块化的实现方式,使设备类型可方便的进行扩展。在此模块中注册新的设备类型,根据定义良好的接口,编写相应类型的IO处理函数,就能方便地实现不同类型的存储,如key/value存储等。
2)NTHREAD(Network Thread)
负责:
监听来自iSCSI Initiator的iSCSI Request;
接收iSCSI Request;
初始化iSCSI Command结构和相应的LUN参数;
分配数据缓存(struct tio,是当前网络线程对接收到的用户数据的封装,充当了底层存储和网络收发数据的中间接口);
处理r2t数据,如果需要(r2t,指有响应数据需要回复iSCSI Initiator的情况);
3)WTHREAD(Worker Thread)
主要与NTHREAD交互,负责:
处理NTHREAD生成的iSCSI Command;
命令可以被分成两类:与设备类型相关/不相关;
对每一个命令,会有一个回调函数对应,WTHREAD在处理命令的时候调用。与设备类型相关的命令,会调用与注册的设备类型相关的回调函数,如fileio/blockio
4)iSCSI Response模块
处理完一条命令后,WTHREAD将处理用回调函数方式转移到响应模块。在错误发生时,它会根据错误类型发送SCSI sense数据。如果有响应数据,就以发送r2t的方式向Initiator回复数据。
5)
三、对iSCSI mod的理解
1)blockio
网络传过来的数据包被组织成了struct tio(一个包含多个struct page的数据结构,只是对多个页的封装),然后经过block_io.c中的请求处理函数blockio_make_request,生成bio后直接submit_bio到通用块层。
其实,就是iscsi_mod替代了VFS层注册了自己的方法去处理用户态数据(由自己分配内存页,然后生成bio结构)。
2)fileio
仍然通过VFS,由通用的read/write系统调用进行数据读写
参考:http://www.software112.com/products/iitk-osd-simulator.html