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 ...
随机推荐
- 【代码笔记】iOS-播放从网络上下载的语音
代码: ViewController.m #import "ViewController.h" //录音 #import <AVFoundation/AVFoundation ...
- CSS隐藏多余的文字
效果: <p><strong>商品名称:</strong>新鲜现摘云南绥江半边红李子甜脆脱骨李6斤当季绿色有机水果包邮</p></div> ...
- 关于Mysql数据库的知识总结
2017年6月8日,天气阴.心情晴. 连续做梦两个晚上了,昨晚竟然梦见一个很长时间不联系的初中同学了,早上上班的路上聊了聊.女孩现在出差在贵州,风景秀美的地方.我说“你现在生活很滋润”.女孩说“那是你 ...
- 使用CDN做网站的内容加速
1.什么是CDN: CDN的全称是Content Delivery Network,中文的意思就是内容分发网络,简单的讲通过现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的 ...
- 安卓基础之Sqlite数据库最最基础操作
Sqlite数据库基础操作 摘要:在应用中新建一个数据库,并创建一个数据表写入数据,然后读取表中数据并展示. 主要逻辑: 1.通过继承SQLiteOpenHelper自定义类,定制数据库的表结构,初始 ...
- GenyMotion the virtual device got no ip address 问题解决
不要再找答案了 升级你的virtual box到最新版本(目前是 5.0.26,已通过) 如果你是windows 10系统 必须关闭hyper-v 在管理员命令行下运行bcdedit /set hyp ...
- 【three.js练习程序】鼠标滚轮缩放
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Pytest+Allure环境的搭建
参考博客 测试报告解释 pytest+allurre进阶 1. pytest的安装: 1.1. windows下: pip install pytest 1.2. linux下: pip instal ...
- [CENTOS7] 将域群组加入到Sudoer里
文章来源:https://derflounder.wordpress.com/2012/12/14/adding-ad-domain-groups-to-etcsudoers/ Adding AD d ...
- 初识java内存区域
目录: 1.运行时数据区域 2.对象的创建 3.对象的内存布局 4.对象的访问定位 一.运行时数据区域 基本的java虚拟机运行时数据区如下图: 下面我们就来逐个认识这几个运行时的数据区域 1.程序计 ...