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架构的更多相关文章

  1. iscsi target tgt架构

    tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能 ...

  2. iscsi介绍及iscsi target配置

    iSCSI 主要是透过 TCP/IP 的技术,将储存设备端透过 iSCSI target (iSCSI 目标) 功能,做成可以提供磁盘的服务器端,再透过 iSCSI initiator (iSCSI ...

  3. CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd

    目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...

  4. ISCSI target的两种安装方法

    1 tgt程序架构 tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便 ...

  5. Linux tgtadm: Setup iSCSI Target ( SAN )

    Linux target framework (tgt) aims to simplify various SCSI target driver (iSCSI, Fibre Channel, SRP, ...

  6. 在Ubuntu 12.04上配置iSCSI Target服务

      今天自己按照网上搜来的教程自己在Ubuntu 12.04上配置了iSCSI Target服务,在这里简单地做个纪录.操作系统是全新安装的Ubuntu 12.04,配置一块500 GB的SATA笔记 ...

  7. iscsi target 之LIO配置

    LIO 配置 现在主流Linux都可以设置iSCSI,如STGT/TGT.LIO Target等.Linux-IO(LIO)Target是当前Linux标准的iSCSI target的开源实现,包含在 ...

  8. iscsi target 研究

    一.概述 目前 Linux 上主要有三个 iSCSI Target 实现: Linux SCSI Target – STGT / tgt     Linux-IO Target – LIO SCST ...

  9. linux iSCSI target/initiator配置

    linux iSCSI target配置全过程一:Install iSCSI target for Linux1,操作系统:[root@rac2 ~]# cat /etc/issueEnterpris ...

随机推荐

  1. ajax请求json数据跨域问题(转)

    一.后台代理技术 由服务器端向跨域下的网站发出请求,再将请求结果返回给前端,成功避免同源策略的限制. 具体操作如下: 1.在localhost:81/a.html中,向同源下的某个代理程序发出请求 $ ...

  2. OSGI企业应用开发(三)Eclipse中搭建Equinox运行环境

    上篇文章介绍了如何在Eclipse中搭建Felix的运行环境,我们需要將Bundle发布到Felix框架的bundle目录下,Felix框架启动时才会自动加载这些Bundle,否则需要在Felix框架 ...

  3. atitit.交换机 汇聚上联、网络克隆和标准共享的原理与区别

    atitit.交换机 汇聚上联.网络克隆和标准共享的原理与区别 1. 标准共享(标准化模式)1 2. 汇聚上联trunk1 2.1. 使用场合1 2.2. 背景1 2.3. 实现原理2 3. 网络克隆 ...

  4. 解决 web.xml is missing and <failOnMissingWebXml> is set to true 报错

    在学习maven模块化构建项目的时候遇到了如下报错信息: web.xml is missing and <failOnMissingWebXml> is set to true. 这时候需 ...

  5. 构建第一个SpringBoot工程

    学习和使用 SpringBoot 有一段时间了,现在开始陆陆续续会总结归纳 SpringBoot 学习中遇到的相关知识点. SpringBoot 设计目的是用来简化新Spring应用的初始搭建以及开发 ...

  6. 前端开发使用Photoshop切图详细步骤

    切图的主要目的是从设计师提供的psd中获取网页制作所要的资源 一.界面设置 1. 新建文件,调整界面大小,背景设置为透明 2. 自动选择,把组切换为图层 3. 添加窗口内容,一共四项:图层.历史纪录. ...

  7. CAC的Debian-8-64bit安装BBR正确打开方式

    装过三台debian 64 bit, CAC, 2欧, KVM虚拟机 做法都一样---下面说下正确安装方式   0. 有装锐速记得先删除,免得换核心后,锐速在扯后腿.   1.换4.9版kernel ...

  8. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

  9. win10连接外接鼠标怎么禁用触摸板

    Win10笔记本如何禁用触摸板呢?Win10笔记本如何设置“插入鼠标自动禁止触摸板功能”呢?虽然笔记本触摸板在一定程度上可以方便我们的 操作,但是在以鼠标和键盘做为重要的输入设备的情况下,笔记本触摸板 ...

  10. 51nod 1636 教育改革

    题目链接 令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量. 那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1] ...