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 ...
随机推荐
- WebSerivce与WebAPI的区别
一.什么是Web Service Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应 ...
- ionic 项目内部更新用到的插件,退出app插件
一 cordova-plugin-app-version插件 用来获取APP版本 ionic plugin add cordova-plugin-app-version -----cordova-p ...
- .net core项目初建
电脑装Visual Studio2017,并升级版本.启动一个.net core 的项目. NET Core基本介绍 1.1 什么是ASP.NET Core ASP.NET Core 是一个全新的开源 ...
- 巧用top percent优化top 1
废话不多说,直接上sql B.CREW_ID, E.CREW_NAME,C.OFFBLK,C.ONBLK,dbo.PEK_OPS_Date(A.STD) as STD FROM dbo.FLIGHTS ...
- JAVA 连接 SQL Server 2008:java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
新项目需要修改Java开发的MES系统...Java忘的也差不多了...简单尝试以下JAVA连接SQL Server吧,没想到坑还是很多的.以前直接连oracle时没有这么多麻烦啊....可能微软和o ...
- Linux系统优化之设置swappiness值提高MySQL查询性能
对MySQL来说,操作系统层面的优化也可以值得考虑一下:就是swappiness. swappiness的大小主要对如何使用swap分区有着密切的联系. 来看一下: [root@chaofeng ~] ...
- 不使用 vue-cli 与 vue 模版,使用 Vue2.x + webpack4.x 从零开始一步步搭建项目框架
说明 这是我根据慕课网上的一个课程 Vue+Webpack打造todo应用 过程一步步搭下来的框架,去掉了业务相关的逻辑. 项目最终的效果包括了引入vue框架:使用CSS预处理器:使用babel:引用 ...
- C++类中的特殊成员函数-------复制构造函数
在C++中存在一个特殊函数,他就是复制构造函数,假如我们有类A,如果有A a;A b=a; 在这种情况下利用A类变量a来给同是A类变量的b来赋值,这个时候类会使用复制构造函数,如果我们不显式声明复 ...
- [Python] 启动 uiautomatorviewer2之后,连接成功后重新 reload画面时提示 ('Connection aborted.', error(10054, ''))
[问题] 出现该问题不管是重启手机还是启动手机里面 uiautomator的服务,都无济于事,只有通过下面方法进行重新初使化方能解决问题 [解决方法] 在命令窗口执行如下命令 python -m ui ...
- 【Ansible 文档】【译文】Windows 支持
see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...