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端的设备。

iscsi target IET架构的更多相关文章
- iscsi target tgt架构
tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能 ...
- iscsi介绍及iscsi target配置
iSCSI 主要是透过 TCP/IP 的技术,将储存设备端透过 iSCSI target (iSCSI 目标) 功能,做成可以提供磁盘的服务器端,再透过 iSCSI initiator (iSCSI ...
- CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd
目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...
- ISCSI target的两种安装方法
1 tgt程序架构 tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便 ...
- Linux tgtadm: Setup iSCSI Target ( SAN )
Linux target framework (tgt) aims to simplify various SCSI target driver (iSCSI, Fibre Channel, SRP, ...
- 在Ubuntu 12.04上配置iSCSI Target服务
今天自己按照网上搜来的教程自己在Ubuntu 12.04上配置了iSCSI Target服务,在这里简单地做个纪录.操作系统是全新安装的Ubuntu 12.04,配置一块500 GB的SATA笔记 ...
- iscsi target 之LIO配置
LIO 配置 现在主流Linux都可以设置iSCSI,如STGT/TGT.LIO Target等.Linux-IO(LIO)Target是当前Linux标准的iSCSI target的开源实现,包含在 ...
- iscsi target 研究
一.概述 目前 Linux 上主要有三个 iSCSI Target 实现: Linux SCSI Target – STGT / tgt Linux-IO Target – LIO SCST ...
- linux iSCSI target/initiator配置
linux iSCSI target配置全过程一:Install iSCSI target for Linux1,操作系统:[root@rac2 ~]# cat /etc/issueEnterpris ...
随机推荐
- iframe页面刷新问题
1.问题:当iframe的页面加载过再关闭之后,如果iframe的src没有发生变化,js不会重新加载,再次打开页面不会刷新: 2.解决方法:关闭页面时清空src,再次打开时即可重新加载最新数据. $ ...
- java发起HTTP请求的共用类
一定要注意编码,请求时,content-type里的编码,仅仅是流的编码,而结果的编码类型,则是流转化为字符串是需要设定的. 以下是3种使用get/post的方式: import java.io.Bu ...
- VS2017写代码时几个常用的快捷键
说明:组合键是同时按,非组合键是按住Ctrl依次按后面的键1.格式化 格式化全部代码 Ctrl+A+K+F 格式化选中的代码 Ctrl+K+F 2.注释代码 注释代码 ...
- autocad.net-图片打印合成
调用打印程序“PublishToWeb JPG.pc3”进行图片打印,该打印驱动程序中内置了很多的打印方案,在同尺寸的打印方案下,数据范围越大打印出来的清晰度就越差,内置的尺寸不一定都满足,在又要通过 ...
- oracle 忘记了scott用户的密码,该怎么修改
sqlplus / as sysdba,进入sys用户下,alter user scott identified by 123456,改成自己需要的密码
- 为 Azure Resource Manager 中的虚拟机设置 WinRM 访问权限
Azure 服务管理中的 WinRM 与 Azure Resource Manager Note Azure 具有用于创建和处理资源的两个不同的部署模型:Resource Manager 和经典. 本 ...
- Oracle EBS 用户职责人员取值
SELECT fu.user_name 用户名, fu.description 用户说明, fu.start_date 用户启用日期, fu.end_date 用户终止日期 --,fu.employe ...
- C# 倒计时
c#中有一个叫做timespan的数据类型,可以这样构造: TimeSpan ts = , , ); TimeSpan(hour,minute,second); 然后拖进去一个timer,叫timer ...
- 【JAVA】使用 jedis操作redis——连接、存储数据、切库等
本篇运用Java调用jedis包(jedis在线文档API ),做简单操作实例. 安装jedis 1. 2.9.0 jar 版本下载: jedis-2.9.0.jar 2. 新建项目,添加该驱动包 连 ...
- 【MySQL运维实践】
什么是日志 日志(log)是一种顺序记录事件流水的文件 记录计算机程序运行过程中发生了什么 多种多样的用途 帮助分析程序问题 分析服务请求的特征.流量等 判断工作是否成功执行 等等…… MySQL日 ...