iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。
iSCSI分为服务端和客户端,服务端需要安装scsi target用来共享存储设备,客户端需要安装iscsi initiator用来连接target端,将target端共享的设备挂载到initiator本地,可以对其进行分区,格式化等操作,访问过程如下图:
一、iSCSI实现数据的访问需要的条件:
1、iSCSI客户端具有的特性:
iSCSI initiator是发起I/O操作的启动者;需要通过发现过程请求远端快设备;可以与target进行持久连接;在Linux系统中可以使用open-iscsi软件包来模拟实现;
2、iSCSI服务器端具有的特性:
iSCSI target是I/O操作的执行者;需要导出一个或多个块设备供启动者(initiator)使用;在Linux系统中可以使用两种target工具,分别为tgt,和targetcli,这里先介绍TGT的方法,TGT是Fujita Tomonori于2006年底将SCSI Target Framework (STGT/TGT) 引入Linux内核。它在内核中有一个库,可协助内核控制目标驱动程序,TGT是用户态实现的iscsi target,所有目标处理都在用户空间进行。在2010年底,LIO项目被选择来代替TGT作为内核态实现的iscsi target。当选择LIO替换TGT时,它的实现已经进行了调整,以允许TGT用户空态模块继续运行,因此TGT社区支持在内核中包含LIO。在Linux内核 2.6.38 之前都是TGT。
3、iSCSI 命名规则
iSCSI 使用全球唯一的名称标识 iSCSI 设备(目标或启动器)。此名称类似于与光纤通道设备相关联的全球名称 (WWN),可作为一种通用的设备识别方式使用。
iSCSI 名称有两种不同格式。第一种是通过iSCSI限定名以 iqn.开头通常称为“IQN 名称”。第二种是通过企业唯一标识符,以eui.开头也称为“EUI 名称”,此方法不常用。
有关 iSCSI 命名要求和字符串配置文件的更多详细信息,请参见 IETF 网站上的 RFC 3721 和 RFC 3722。
iSCSI 限定名
iSCSI 限定名采用 iqn.yyyy-mm.naming-authority:unique name 的形式,其中:
yyyy-mm :
表示“年份-月份“,是公司成立的年份和月份,这里的公司一般为安装软件的这个公司,当然了可以随意选个时间
naming-authority :
通常是公司的 Internet 域名的逆转格式。例如,pipci 公司的 iSCSI 限定名形式可能是 iqn.2018-01.cc.pipci.iscsi。此名称表示 pipci.cc域名于 2018 年 1 月注册,iscsi 是pipci.cc的子域,子域名可有可无。
unique name:
是希望使用的任何名称,如主机的名称或sn号。必须确保在冒号后面分配的任何名称都是唯一的,例如:
iqn.2018-01.cc.pipci.iscsi:host1
iqn.2018-01.cc.pipci.iscsi:name1
iqn.2018-01.cc.pipci.iscsi:sn1999
企业唯一标识符
企业唯一标识符采用 eui.<16 hex digits> 的形式。
例如,eui.0123456789ABCDEF。
16 位十六进制数字是 IEEE EUI(扩展唯一标识符)格式的 64 位数的文本表示形式。前 24 位是 IEEE 向特定公 司注册的公司 ID。后 40 位由持有该公司 ID 的实体分配,并且必须是唯一的。 在许多情况下,人们都会选择 IQN 格式,而不是 EUI 格式,因为 IQN 格式方便阅读,并且是一种更友好的名 称分配方式。
4、Logical Unit Number
每个在同一个target上的backing-store 称为逻辑单元号(LUN),LUN ID由iSCSI目标设备(Target)分配。iSCSI 启动端(Initiator)设备当前支持在每个目标设备(Target)中导出最多256个LUN,即最大支持16个target。
对于LUN的理解,比较通俗就是整个磁盘,磁盘分区、LVM卷组、RAID等等。在iSCSI通信中,都有一个发起I/O请求的启动端(Initiator)和响应请求并执行实际I/O操作的目标设备(Target),我们能够提供 BlockLevel I/O 给 Initiator 主机,其目的不外乎是“将硬盘的排线网路化”、“把Target 主机的共享磁盘幻化成Initiator 主机的磁盘”以达成更大空间、更高 I/O 速度及具有冗余与高延展度的应用。
Target 即储存设备(Storage Device),也就是存放数据的硬盘(以硬盘阵列居多),在使用iSCSI时,会在 iSCSI 储存设备上去建立 LUN来提供给具备 iSCSI Initiator 功能的主机来存取数据的。可以把Target主机看作是服务端,把Initiator主机看作是客户端。LUN 好比是个“逻辑单位磁碟”,为追求效率、冗余与延展性,这个 LUN 通常会是由数个实体磁碟( RAID 或 LVM 技术的技术实现)所组成。
二、iSCSI initiator发现iSCSI target的过程:
ISCSI initiator按照配置文件/etc/iscsi/iscsid.conf中配置的相应项目利用iSCSI的发现机制在网络中收索目标设备target
ISCSI target将返回有效的iqn名称给iSCSI initiator
ISCSI target按照配置的验证方式接受initiator的登录并返回目标设备target标识
ISCSI initiator发生查询请求给target请求查询target的相关信息
target响应initiator的查询请求,并将设备的有关信息返回给initiator
initiator创建可以的目标设备target列表
三、iSCSI设备的特性:
支持报头和数据摘要
支持两种挑战握手协议CHAP(ChallengeHandshake Authentication Protocol)的认证方式
目标端支持R2T(ReadytoTransfer)流控制
从RHEL4U2开始支持多通道(multipath)
支持sendtargets发现机制
支持动态目标端发现
具备异步事件通知入口
支持即时数据更新
支持动态设备重配
支持自动挂接iSCSI技术
支持IPV6技术
四、iSCSI设备名称
iSCSI设备在iSCSI启动端(Initiator)导入的时候,其内核将按当前的设备情况给iSCSI设备分配一个本地SCSI设备名(例如/dev/sda或/dev/sdb等),如果导入的iSCSI设备已被分区,在导入iSCSI设备建立本地SCSI设备的同时也会建立相应的分区设备名(例如/dev/sda1、/dev/sda5等等),但要注意的是此SCSI设备名并不是每次导入是都是固定的,比如你的主机之前没有/dev/sda设备,你导入了iSCSI设备,其被内核命名为/dev/sda;之后你将其取消了导入,并重新挂接了一个热插拔设备(如U盘或移动硬盘),这个热插拔设备占据的/dev/sda设备;你又从新导入了iSCSI设备,此时其被内核分配的设备名就成了/dev/sdb。
五、为什么要搭建iSCSI共享存储,因为穷!!!,如果有钱最好的方法是买一台真正的存储,因为没钱还要做很多需要共享存储才能测试的功能,比如 Oracle RAC ,虚拟化的HA等都需要一台共享存储,下面将介绍通过Linux 软件来实现iscsi目标器,从而自己搭建一台iscsi存储,组建iscsi
六、安装iscsi目标器tgt,由于CentOS 7上面已经废弃了原来的scsi-target-utils,如果想安装可以添加EPEL yum源后安装scsi-target-utils,这里我使用CentOS6.9来实现
--------------------------------------------------
[root@CentOS ~]# yum install scsi-target-utils.x86_64
--------------------------------------------------
七、设置tgt服务开机启动同时启动tgt
--------------------------------------------------
[root@CentOS ~]# chkconfig tgtd on #设置开机启动
[root@CentOS ~]# service tgtd start #启动tgt
--------------------------------------------------
八、关闭防火墙或开启TCP 3260 端口,tgt通过TCP的3260端口来进行数据的传输
九、创建tgt共享资源
共享资源可以是分区(不需要格式化),整块硬盘或通过dd命令创建一个文件,以上的创建方法这里就不介绍了
十、创建目标器(target),我们需要通过命令tgtadm来创建目标器,同时把共享资源添加到目标器中,这样客户端的启动器才可以访问目标器上的存储资源,服务器端管理配置工具tgtadm的使用
tgtadm是一个高度模式化的命令,他们的模式很相近。有三个模式:target、logicalunit、account。指定模式时使用--mode选项。再使用--op来指定对应模式下的选项。另外,使用-lld指定driver,有两种driver:iscsi和iser,基本都会使用iscsi。
1、模式target下的语法格式:
tgtadm --lld <driver> --mode target --op {new|delete|show|update|bind|unbind} [option]
其中driver一般为iscsi, –op后面的参数表示要进行的操作如下
new: 表示增加一个target,语法格式为:–tid < id > –targetname < name >
delete: 表示删除一个target,语法格式为:delete –tid < id >
show: 表示显示所有的target,后面可以接某个target的id,只显示某个target的信息。语法格式为:show [–tid < id >]
update: 用来修改某个特定的target的参数的,语法格式为:update –tid < id > –name < param > value < value >
bind: 用来将某个特定的initiator和target绑定在一起,表示只接受特定的initiator的请求,语法格式为:
bind –tid < id > –initiator-address < address >
unbind: 表示解绑的意思,语法格式为:unbind –tid < id > –initiator-address < address >
2、模式logicalunit下的语法格式:
tgtadm --lld < driver > --mode logicalunit --op {new|delete} [option]
其中driver一般为iscsi –op后面的参数表示要进行的操作
new: 表示新建一个lun,语法格式为:
new –tid < id > –lun < lun > –backing-store < device-path > –bstype < type > –bsoflags
delete: 表示删除一个LUN,语法格式为:delete –tid < id > –lun < lun >
3、模式account下的语法格式:
tgtadm --lld < driver > --mode account --op {new|delete|bind|unbind} [option]
其中driver一般为iscsi –op后面的参数表示要进行的操作
new: 表示新建一个账号和密码,语法格式为:new –user < name > –password < pass >
delete: 删除某个已有的账号,语法格式为:delete –user < name >
bind: 表示在某个特定的target上添加账号,语法格式为:bind –tid < id > –user < name > [–outgoing]
如果使用了–outgoing选项,将被添加作为出去的账号来使用
unbind: 表示在某个特定的target上删除某个账号,语法格式为:account –op unbind –tid < id > –user < name >
4、在tgtadm命令中,某些长选项可以使用短选项来代理,如:
十一、通过命令创建举例:
1、创建一个target
需要说明的是,下面的实验全是使用命令行工具tgtadm来实现的。但是修改配置文件然后使用tgt-admin也是一样可以的,且target数量多的时候,更建议使用配置为文件加载的方式。最重要的一点是,使用命令行方式创建的target及lun等是临时生效的,在target服务重启后就失效了,再手动建立它们是一件相当麻烦的事情。
如下,分别使用了长格式选项和短格式选项分别创建和显示target。注意:创建target时,tid不能是0,因为0是被系统保留的。
-----------------------------------------------------------------
[root@CentOS ~]# tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.pipci.cc.iscsi:debian.tgt1
[root@CentOS ~]# tgtadm -L iscsi -m target -o show
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
Account information:
ACL information:
[root@CentOS ~]#
-----------------------------------------------------------------
以上是第一个target的信息。从信息中可以看到:
创建完第一个target后自动就创建了一个LUN为0的logicalunit(以后简称lun),这是固定给每个target都使用的LUN。
此lun的类型是controller。
"backing store type"为null,即此lun没有向下扩展逻辑设备,因为它是lun控制器。也就是说这个LUN是保留作为lun控制器用的。
"I_T nexus information"记录的是initiator与此target的联结关系,nexus的意思就是联结、关联,在后文介绍initiator的时候会展示此处信息。
2、现在向此target添加一个lun,使用的是新插入的磁盘/dev/sdb1。当然,使用整个磁盘或通过dd命令创建的文件来做实验也可以。
-----------------------------------------------------------------
[root@CentOS ~]# tgtadm -L iscsi -m logicalunit -o new -t 1 -l 1 -b /dev/sdb1
[root@CentOS ~]# tgtadm -L iscsi -m target -o show
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: