tgt是用户态实现的iscsi target,而iet(iscsi enterprise target)是在内核态实现的target,tgt相比于iet来说,因为其用户态实现,方便调试,新加入一些功能等,不过性能相比iet来说要稍差一点。下面就介绍一下tgt的程序框架(略过iscsi协议解析处理部分),以便于整体把握tgt的代码,方便后续的一些修改。

1.整体框架

这里借用tgt官网给出的一张图。

tgt中命令的操作,与initiator端的通信都是通过epoll来实现的,下面分别对这两部分进行说明。

1.1 tgtadm与tgtd的交互

在启动tgtd进程的时候,就会初始化一个unix socket,将该fd加到epoll中,监听EPOLLIN事件,后续每执行一条tgtadm命令,就会使用这个unix socket来和tgtd通信。

如图所示,当在命令行里敲一条tgtadm命令时,通过unix socket发起请求,就会触发epoll 的EPOLLIN事件,tgtd端accept,将连接fd加到epoll中,并注册回调函数mtask_recv_send_handler,返回连接建立的响应给tgtadm端,然后tgtadm命令触发EPOLLIN事件,tgtd端调用mtask_recv_send_handler,根据不同的mode调用不同的处理函数进行处理(这里有sys_mgmt/target_mgmt/portal_mgmt等),处理完后,将事件改为EPOLLIN|EPOLLOUT,然后发送响应给tgtadm端。

1.2 initiator与tgtd的交互

tgtd进程在启动的时候就会创建一个socket,用于监听initiator的请求(具体是iscsi_tcp_init_portal函数中的处理),将该socket加到epoll中,注册回调函数accept_connection。 initiator端的请求到来时,将新连接的fd加到epoll中,并注册回调函数iscsi_tcp_event_handler,然后当收到EPOLLIN事件时,会调用iscsi_rx_handler进行iscsi请求的一些解析处理操作,并调用backing store的接口进行io的操作,操作完成后,修改事件为EPOLLLOUT,就会触发调用到iscsi_tx_handler来发送响应给initiator。

1.3 函数调用栈

下面给出了iscsi_rx_handler的一些函数调用栈关系,其中涉及到与backing store中io处理接口的调用关系。给出下图作为参考。

2. backing store

tgt支持多种后端存储,比如rdwr,aio,sg,rbd,sheepdog等,默认的是rdwr,可以指定flag(O_SYNC|O_DIRECT)。了解清楚tgt的后端存储的处理模式,就可以添加新的后端存储用于支持自定义的功能。

其中主要的接口就是bs_open,bs_init,bs_cmd_submit,bs_close,bs_exit。 bs_open和bs_init就是做创建lun时的一些初始化操作,比如打开设备文件,创建处理现线程,注册处理回调函数等。 bs_cmd_submit:io请求到来时就会调用该函数进行处理。 bs_close和bs_exit就是删除lun的时候做一些销毁操作。 BS中支持同步和异步io两种模式(rdwr就是同步的,aio就是异步的),下面分别介绍这两种模式。

2.1 同步io

在同步io中,每个lun都会对应一个请求队列(pending_list),在bs_init时就会创建多个线程(目前新版本一个lun默认16个线程)。新请求到来时,调用bs_cmd_submit将请求添加到pending_list中,多个线程共享这个pending_list,分别从pending_list中取请求来进行处理。当没有请求时,这些线程就会等待在pending_list上,有新请求加入到pending_lsit后,就会唤醒等待的线程来进行处理。

2.2 异步io(aio)

tgt使用的是linux native aio来实现的,使用eventfd创建的fd将aio上下文和epoll联系起来。(具体可以参考aio与epoll结合起来如何使用的一些资料)。下面是一些具体的处理逻辑。

1)bs_aio_open:io_setup建立异步io上下文,然后afd=eventfd() ,将afd加到epoll中(回调函数bs_aio_get_completions) ,并且afd与aio的上下文关联。

2)bs_aio_cmd_submit:IO到来时调用,先把请求加到cmd_wait_list中,然后遍历list,确定此次能提交的io数并初始化iocb(因为限制了aio的最大处理个数为128,有些io还在处理中,当前提交的aio个数就有限),然后使用io_submit提交一批异步io。

