1. iSCSI简介

从协议层次的角度看,通常所说的SCSI通常是指一组包含块命令、控制器管理、系统命令和enclosure服务等内容的协议规范,对应于回话层;而其下的物理通道和链接方式就对应在数据链路层,SCSI命令可以通过串口、Fibre Channel、SAS、infiniband、Internet、USB、PCIE等进行传输。iSCSI就是一种把异地存储资源通过TCP/IP网络映射到本地逻辑存储设备的SCSI实现。不同于NFS向用户提供按文件为单位访问远程存储的方式,它向用户提供了以块方式访问远程存储资源的接口,也就是说用户可以在本地/dev/下看到iSCSI映射后的磁盘。通常所说的target端是指远端存储资源所在的主机,比如存储服务器;而initiator端是指链接到target端并会访问远端存储资源的节点。


2. iSCSI target管理工具的特点

基于iSCSI的网络属性,很直观地我们能想到它基本上是基于server-client模型。提供存储资源的target相当于server,而使用远程存储资源的initiator端相当于client。基于现有的iSCSI协议规范,能够开发出target端和initiator端工具。在Linux系统上,initiator端工具可以用iscsiadm,目前大部分os都自带有这款工具;而target端的工具由于直接和性能和存储管理相关,数量更多,目前常见的有targetcli、targetadm、ietadm,它们各有所长,分别能适用不同的场合。


2.1小巧玲珑的LIO targetcli

相对而言,targetcli是最新的target管理工具,内核态基于Linux 2.6.38开始引入的Linux IO Target,用户态提供了targetcli命令和python开发库rtslib,为用户提供了友好的操作界面。为此,现在大部分Linux OS发现版本默认都自带了LIO targetcli。在缺省没有安装的linux OS上,用户可以参考下面的命令进行安装:

yum install targetcli.noarch


如果重启后,发现target异常,需要检查下面两个后台服务是否开启:

systemctl start targetd.service

systemctl start target.service


在target管理方面,用户既可以使用下面的界面进行LUN的创建删除等操作:

[root@localhost usr]# targetcli

targetcli shell version 2.1.fb37

Copyright 2011-2013 by Datera, Inc and others.

For help on commands, type 'help'.


/> ls

o- / ......................................................................................................................... [...]

o- backstores .............................................................................................................. [...]

| o- block .................................................................................................. [Storage Objects: 0]

| o- fileio ................................................................................................. [Storage Objects: 0]

| o- pscsi .................................................................................................. [Storage Objects: 0]

| o- ramdisk ................................................................................................ [Storage Objects: 0]

o- iscsi ............................................................................................................ [Targets: 0]

o- loopback ......................................................................................................... [Targets: 0]


也可以参考下面的步骤一步一步用shell命令或者脚本进行创建(当然还可以用python rtslib直接进行二次开发):


#!/bin/bash

## Clean original setting

targetcli clearconfig confirm=True


# Remove all original config #

targetcli clearconfig confirm=True

targetcli /backstores/block create ssd_vol1 /dev/sdc3


#targetcli /iscsi create

iscsiname=`targetcli /iscsi create | grep "Created" | head -n1 | awk '{print $3}'`;

iscsiname=${iscsiname%.*}

echo "Hi, iscsiname is $iscsiname"


# /backstores/block/my_vol1

targetcli /iscsi/${iscsiname}/tpg1/luns create /backstores/block/ssd_vol1


targetcli /iscsi/${iscsiname}/tpg1 set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1


targetcli /iscsi/${iscsiname}/tpg1/portals delete 0.0.0.0 3260

[[ $? != 0 ]]  && targetcli /iscsi/${iscsiname}/tpg1/portals/ delete 0.0.0.0 3260 confirm=True


targetcli /iscsi/${iscsiname}/tpg1/portals create 192.168.1.115 3260


2.2功能完备的tgtadm

在LIO出现之前,tgtadm是首选的target管理工具,被用到企业存储解决方案当中。除了LUN管理、ACL控制等功能之外,它还提供了对已连接上的initiator的检测和iSNS服务的支持。虽然界面没法和LIO的targetcli相比,但是不乏功能强大的命令来完成各种操作。


用户可以通过下面的命令来安装它:

yum install scsi-target-utils.x86_64

同样tgtadm后台依赖于tgtd的默默运行,虽然你可以打开debug选项来调试。


下面给出了常用命令的一些例子:

创建一个target:

tgtadm --lld iscsi --op new --mode target --tid 2 -T iqn.2016-09.com.sborst:storage.sdc3

往target里面新建一个lun:

tgtadm --lld iscsi --op new --mode logicalunit --tid 2 --lun 1 -b /dev/sdc3

用下面的命令可以显示刚创建的target和lun:

tgtadm --lld iscsi --op show --mode target

在target端可以通过类似下面的命令来添加portal信息:

tgtadm --lld iscsi --op new --mode portal --param portal=10.1.1.111:3260

添加ACL列表:

tgtadm --lld iscsi --op bind --mode target --tid 2 -I ALL, 效果如下图:




三种iSCSI target管理工具的比较_第1张图片此时在initiator端发现能扫描并连接到两个target上去。

接着可以验证是否能够登陆:

