欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【转】Linux中三种SCSI target的介绍之LIO

程序员文章站 2024-03-15 14:14:59
...

【转自】http://blog.csdn.net/scaleqiao/article/details/46744891

1. 简介
Linux-IO Target在Linux内核中(linux 2.6.38后),用软件实现各种SCSI Target,其支持的SAN技术中所有流行的存储协议包括Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10), SRP (Mellanox InfiniBand,linux3.3), USB等,同时还能为本机生成模拟的SCSI设备,以及为虚拟机提供基于virtio的SCSI设备。Linux-IO Target使用户能够使用相对廉价的Linux系统实现SCSI、SAN的各种功能,而不用购买昂贵的专业设备。

2. 架构
【转】Linux中三种SCSI target的介绍之LIO

上图显示了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. [aaa@qq.com ~]# service target start  
  21. [aaa@qq.com ~]# service target status  
  22. 1f)装载iSCSI Target  
  23. [aaa@qq.com ~]# 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. [aaa@qq.com ~]# iscsiadm –mode node \  
  26. > –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \  
  27. > –portal 127.0.0.1 –login  
  28. [aaa@qq.com 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  
【转】Linux中三种SCSI target的介绍之LIO
1a)root权限运行targetcli
1b)浏览存储对象, ls查看目录树信息,cd到执行目录
1c)创建文件存储对象
cd /backstores/fileio
create disk0 /tmp/disk0.img 10MB
cd /backstores/ramdisk
create rd0 10MB
1d)创建iSCSI目标
cd /iscsi
create
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
1e)启动iscsi target服务
[aaa@qq.com ~]# service target start
[aaa@qq.com ~]# service target status
1f)装载iSCSI Target
[aaa@qq.com ~]# 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
[aaa@qq.com ~]# iscsiadm –mode node \
> –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
> –portal 127.0.0.1 –login
[aaa@qq.com 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
1g)卸载并删除iSCSI目标
iscsiadm –mode node –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.	6b448471ba5e –portal 127.0.0.1 –logout
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()