历史
- Linux 2.6.38 为分界线,此前的标准是 Linux SCSI Target , STGT 之后迄今为止的
标准是 Linux-IO Target , LIO 确切的说 Linus Torvalds 在 2011年1月15日将
LIO SCSI Target engine merge 到 Linux 2.6.38 中 - 暂时使用LIO作为IET替代,因为IET当前已不更新,最新版2010年。而LIO已进入内核,
怎么说这几年应该都会持续发展,属于主流应用。
LIO代码量
/home/dennis/work/kernel/linux-3.2.63/drivers/target
[dennis@localhost target]$ find ./* -name "*.*" |xargs wc -l |awk 'END{print $1}'
52187[dennis@localhost target]$ find iscsi/ -name "*.*" |xargs wc -l |awk 'END{print $1}'
21801
开源iSCSI Target调研
- SCST与LIO
- SCST是一个相对较早且比较成熟的SCSI Target开源实现。
- LIO相比SCST是一个更晚的SCSI Target开源实现,但在与SCST竞争进入Linux内核中,
却以LIO胜出告终。关于二者之间进入Linux内核时的争论,LWN上一篇很 有趣的文章,
A tale of two SCSI Targets,中文翻译为“SCSI Target之 双城记”。 - 虽然LIO因为进入Linux内核而有了更好的发展前景,但SCST也不差,Fusion-io 公司
刚刚收购了SCST的商业支持公司ID7。
- Tgt
- Tgt也是一个通用的SCST Target开源实现,与前两者不同的是,在支持iSCSI协 议上,
Tgt的所有代码是完全工作在用户态的。 - Tgt将LU视为backstore,支持backstore可以模块化,也就是说,你可以写一个模块来
支持你自己定义的LU。Tgt提供了多线程api接口,使得编写backstore时 ,可以使用多
个线程同时处理SCSI请求。 - Tgt的主线程使用epoll LT模型,监听并接收Initiator发来
的读写请求与命令 ,而调用对应的backstore处理模块。
- Tgt也是一个通用的SCST Target开源实现,与前两者不同的是,在支持iSCSI协 议上,
- iSCSI Target支持LU是分布式文件系统时的优化
- iSCSI Target与LU之间支持多连接并发读写请求,对于不要求排序的SCSI命令与数据,可以并发发给LU
- iSCSI Target对SCSI命令与数据进行合并,然后发给LU。
- 比较
- 无论是SCST还是LIO,我都不认为它们是支持分布式文件系统的最佳选择。
首先,它们都是工作在内核态的,一旦出问题,会导致系统挂掉,直接影响跑在系统上的其他线上服务。
其次,SCSI与LIO作为通用的SCSI Target实现,在处理完iSCSI协议后,会把SCSI的
处理交给内核SCSI Driver去处理,这对支持分布式文件做二次开发来说,相对更加困难。 - LIO对于一个LU,分配一个recv线程与一个send线程,recv线程接收Initiator发来的
iSCSI PDU,解析成SCSI请求后交给send线程,send线程将请求发给LU,并将LU返回
的结果返回给Initiator。对于LU是分布式文件系统时,一个send线程的框架让支持
iSCSI Target与LU之间多连接并发读写相对比较困难。而且LIO对iSCSI协议的支持,
很难针对LU是分布式文件系统做优化。LIO的send线程 与recv线程使用一个队列进行
通信,该队列中的SCSI请求,有些不关心顺序,有些却关心,这些都是在send线程遍
历队列时才进行处理的。如果要支持LU的多连接并发读写,需要额外的队列来维护SCSI
请求,这个队列对SCSI请求到达LU的顺序没有要求。当然,也要额外支持多线程等处理。 - Tgt由于工作在用户态,没有缺点1,而且Tgt的backstore可以模块化,开发起来非常方便,
同时backstore支持多线程处理,而且Tgt交给backstore的多线程处理的 list已经对顺序不作要求了。 - 从以上分析来看,使用Tgt让分布式文件系统支持iSCSI更加有优势,而且更加方便。
目前,开源分布式存储项目sheepdog与hlfs都是基于Tgt开发模块来支持 iSCSI协议的。
- 无论是SCST还是LIO,我都不认为它们是支持分布式文件系统的最佳选择。
- Tgt的缺点与改进
- Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护
一个list,主线程通过CAS无锁队列的方式,将SCSI请求根据rr算 法加入到每个线程的list中。 - Tgt的backstore与LU之间连接数与线程数,是1:1关系,且线程数为4,写死了的。
可以修改代码,将连接数改为可配置的。 - Tgt使用一个主线程通过epoll接受所有Initiator的读写请求,当登陆的Initiator较多时,
这里可能成为瓶颈。通常来说,这不是问题,因为会iSCSI Target会部署多个的。
- Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护
targetcli
- root权限运行targetcli
- 浏览存储对象, ls查看目录树信息,cd到执行目录
- 创建文件存储对象
- cd /backstores/fileio
- create disk0 /tmp/disk0.img 10MB
- cd /backstores/ramdisk
- create rd0 10MB
- 创建iSCSI目标
- cd /iscsi
- create [这里可以加入自定义的WWN:WorldWide Name]
- cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e/tpg1/
- luns/ create /backstores/fileio/disk0
- luns/ create /backstores/ramdisk/rd0
- portals/ create 0.0.0.0
- set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
- cd /
- ls
- saveconfig
- 当使用targetcli操作完毕后,记得使用saveconfig来保存配置,要不然重启target服务后,
刚才的配置将丢失.targetcli saveconfig
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json - 启动iscsi target服务
- [root@localhost ~]# service target start
- [root@localhost ~]# service target status
- 装载iSCSI Target
- [root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
127.0.0.1:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e - [root@localhost ~]# iscsiadm –mode node \
–targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
–portal 127.0.0.1 –login - 上面的命令还可以使用简写模式: iscsiadm -m node -T \
iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
-p 127.0.0.1 -l - [root@localhost dennis]# lsscsi
[2:0:0:0] disk ATA ST3160815AS A /dev/sda
[6:0:0:0] disk LIO-ORG disk0 4.0 /dev/sdb
[6:0:0:1] disk LIO-ORG rd0 4.0 /dev/sdc
- [root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
- 卸载并删除iSCSI目标
- iscsiadm –mode node –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e –portal 127.0.0.1 –logout
- 或简写: iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e -p 127.0.0.1 -u
- targetcli iscsi/ delete iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
- Other operation
- iscsiadm –mode node -U all
- iscsiadm –mode node -o delete
- iscsiadm –mode node
测试脚本
mkdir -p /lio/
targetcli /backstores/fileio create disk0 /lio/disk0.img 1024MB
targetcli /iscsi create iqn.2007-10.lio.com:lio.test
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1/luns/ create /backstores/fileio/disk0
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1/portals/ create 0.0.0.0
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1 set attribute authentication=1 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1/acls/ create iqn.2007-10.lio.com:acl01
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1/acls/iqn.2007-10.lio.com:acl01/ set auth userid=dennis
targetcli /iscsi/iqn.2007-10.lio.com:lio.test/tpg1/acls/iqn.2007-10.lio.com:acl01/ set auth password=Dennis@123456
targetcli saveconfig
其他操作
增加本地监听ip地址和端口
/iscsi/iqn.20…/tpg1/portals> create 172.16.110.11 8089
Created network portal 172.16.110.11:8089.
/iscsi/iqn.20…/tpg1/portals> ls
o- portals …………………………………………… [Portals: 2]o- 0.0.0.0:3260 .................................................... [OK] o- 172.16.110.11:8089 .............................................. [OK]
/iscsi/iqn.20…/tpg1/portals> status
Status for /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e/tpg1/portals: Portals: 2Initiator访问IP限制? 目前找不到方法!原来的IET有限制指定IP访问的功能,但是并不表示
该功能是iscsi协议必须实现的,所以现在的LIO没有这样的功能也是合理的。如何设置块设备的IO模式为write-back或write-through? 目前找不到方法。对于FILEIO是可以的.
[root@localhost src]# targetcli /backstores/fileio/ create fileio01.dat /tmp/fileio01.dat 10M write_back=False
Created fileio fileio01.dat with size 10485760
[root@localhost src]# ls /tmp/fileio01.dat -lh
-rw-r–r–. 1 root root 10M Feb 3 15:01 /tmp/fileio01.dat
[root@localhost src]# targetcli /backstores/fileio/ ls
o- fileio ……………………………………………… [Storage Objects: 1]
o- fileio01.dat ………….. [/tmp/fileio01.dat (10.0MiB) write-thru deactivated]
[root@localhost src]# targetcli /backstores/fileio/ create fileio02.dat /tmp/fileio02.dat 10M write_back=True
Created fileio fileio02.dat with size 10485760
[root@localhost src]# targetcli /backstores/fileio/ ls
o- fileio ……………………………………………… [Storage Objects: 2]
o- fileio01.dat ………….. [/tmp/fileio01.dat (10.0MiB) write-thru deactivated]
o- fileio02.dat ………….. [/tmp/fileio02.dat (10.0MiB) write-back deactivated]targetcli 设置CHAP登陆: acls中创建wwn, 设置用户名和密码
- /> cd /iscsi/iqn.2007-10.lio.com:dg2.lv1/tpg1/
- set attribute authentication=1
- acls/ create iqn.1991-05.com.microsoft:ibm-t410s
- cd acls/iqn.1991-05.com.microsoft:ibm-t410s
- set auth userid=iqn.1991-05.com.microsoft:ibm-t410s
- set auth password=mytargetsecret
- saveconfig
reference http://linux-iscsi.org/wiki/ISCSI
[root@localhost dennis]# iscsiadm -m node -p 172.16.130.200 -l
Logging in to [iface: default, target: iqn.2007-10.lio.com:dg2.lv1, portal: 172.16.130.200,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2007-10.lio.com:dg2.lv1, portal: 172.16.130.200,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
配置检查
/sys/kernel/config/target/iscsi/
[root@localhost ~]# ls -l /sys/kernel/config/target/iscsi
total 0
drwxr-xr-x. 2 root root 0 Dec 15 15:59 discovery_auth
drwxr-xr-x. 4 root root 0 Dec 15 15:58 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.f264093a034e
drwxr-xr-x. 4 root root 0 Dec 15 15:59 iqn.2014-12.org.linux-iscsi.localhost.x8664:sn.f3849a0b356e
-r–r–r–. 1 root root 4096 Dec 15 16:05 lio_version当使用targetcli操作完毕后,记得使用saveconfig来保存配置,要不然重启target服务后,
刚才的配置将丢失.[root@localhost ~]# targetcli saveconfig
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json关于配置文件 /etc/target/saveconfig.json的解析
- JSON (JavaScript Object Notation) is a lightweight data-interchange format
- JSON 一种轻量级的数据交换格式
- http://www.json.org/
需要验证测试的特性
- 各中类型的性能比较
- FILEIO 性能
- Block 性能
- 增加或删除不用的lun是否需要重启服务,会不会影响正常业务
- 破坏性测试
- 块设备异常是否影响其他iscsi卷的业务
- 相比IET,有哪些新特性
- 对比所有TARGET的开源实现,有哪些优势,有无缺点