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. 移动设备 小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法

    小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法 by:授客 QQ:1033553122 用户环境 操作系统:Win7 手机设备:小米2S   问题描 ...

  2. MySQL 性能监控4大指标——第一部分

    [编者按]本文作者为 John Matson,主要介绍 mysql 性能监控应该关注的4大指标. 第一部分将详细介绍前两个指标: 查询吞吐量与查询执行性能.文章系国内 ITOM 管理平台 OneAPM ...

  3. DDT模块

    转自: https://www.cnblogs.com/frost-hit/p/8277637.html Python DDT(data driven tests)模块心得   关于ddt模块的一些心 ...

  4. python 流程控制(while)

    1,while基本语法 2,while else语句 1,while基本语法 n = 1 while n<10: print n n += 1 2,while else语句 n =10 whil ...

  5. redie config 详解

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k => 1000 bytes# 1kb =&g ...

  6. Finding the source of signals on Linux with strace, auditd, or systemtap

    inux and UNIX® like operating systems commonly use signals to communicate between processes. The use ...

  7. 创建SQL Server数据库集群的经历

    自己尝试安装SQL Server集群和配置AlwaysOn可用性组,服务器系统是Windows Server 2012 R2,SQL Server是2014企业版,我的环境是一台服务器,然后用Hype ...

  8. 全面认识一下.NET 4.0的缓存功能 (转)

    转自:http://www.cnblogs.com/hjf1223/archive/2010/07/16/net_4_caching.html 很多关于.NET 4.0新特性的介绍,缓存功能的增强肯定 ...

  9. Asp连接Oracle (包含绿色版12.2客户端和ODBC驱动安装)

    我能操作的终端电脑是一台linux系统可以上互联网 ,服务器在部署在独立的私网上,不方便上互联网.服务器是2008R2.安装vs不是很方便.其所linux下作开发不是不可以,java php mono ...

  10. Orange Pi 3 GPIO 笔记

    这是我写过的最水的文章 设备:Orange pi H6,Pi 3 引脚图: (使用Wiringpi 查看GPIO) +------+-----+----------+------+---+Orange ...