前文介绍了iSCSI的基本架构及启动器的基本操作,也就是在客户端的操作。今天我们介绍一下目标器的相关概念、开源实现和基本操作。Linux操作系统下面有很多目标器的开源实现,比如LIO、SCST和TGT等,本文以CentOS下的LIO为例进行介绍。

iSCSI target介绍及LIO实操入门_Linux

LIO架构简介

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的各种功能,而不用购买昂贵的专业设备。

iSCSI target介绍及LIO实操入门_iSCSI_02

上图显示了Linux-IO Target的各个组件。LIO模拟了通用的SCSI设备,并且实现了SPC-3和SPC-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。

配置管理方法

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

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命令查询使用说明。

安装targetcli

在CentOS 7下执行如下命令可以安装targetcli:

# yum -y install targetcli

启动target服务

# systemctl start target

设置开机启动服务

# systemctl enable target

如防火墙未关闭则设置防火墙运行3206端口,关闭则不用执行此步骤

# firewall-cmd--permanent --add-port=3260/tcp
# firewall-cmd-reload

配置目标器资源

我们这里配置一个目标器资源,并添加导出的磁盘资源,这样在启动器端就可以连接该目标器,并访问该磁盘资源了。目标器端的管理非常简单,就是通过targetcli实现对资源的管理。首先假设我们已经有一块独立的磁盘sdc了

1. root权限运行targetcli

# targetcli

2. 建立一个块存储
注意:server1.disk(名称server1可自定义),/dev/sdc为上面新建的分区名称。切换到如下目录,并执行创建命令

/> cd /backstores/block
/> create server1.disk /dev/sdc

3. 配置ISCSI Target命名
注意:命名在同一子网内确保是唯一的,命名格式为:iqn.yyyy-mm.<主机名反写>:自定义名称(自定义名称内不能有下划线)

/> cd /iscsi 
/> create iqn.1997-05.com.test:itworld123

4. 创建ACL允许ISCSI客户机连接
注意:iqn.1997-05.com.test:client1为客户机ISCSI名称。

/>cd /iscsi/iqn.2017-03.com.example:disk1/tpg1/acls
/>create iqn.2017-03.com.example:client1

5. 创建lun(target块设备的逻辑单元)

/>cd /iscsi/iqn.1997-05.com.test:itworld123/tpg1/luns 
/> create /backstores/block/server1.disk

至此,我们对Linux下的目标器(target)有了一个基本的了解,并且清楚了如何进行配置和资源导出。后续我们将对内核中LIO代码进行解析