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, 效果如下图:
此时在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.
“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