LIO

历史

  • 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处理模块。
  • 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协议的。
  • Tgt的缺点与改进
    • Tgt的backstore在使用多线程时,多个线程竞争一个list,开销较大。可以让 每个线程维护
      一个list,主线程通过CAS无锁队列的方式,将SCSI请求根据rr算 法加入到每个线程的list中。
    • Tgt的backstore与LU之间连接数与线程数,是1:1关系,且线程数为4,写死了的。
      可以修改代码,将连接数改为可配置的。
    • Tgt使用一个主线程通过epoll接受所有Initiator的读写请求,当登陆的Initiator较多时,
      这里可能成为瓶颈。通常来说,这不是问题,因为会iSCSI Target会部署多个的。

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
  • 卸载并删除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: 2

  • Initiator访问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的开源实现,有哪些优势,有无缺点

参考