The introduction of three Linux SCSI target of LIO

 

Disclaimer: This article is a blogger original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement.
This link: https://blog.csdn.net/scaleqiao/article/details/46744891

1. Introduction
Linux-IO Target in the Linux kernel (linux after 2.6.38), to achieve a variety of SCSI Target software, which supports SAN technology in all popular storage protocols include Fibre Channel (Qlogic, linux3.5), FCoE (linux3.0), iSCSI (linux 3.1 ), iSER (Mellanox InfiniBand, linux3.10), SRP (Mellanox InfiniBand, linux3.3), USB , etc., and generates an analog of the native SCSI devices can, as well as virtual machine-based virtio SCSI devices. Linux-IO Target enables users to use relatively inexpensive Linux systems to achieve SCSI, SAN various functions, without buying expensive professional equipment.

2. Architecture

 

 

 上图显示了Linux-IO Target的各个组件。LIO模拟了通用的SCSI设备,并且实现了SPC-3和4。接着,通过各种各样的backstore对象,来导入真正的后端存储,最后连接上各种前端Fabric模块,来导出模拟的SCSI设备。无论是Fibre Channel、FCoE、iSCSI还是vhost(即virtio),都只是一种Fabric技术,我们可以将其理解成传输协议,而在这些传输协议中传输的SCSI命令则总是由核心的SCSI设备处理的。要支持新的Fabric技术,并不需要修改核心的SCSI设备和后端存储模块,只需要按照该Fabric技术的规范实现对SCSI命令的传输就可以了。iSCSI技术就是把SCSI命令放在TCP/IP中传输,vhost技术就是把SCSI命令放在virtio队列中传输。

Generic Target Engine:实现了SAM中规定的一个SCSI target的功能,主要是SCSI协议的解析。它通过Fabric模块和initiator通信,通过backstore和具体的存储设备通信。Fabric modules:实现了LIO的前端,即SCSI协议传输层的模块。可以通过Fabric Hardware Abstraction Layer(F-HAL)来为LIO增加新的fabric模块。
Backstores:实现了LIO的后端,即访问磁盘数据的方式。可以通过Storage Hardware Abstraction Layer(S-HAL)在LIO中增加新的存储硬件的支持。通常使用BLOCKIO和FILEIO。

3. 使用方法

Linux-IO Target则在内核态实现了对Target的模拟,配置管理则采用了更为“现代化”的基于sysfs的方式,提供了友好的用户态管理工具。从内核的2.6.38版起,Linux内核都包含Linux-IO Target的相关模块。在用户态,各大发行版都打包了targetcli和rtslib,其中targetcli程序用于配置、管理,rtslib则提供Python编程接口。

1)targetcli
targetcli是Linux-IO Target的用户态的管理配置工具。用户可以使用yum或apt-get直接从各大发行版的官方仓库安装,对于较老的linux版本需要自己编译源码安装。targetcli提供一个类似shell的界面,各种Target、TPG、LUN、backstore对象则被组织成目录树的形式,用户可以用ls、cd命令来浏览目录树,用create、delete命令来创建和删除各种对象。浏览配置,就是浏览目录树,创建删除各种对象,就是在目录树的各级节点中创建新的节点。同时targetcli还提供了常见的shell命令辅助编辑功能,例如TAB智能补全、上下键切换命令历史、Ctrl + R搜索命令历史。凡是有不熟悉的命令,都可以用help命令查询使用说明。

其实,对于我们来说,配置LIO主要就是使用targetcli,具体使用步骤如下:
  1.   1a)root权限运行targetcli
  2.   1b)浏览存储对象, ls查看目录树信息,cd到执行目录
  3.   1c)创建文件存储对象
  4.   cd /backstores/fileio
  5.   create disk0 /tmp/disk0.img 10MB
  6.   cd /backstores/ramdisk
  7.   create rd0 10MB
  8.   1d)创建iSCSI目标
  9. cd /iscsi
  10.   create
  11.   cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e/tpg1/
  12.   luns/ create /backstores/fileio/disk0
  13.   luns/ create /backstores/ramdisk/rd0
  14.   portals/ create 0.0.0.0
  15.   set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
  16.   cd /
  17.   ls
  18.   saveconfig
  19.   1e)启动iscsi target服务
  20.   [root@localhost ~]# service target start
  21.   [root@localhost ~]# service target status
  22.   1f)装载iSCSI Target
  23.   [root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
  24.   127.0.0.1:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
  25.   [root@localhost ~]# iscsiadm –mode node \
  26.   > –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
  27.   > –portal 127.0.0.1 –login
  28.   [root@localhost dennis]# lsscsi
  29.   [2:0:0:0] disk ATA ST3160815AS A /dev/sda
  30.   [6:0:0:0] disk LIO-ORG disk0 4.0 /dev/sdb
  31.   [6:0:0:1] disk LIO-ORG rd0 4.0 /dev/sdc
  32.   1g)卸载并删除iSCSI目标
  33.   iscsiadm –mode node –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn. 6b448471ba5e –portal 127.0.0.1 –logout
  34.   targetcli iscsi/ delete iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
除了targetcli,LIO还提供python的编程接口。

 

2)rtslib
rtslib是一个Python程序库,让用户可以以编程的方式配置Linux-IO Target的各项功能。rtslib中的对象也被组织成树状结构,并且与我们在targetcli中熟悉的各种对象也很相似。熟悉了targetcli的操作之后,用rtslib编程就变得十分容易。首先,我们需要安装python-rtslib的RPM包。还可以安装python-rtslib-doc的RPM包,里面包含了接口的说明文档。下面以iSCSI为例,展示如何用rtslib创建Target。下面的例子是使用rtslib创建iSCSI target。

  1.   import rtslib
  2.   def createTarget():
  3.   fio = rtslib.FileIOStorageObject(
  4.   'disk0', dev='/tmp/disk0.img', size=100 * 1024 * 1024)
  5.   iscsiMod = rtslib.FabricModule('iscsi')
  6.   tgt = rtslib.Target(iscsiMod, mode='create')
  7.   tpg = rtslib.TPG(tgt, tag=None, mode='create')
  8.   rtslib.LUN(tpg, lun=None, storage_object=fio)
  9.   tpg.set_attribute('generate_node_acls', '1')
  10.   tpg.set_attribute('cache_dynamic_acls', '1')
  11.   tpg.set_attribute('authentication', '0')
  12.   tpg.set_attribute('demo_mode_write_protect', '0')
  13.   tpg.enable = True
  14.   rtslib.NetworkPortal(tpg, '0.0.0.0', mode='create')
  15.   return tgt.wwn
  16.   print createTarget()

Guess you like

Origin www.cnblogs.com/pipci/p/11618671.html