3)IO处理完后,会通过afd触发EPOLLIN事件,调用回调函数bs_aio_get_completions进行处理,先read出当前完成的io数,然后调用io_getevents()获取出已完成io的信息,然后对每个完成的io调用bs_aio_comlete_one做一些结束的处理(修改处理状态),在这个函数中调用target_cmd_io_done,在target_cmd_io_done中会修改epoll的事件为EPOLLIN|EPOLLOUT,这样就会触发了EPOLLOUT事件,调用iscsi_tcp_event_handler,在这个函数里判断如果是EPOLLOUT,就会调用iscsi_tx_handler来发送响应。

3. 参考资料

http://stgt.sourceforge.net/ 
http://www.lenky.info/archives/2013/01/2183

转载:

http://www.sysnote.org/?p=170

iscsi target tgt架构的更多相关文章

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

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

  2. iscsi target IET架构

    IET(iSCSI Enterprise Target)是内核态实现的iscsi target,相比于用户态实现的target(比如tgt),iet比较稳定,并且也算是历史悠久,io都直接经过内核态, ...

  3. iscsi介绍及iscsi target配置

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

  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. iscsi target 之LIO配置

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

  7. iscsi target 研究

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

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

    LUN是逻辑单元号,它与iSCSI存储服务器共享.iSCSI 目标器通过TCP/IP网络共享它的物理驱动器给发起程序(initiator).这些来自一个大型存储(SAN:Storage Area Ne ...

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

    iSCSI 是一种块级别的协议,用于通过TCP/IP网络共享原始存储设备,可以用已经存在的IP和以太网如网卡.交换机.路由器等通过iSCSI协议共享和访问存储.iSCSI target是一种由远程iS ...

随机推荐

  1. 【代码笔记】iOS-密码在进入后台1小时后重新设置

    代码: AppDelegate.m #import "AppDelegate.h" #import "ViewController.h" @interface ...

  2. 【读书笔记】iOS-网络-HTTP-URL结构

    http://user:password@hostname:port/absolute-path?query. http:  协议 user:password@   认证 hostname:  主机名 ...

  3. 在vue项目中,通过v-for循环,动态添加后台返回的事件

    一.现有一种业务需求,前端的某个元素添加点击事件,但事件是后台返回的(不确定),需要动态添加,下面是具体思路: .假定后台返回数据为如下格式: list: [ { name: '李寻欢', kungF ...

  4. Echarts图表常用功能配置,Demo示例

    先看下效果图: 就如上图所示,都是些常用的基本配置. Legend分页,X轴设置,Y轴设置,底部缩放条设置, 数值显示样式设置,工具箱设置,自定义工具按钮, 绑定点击事件等等.这些配置代码中都做了简单 ...

  5. SQLServer 学习笔记之超详细基础SQL语句 Part 1

    Sqlserver 学习笔记 by:授客 QQ:1033553122 1创建数据库 格式: CREATE DATABASE database_name ON PRIMARY(在组文件组中指定文件) ( ...

  6. Android 如何执行java命令

    android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了 ...

  7. 《图解HTTP》

    第一章.了解web及网络基础 1.2 http的诞生 HTTP于1990年问世,那时候HTTP并没有作为正式的标准被建立,被称为HTTP/0.9 HTTP正式作为标准被公布是在1996年5月,版本被命 ...

  8. 10款jQuery文本高亮插件

    [编者按]本文作者为 Julian Motz,主要介绍十款 jQuery 文本高亮插件的现状.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 很多应用或网站都为用户提供搜索关键词的方法.为了 ...

  9. python 复制文件到其他路径

    #!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/11/7 16:34 # @Author : ChenAdong # @Ema ...

  10. Yearning v1.3.0 发布,Web 端 SQL 审核平台

    企业级MYSQL web端 SQL审核平台. Website 官网 www.yearning.io Feature 功能 数据库字典自动生成 SQL查询 查询工单 导出 自动补全,智能提示 查询语句审 ...