iscsi target IET架构

IET(iSCSI Enterprise Target)是内核态实现的iscsi target,相比于用户态实现的target(比如tgt),iet比较稳定,并且也算是历史悠久,io都直接经过内核态,性能比较好。本文主要针对IET的程序架构,从程序模块,命令操作处理流程,initiator与target的交互,I/O处理流程进行分析。

1.程序模块

IET包含3部分:ietadm,ietd,iscsi_trgt,其中ietadm是命令行工具,提供target,lun的创建、删除、参数设置等操作;而ietd是一个用户态程序,用于和ietadm以及initiator的交互,并进行对应的处理,iscsi相关的发现、登录、认证、登出等操作都在用户态实现;iscsi_trgt是一个内核模块,iscsi协议的解析处理,I/O处理都在这个内核态模块内完成。

1)ietdadm与ietd通过IPC进行交互,IPC在ietd程序启动的时候进行初始化;
2)ietd启动的时候还会创建监听socket(默认的端口是3260,并且会为该机器上的每个ip都生成一个监听socket,initiator在发现target的时候会指定ip和port),initiator就通过socket与ietd进行交互,一个initiator和一个target建立起一个长连接(iscsi协议标准说的是至少1个连接),后续的I/O都是通过这个连接进行交互;
3)ietd与iscsi_trgt使用ioctl进行交互,一些操作(比如创建删除target,创建删除lun等)都由ietd在用户态进行处理后,将命令通过ioctl发到iscsi_trgt,然后iscsi_trgt在内核态下进行相关处理;

 

2.initiator与iet的交互

initiator向ietd发起请求,ietd根据请求的类型进行相关处理,在ietd进程主要进行的是discovery、login、auth、logout等登录认证的操作,有需要的情况下ietd会将命令发到iscsi_trgt进行处理。这里以iscsi login为例来简单分析处理流程。

如图所示,initiator发起login请求到ietd,ietd收到login请求,初始化连接信息(conn),并进行login的对应处理,然后初始化session,完成后,ietd使用ioctl通过iscsi_trgt在内核态去创建session,完成后返回给ietd,然后ietd返回给initiator响应信息;之后ietd通知iscsi_trgt接管fd,iscsi_trgt就会在内核初始化连接(conn),这个连接直接与用户态ietd使用的那个fd关联,直接使用了这个fd对应的内核sock,后续initiator端的I/O就直接通过这个内核sock与iscsi_trgt进行交互。

3.I/O处理

在介绍I/O处理流程之前,先要了解一下每个target所对应的内核线程。

在创建target的时候,iscsi_trgt内核模块就会为这个target分配一个网络线程nthread(名字叫istd,比如target id是1000,那么ps的时候就可以看到“istd1000”这样的进程),并且会分配若干个工作线程wthread(名字叫istiod),默认是8个,可以通过参数配置的。网络线程会进行iscsi协议的解析处理,处理完成后放入工作队列(work_queue),并且唤醒工作线程,多个工作线程共用这个work_queue,从work_queue里取cmnd来进行对应的处理。

如图所示,在initiator端对iscsi设备进行io读写的时候经过文件系统、块设备到SCSI子系统,最后由SCSI low layer里的iscsi_tcp模块通过网络发送I/O请求到iscsi_trgt,iscsi_trgt里对应的target的连接的sock收到请求,回唤醒对应target的nthread,然后nthread进行协议的解析,处理完后将cmnd放到工作队列work_queue,并且唤醒wthread,wthread从队列里取cmnd,然后根据请求类型进行对应的处理(具体是在target_disk.c里的disk_execute_cmnd,包括INQUIRY、REPORT_LUNS、READ_CAPACITY、MODE_SENSE、READ_6/READ_10/READ_16、WRITE_6/WRITE_10/WRITE_16、SYNCHRONIZE_CACHE等对应请求的处理),比如读写处理,会走到后端存储类型(nullio,blockio,fileio)的具体处理流程:就是通过make_request指向到对应的request处理函数,比如blockio里的blockio_make_request,然后构造bio,调用submit_bio下发到底层磁盘设备进行处理;如果是fileio,就是调用vfs_read/vfs_write进行处理,I/O完成后,构造iscsi response放到到write_list(也是每个连接一个write_list,也就是说不同target不一样),唤醒nthread来进行iscsi response的相关处理,最后通过sock将相应发到initiator端的设备。

时间: 2024-10-26 22:54:33

iscsi target IET架构的相关文章

iscsi target tgt架构

tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能等,不过性能相比iet来说要稍差一点.下面就介绍一下tgt的程序框架(略过iscsi协议解析处理部分),以便于整体把握tgt的代码,方便后续的一些修改. 1.整体框架 这里借用tgt官网给出的一张图.   tgt中命令的操作,与initiator端的通信都是通过epoll来实现的,下面分别对这两部分

ISCSI target的两种安装方法

1 tgt程序架构 tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能等,不过性能相比iet来说要稍差一点. 1)安装tgt CentOS 自带了scsi-target-utils 软件,我们使用该软件进行target设置. # yum -y install scsi-target-utils 2 )规划共享的iscsi target文件名 通常的

iSCSI的配置全攻略(ISCSI Target/initiator)

1.Target端的配置 target端即磁盘阵列或其他装有磁盘的主机.通过iscsitarget工具将磁盘空 间映射到网络上,initiator端就可以寻找发现并使用该磁盘. 注意,一个target主机上可以映射 多个target到网络上,即可以映射多个块设备到网络上. 1)软件包 iscsitarget 可以从 http://sourceforge.net/projects/iscsitarget/files/下载最新版本. 2)编译安装 很简单 ,解包,编译,安装就可以. tar zxvf

iSCSI Target和Initiator安装与操作步骤详解

iSCSI Target 编译安装过程 1. 解压: tar zxvf iscsitarget-1.4.18 .t ar.gz 2. cd iscsitarget-1.4.18 3. Linux2.6.32的内核太新了最新的 iSCSI Target 版本 1.4.18 还没有支持,网上有高手做了相应的补丁,于是打上补丁 patch -p1 <iscsitarget-1.4.18+linux-2.6.32.patch 4. 编译: make KSRC= /usr/src /linux-2.6.3

Windows Storage Server 2008 x64和iSCSI Target 3.2下载发布

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   微软Windows Storage Server 2008是在Windows Server 2008的基础上经过优化的可靠和灵活的文件服务,能够提供更好的文件服务性能.微软在其上增加了先进的存储技术,如文件的重复数据删除和iSCSI Software Target,以及存储设备内基于文件块的存储和打包传输.同样的,微软的合作伙伴会提供专门的硬件,推出更多的软件组

LiveMigration实战之三:ISCSI Target部署配置

我们已经搭建了一个域,而且在域内的两台计算机上部署了Windows Server 2008 R2.本文中我们准备让Windows Storage Server 2008除了担当域控制器外,还要行使另外一个职能:充当群集的共享存储.Windows Server 2008 R2能支持虚拟机的动态迁移,关键是要让虚拟机存储在群集共享卷中.群集共享卷指的是由群集内的每个节点都能共同访问的一个存储设备,我们在本次实验中准备用Windows Storage Server 2008来模拟这个存储设备. 从微软

使用iSCSI Target创建集中式安全存储(一)

使用iSCSI Target创建集中式安全存储(一) iSCSI 是一种块级别的协议,用于通过TCP/IP网络共享原始存储设备,可以用已经存在的IP和以太网如网卡.交换机.路由器等通过iSCSI协议共享和访问存储.iSCSI target是一种由远程iSCSI服务器(target)提供的远程硬盘. 在Linux中安装iSCSI Target 我们不需要占用很大的资源就可以为客户端提供稳定的连接和性能.iSCSI服务器称为"Target(目标器)",它提供服务器上的存储共享.iSCSI客

在 iSCSI Target 服务器中使用LVM创建和设置LUN(二)

在 iSCSI Target 服务器中使用LVM创建和设置LUN(二) LUN是逻辑单元号,它与iSCSI存储服务器共享.iSCSI 目标器通过TCP/IP网络共享它的物理驱动器给发起程序(initiator).这些来自一个大型存储(SAN:Storage Area Network)的驱动器集合称作LUN.在真实环境中LUN是在LVM中定义的,因为它可以按需扩展. 在目标器中使用 LVM 创建 LUN 为什么使用LUN? LUN用于存储,SAN存储大多数由LUN的集群来组成存储池,LUN由目标器

linux iSCSI target/initiator配置

linux iSCSI target配置全过程一:Install iSCSI target for Linux1,操作系统:[root@rac2 ~]# cat /etc/issueEnterprise Linux Enterprise Linux AS release 4 (October Update 4)Kernel r on an m [root@rac2 /]# uname -aLinux rac2.mycorpdomain.com 2.6.9-42.0.0.0.1.ELsmp #1