iscsiadm --mode discoverydb --type sendtargets --portal 10.1.1.111 --discover

iscsiadm --mode node --targetname iqn.2016-09.com.sborst:storage.sdc3  --portal 10.1.1.111:3260 --login


设置target的CHAP:


A.新建一个CHAP账户

tgtadm --lld iscsi --op new --mode account --user test --password abc123

绑定该用户到target 2:

tgtadm --lld iscsi --op bind --mode account --tid 2 --user test

此时可以看到Target 2里面的user account 已经有test了


B.看chap是否工作,在远端测试initiator能否再次登录到targte2上:

发现有CHAP的target 2不能登录,而没有设置CHAP的target1照常可以登录成功。


删除一个lun: (注意所有target的lun0不能删去,lun0是系统默认的配置信息)

tgtadm --lld iscsi --op delete --mode logicalunit --tid 2 --lun 1


完了用命令tgtadm --lld iscsi --op show --mode target 可以看到target2的卷少了一个。


删除一个target:

运行下面的命令可以删除target 2: tgtadm --lld iscsi --op delete --mode target --tid 2

用tgtadm --lld iscsi --op show --mode target命令检查会发现target2不见了。


2.3精益求精的ietadm

tgtadm创建的SCSI设备实际都是在用户态中实现的,存在性能瓶颈。为了解决这个问题,企业级别的target管理工具((iSCSI Enterprise Target) 营运而生,它依赖内核模块iscsi_trgt.ko来帮助iSCSI设备的创建。此外,ietadm提供了以配置脚本的方式来设置和管理target及权限,还提供了显示discovery列表的功能。


从https://sourceforge.net/projects/iscsitarget/files/latest/download?source=typ_redirect

载到源代码之后,整个目录是这个样子的:

[root@localhost iscsitarget-1.4.20.2]# ls

ChangeLog dkms.conf  etc      iscsitarget.spec  Makefile  README             README.mcs     RELEASE_NOTES

COPYING   doc        include  kernel            patches   README.initiators README.vmware  usr


用户可以make && make install, 然后make生成ietadm和它依赖的后台服务ietd。接着启动ietd服务后,就可以创建自己的LUN和ACL了。根据http://czmmiao.iteye.com/blog/2055805的描述,还有许多脚本可以用来控制哪些initiator可以discovery target,可以参考下面的描述:


/etc/init.d/iscsi-target iscsitarget的启动脚本
/etc/ietd.conf iscsitarget的配置文件
/etc/initiators.allow控制initiator对target的访问权限。
/etc/initiators.deny控制initiator对target的访问权限。
/etc/iet/targets.allow控制不同target的被访问权限。
/etc/ietd.conf
Target iqn.2001-04.com.example:storage.disk2.sys1.xyz
Lun 0 Path=/dev/sda1,Type=fileio
Alias lun0
大致说明:
Target iqn.2001-04.com.example:storage.disk2.sys1.xyz 表示该ISCSI Target 的命名,命名在同一子网内应该是唯一的,标准命名方式为:
"Target "+ target名字 (格式如下:iqn.yyyy-mm.[:identifier] )
“Lun 0 Path=/dev/sda1”表示块设备号为0,映射的磁盘为/dev/sda1。
本次配置中Type的设定为"fileio",当然也可以针对需要设置为:"file" or "LVM"。
除此之外还有很多其他参数可以设置,具体参考:
http://manpages.ubuntu.com/manpages/hardy/man5/ietd.conf.5.html

2.4 三种iSCSI target管理工具的使用对比

通过上面的介绍和举例,我们不难看到三种工具各有优劣,区别如下:




安装包

前端工具

后台服务

性能

登录历史

功能

iSNS

LIO targetcli

targetcli.noarch

Targetcli

Target;

targetd

好,2.6.38+原生内核支持

不记录initiator 登录信息

ACL控制

不支持

STGTT targetadm

scsi-target-utils.x86_64

Tgtadm

tgtd

不好,用户态模拟设备

记录登录initiator名称

ACL;

Tags;

支持

STGT ietadm

Iscsitarget-1.4.20.2

Ietadm

Ietd

好,有内核驱动模拟iSCSI设备

记录登录initiator名称及一些discovery信息

ACL;

Tags;

Disk ID ;

基于配置文件的管理

支持



3.总结

根据上面的介绍可以看到,实现target管理有多中工具,每种工具都各有千秋,这就要求在实际工作中充分考虑到当前项目和长期客户需求,合理选择最适合自己的iscsi target 套件。


4.参考文档和链接

https://github.com/agrover/targetcli-fb

SCSI target framework (tgtadm)

http://www.bubuko.com/infodetail-1152038.html

http://www.linuxidc.com/Linux/2015-03/114323.

http://www.linuxidc.com/Linux/2012-08/67740.htm

https://github.com/konis/tgt/blame/master/doc/README.passthrough

http://blog.chinaunix.net/uid-30212356-id-5520545.html

https://github.com/fujita/tgt

http://iscsitarget.sourceforge.net/

https://sourceforge.net/projects/iscsitarget

https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/entry/linux_io_target%25e4%25bb%258b%25e7%25bb%258d_%25e4%25b8%2580?lang=en

http://czmmiao.iteye.com/blog/2055805