iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。

iSCSI分为服务端和客户端,服务端需要安装scsi target用来共享存储设备,客户端需要安装iscsi initiator用来连接target端,将target端共享的设备挂载到initiator本地,可以对其进行分区,格式化等操作,访问过程如下图:

Linux下搭建iSCSI共享存储的方法 TGT 方式 Debian9.5系统下-LMLPHP

Linux下搭建iSCSI共享存储的方法 TGT 方式 Debian9.5系统下-LMLPHP

一、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,Debian9.5下实现

--------------------------------------------------
root@debian:~# apt install tgt
--------------------------------------------------

七、设置tgt服务开机启动同时启动tgt
--------------------------------------------------
root@debian:~# systemctl  enable  tgt.service         #设置开机启动
root@debian:~# systemctl  start   tgt.service       #启动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命令中,某些长选项可以使用短选项来代理,如:

Linux下搭建iSCSI共享存储的方法 TGT 方式 Debian9.5系统下-LMLPHP

十一、通过命令创建举例:
1、创建一个target
需要说明的是,下面的实验全是使用命令行工具tgtadm来实现的。但是修改配置文件然后使用tgt-admin也是一样可以的,且target数量多的时候,更建议使用配置为文件加载的方式。最重要的一点是,使用命令行方式创建的target及lun等是临时生效的,在target服务重启后就失效了,再手动建立它们是一件相当麻烦的事情。

如下,分别使用了长格式选项和短格式选项分别创建和显示target。注意:创建target时,tid不能是0,因为0是被系统保留的。
-----------------------------------------------------------------
root@debian:~# tgtadm   --lld  iscsi   --mode    target   --op   new   --tid  1  --targetname   iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# 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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
Account information:
ACL information:
root@debian:~#
-----------------------------------------------------------------
以上是第一个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@debian:~# tgtadm  -L  iscsi  -m  logicalunit  -o  new  -t  1  -l  1  -b  /dev/sdb1
root@debian:~# 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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk          #设备类型
SCSI ID: IET 00010001       #设备ID
SCSI SN: beaf11
Size: 2147 MB, Block size: 512   #这个lun的容量
Online: Yes             #状态为在线
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr        #设备可读写
Backing store path: /dev/sdb1   #这个lun使用的是那个设备
Backing store flags:
Account information:
ACL information:
root@debian:~#
-----------------------------------------------------------------
从LUN 1信息中可以看出,lun type已经是disk而非controller,且显示了此lun的容量大小是42950M。另外还显示了使用的逻辑设备是/dev/sdb1,且是可读可写的(rdwr)。但到目前为止,该target都没有定义共享给谁,这从target信息的最后两行Account/ACL information中可以看出。

3、现在将此target绑定一个共享IP,即说明此IP可以连接该target。这是iSCSI的一种认证方式:IP认证,192.168.1.0/24表示一个网段,192.168.1.100表示一个具体的IP,千万不要在具体的IP后面加/24,感觉是表示24位的掩码,其实不用,加上以后initiator会连接失败。除此之外,还有基于account的CHAP认证,详细内容见后文。IP认证的作用是允许Initiator发现该target,并允许做进一步的基account的CHAP认证
-----------------------------------------------------------------
root@debian:~# tgtadm  -L  iscsi  -m  target  -o  bind  -t  1  -I  192.168.1.0/24
root@debian:~# 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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------
可以看到ACL information: 这里多了我们刚才添加的网络信息,我们这里添加的是一个网段,也可以添加某个固定的IP地址,共享出去的是target级别而不是lun级别的,所以一旦允许访问这个target,也就允许访问target下的所有LUN了,所以要让多个LUN有不同的主机访问就要创建多个target,通过上面的操作我们就可以通过initiator进行访问了

十二、通过target配置文件配置,重启后依然生效

target端使用tgtadm命令配置的结果都是工作在内核中的,重启tgt服务或重启系统时,内存中的内容都会丢失。所以要永久让配置生效需要写入到配置文件中去。target的配置文件默认是/etc/tgt/targets.conf,但是可以在/etc/tgt/conf.d/目录下建立多个以".conf"为后缀的配置文件,然后启用主配置文件中的include指令即可。

1、说道配置文件就不到不说tgt-admin命令

tgt-admin是读取配置文件的选项然后调用tgtadm来执行的工具。它的选项很多可以简化tgtadm命令的书写,毕竟tgtadm的选项太长太多余了,除此之外也有一些其他的作用用于更细致的配(tgtadm配置的太粗糙了)。用法如下:

tgt的配置文件为/etc/tgt/targets.conf,该配置文件的格式很容易读懂,能实现的target和lun的配置方式多种多样。下面就使用tgt-admin为当前的target生成对应的配置文件来稍作分析。首先列出当前target的信息。
-----------------------------------------------------------------
root@debian:~# tgt-admin  -s
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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc        #直接将整个硬盘添加到lun
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

使用--dump选项输出为配置文件的格式
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc         #列出多个LUN,
initiator-address 192.168.1.0/24
</target>

root@debian:~#
-----------------------------------------------------------------
由此可以看出,默认使用的driver是iscsi,名称为iqn.pipci.cc.iscsi:debian.tgt1的target有一个backing-store,即逻辑设备/dev/sdb1。但是要注意,这样导出的配置文件指定的LUN号码可能会在tgt-admin读取并执行的时候更换位置,但这并不会有任何影响。

将通过命令生产的配置信息导入到配置文件/etc/tgt/conf.d/tgt1.conf
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump  >  /etc/tgt/conf.d/tgt1.conf      #tgt1.conf是自定义的/etc/tgt/conf.d/目录默认没有这个文件
root@debian:~# cat /etc/tgt/conf.d/tgt1.conf
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>      #target的开始
backing-store /dev/sdb1
backing-store /dev/sdc
initiator-address 192.168.1.0/24
</target>                  #target的结束,有多个target就会有多个这样的结构

root@debian:~#
-----------------------------------------------------------------
另外需要说明的是在tgt的配置文件/etc/tgt/targets.conf中有一行:

include /etc/tgt/conf.d/*.conf

只有存在这个选项,以后才可以导出配置文件到/etc/tgt/conf.d/目录下并以.conf作为后缀的文件中,重启tgtd服务即可重新加载,而不需要在手动加载了。不过有个问题,使用dump出来的配置文件会有default-driver指令行,而这一行不能在没一个配置文件中都存在,他只能出现一次,否则将会报错,所以需要只在地一个配置文件中的default-driver指令存在,其他配置文件中的都要注释掉。其实我们只要把所有的target放在一个文件中就可以了,没必要弄多个配置文件

现在将已有的target全部删除,再去查看信息就已经没有了
-----------------------------------------------------------------
root@debian:~# tgt-admin  --delete   ALL
root@debian:~# tgt-admin  -s
-----------------------------------------------------------------

重启tgt服务然后查看信息,发现已经有了target
-----------------------------------------------------------------
root@debian:~# systemctl restart tgt.service    #重启tgt服务
root@debian:~# tgt-admin  -s
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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

自定义lun的号,backing-store的顺序决定了lun号码的顺序,上面的配置中/dev/sdb1会是Lun1,/dev/sdc会是lun2。若想要为每个逻辑设备指定想要指定的lun号码,需要将每个backing-store封装在target中并独立指定lun号码。把/etc/tgt/conf.d/tgt1.conf配置文件改成下面的内容
-----------------------------------------------------------------
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
<backing-store /dev/sdb1>
lun 10
</backing-store>
<backing-store /dev/sdc>
lun 11
</backing-store>
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
root@debian:~# systemctl restart tgt.service      #重起服务
root@debian:~# tgt-admin -s
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
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 10           #已经改成自定意的了
Type: disk
SCSI ID: IET 0001000a
SCSI SN: beaf110
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 11
Type: disk
SCSI ID: IET 0001000b
SCSI SN: beaf111
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#

十三、Debian9.5配置iSCSI Initiator
在Linux 2.6内核中提供了iscsi驱动,iSCSI 驱动(driver)使主机拥有了通过IP网络访问存储的能力,但还需要一个具体的客户端工具(Linux用户空间组件)初始化iSCSI驱动,即open-iscsi。

open-iscsi initiator说明
open-iscsi包括两个守护进程iscsid和iscsi,其中iscsid是主进程,iscsi进程则主要负责根据配置在系统启动时进行发起端(Initiator)到服务端(target)的登录,建立发起端与服务端的会话,使主机在启动后即可使用通过iSCSI提供服务的存储设备。

iscsid进程实现iSCSI协议的控制路径以及相关管理功能。例如守护进程(指iscsid)可配置为在系统启动时基于持久化的iSCSI数据库内容,自动重新开始发现(discovery)目标设备。

open-iSCSI是通过以下iSCSI数据库文件来实现永久配置的:

Discovery (/etc/iscsi/send_targets)
在 /etc/iscsi/send_targets 目录下包含iSCSI portals的配置信息,每个portal对应一个目录,目录名为“iSCSI portal IP,端口号”(例如192.168.1.78,3260),在执行完发现命令后就会生成对应的目录,目录里面有对应的数据库文件。

Node (/etc/iscsi/nodes)
在 /etc/iscsi/nodes 目录下,生成一个或多个以iSCSI存储服务器上的Target名命名的文件夹如iqn.pipci.cc.iscsi:debian.tgt1,在该文件夹下有一个文件名为“iSCSI portal IP,编号” (例如192.168.1.78,3260,1)的配置参数文件default,这个目录也是在执行完发现后生成的,该文件中是initiator登录target时要使用的参数,这些参数的设置是从/etc/iscsi/iscsi.conf中的参数设置继承而来的,可以通过iscsiadm对某一个参数文件进行更改(需要先注销到target的登录)。

iSCSI node是一个在网络上可用的SCSI设备标识符,在open-iscsi中利用术语node表示目标(target)上的门户(portal)。一个target可以有多个portal,portal 由IP地址和端口构成。

1、安装initiator程序open-iscsi
-----------------------------------------------------------------
root@debian:~# apt install  open-iscsi
-----------------------------------------------------------------
安装完成后,比较重要的配置文件有两个: /etc/iscsi/iscsid.conf 所有刚发起的iSCSI session默认都将使用这个文件中的参数设定 以及 /etc/iscsi/initiatorname.iscsi 软件iSCSI initiator的intiator名称配置文件,后面会介绍

2、设置iscsi服务开机启动同时启动iscsi
-----------------------------------------------------------------
root@debian:~# systemctl  enable  iscsi.service
root@debian:~# systemctl  enable  iscsid.service
root@debian:~# systemctl  start  iscsi.service
root@debian:~# systemctl  start  iscsid.service
-----------------------------------------------------------------

十四、 iscsi-iname命令
和target一样,initiator也需要一个独特的名称来标识自己让target识别。initiator在连接target的时候,会读取/etc/iscsi/initiatorname.iscsi中的iqn作为自己的iname。

1、初始状态的iname如下:
-----------------------------------------------------------------
root@debian:~# cat  /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.1993-08.org.debian:01:26cbb0737764
root@debian:~#
-----------------------------------------------------------------

2、通过命令iscsi-iname命令生成随机的iqn号
-----------------------------------------------------------------
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:12264f3310e0
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:b0f184f7946b
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:84cc29c37b5d
-----------------------------------------------------------------
通过上面的执行可以看出来没次运行这个命令都会生成一个不一样的iqn号,但是iqn的前缀iqn.2005-03.org.open-iscsi:都是一样的只是后面的随机数不一样
我们可以通过“-p”选项来指定前缀,如下所示:
-----------------------------------------------------------------
root@debian:~# iscsi-iname  -p  iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:193a96d04d8
root@debian:~# iscsi-iname -p iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:ac34b648a96           #只是后面的随机数变化了
root@debian:~#
-----------------------------------------------------------------

3、通过修改/etc/iscsi/initiatorname.iscsi的内容来实现默认的iqn,通过上面的命令生成的iqn重启iscsi服务后还会读取默认的,所以我们直接通过修改这个配置文件来得到一个容易记忆的iqn修改内容如下:
-----------------------------------------------------------------
InitiatorName=iqn.2019-10.cc.pipci.iscsi:sn8888    #后面的随机数推荐用主机的sn好后4位或6位,这样比较好管理

修改完重启服务
-----------------------------------------------------------------
root@debian:~# systemctl  restart  iscsi.service
-----------------------------------------------------------------

十五、iscsiadm命令
iscsiadm是用来管理(更新、删除、插入、查询)iSCSI配置数据库文件的命令行工具,用户能够用它对iSCSI nodes、sessions、connections和discovery records进行一系列的操作。iscsiadm也是一个模式化的命令,使用-m指定mode。mode有:discovery、node、session、iface。一般就用前两个mode。

discovery:  发现某服务器是否有target输出,以及输出了哪些target。发现target后会生成target数据库discoverydb。
node:          管理跟某target的关联关系。在discovery发现了target后,是否要跟target建立关系,是否要删除已有的关系或者解除已有的关系等。删除关联关系不仅会解除关联,还会删除发现target后生成的discoverydb。
session:  会话管理。
iface:       接口管理。

在客户端使用Target提供的存储空间前,必须在服务器上通过Initiator软件执行以下步骤:发现目标设备 --> 关联(登录)目标设备 --> 与目标设备建立会话,下面分别说明通过各个命令进行说明。

1、发现target(discovery)

即使用discovery模式。

iscsiadm -m discovery [ -d debug_level ] [ -t type -p ip:port -I ifaceN [ -p ip:port ]

-d:  输出调试信息,级别从0-8。出现错误的时候用来判断错误来源是很有用处的,可以使用级别2。
-I:  指定发现target时通信接口。
-t  type:          有三种type(sendtargets,SLP,iSNS),一般只会用到sendtargets,可以简写为st。
-p  IP:PORT:  指定要发现target的IP和端口,不指定端口时使用默认的3260。

2、现在可以进行discovery来发现target
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  discovery  -t  st  -p  192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~#
-----------------------------------------------------------------
在完成目标发现后,即可以登录到相应的节点,使用目标设备提供的存储空间

3、关联和解除关联target(node)

关联target的作用是initiator和target建立session,建立session后,initiator上就可以查看、访问、操作target上的scsi设备。同时target提供的存储设备也挂载到主机中,在/dev目录下生成一个新的设备文件类似于sdb、sdc等。使用iscsiadm -m session 来查看连接会话信息。
有两种关联方法,一是关联所有,一是指定单个target进行关联。关联也可以叫做登录,解关联也可以叫做取消登录

iscsiadm -m node [-d debug_level] [-L all,manual,automatic] [-U all,manual,automatic]
iscsiadm -m node [-d debug_level] [[-T targetname -p ip:port -I ifaceN] [-l | -u ]] [-o operation]

-d:    指定debug级别,有0-8个级别。
-L和-U:  分别是登录和登出target,可以指定ALL表示所有发现的target,或者manual指定。
-l和-u:    分别是登录和登出某一个target。
-T:    用于-l或-u时指定要登录和登出的targetname。
-o:    对discoverydb做某些操作,可用的操作有new/delete/update/show,一般只会用到delete和show。
-p:    指定要发现target的IP和端口,不指定端口时使用默认的3260
-R:    扫描所有关联的target

例如,使用单个的关联方式关联target。其中在第一步中发现的target都会保存在本地的数据库中,可以通过命令iscsiadm -m node查看。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.
root@debian:~#

-----------------------------------------------------------------

关联发现的所有目标器
iscsiadm -m node -L all

4、查看登录的session,可以通过选项-P 0-3 来打印更详细的信息
-----------------------------------------------------------------
root@debian:~# iscsiadm -m session
tcp: [1] 192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)
root@debian:~# iscsiadm -m session -P 2 #打印更详细的信息
Target: iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)
Current Portal: 192.168.1.78:3260,1
Persistent Portal: 192.168.1.78:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.2019-10.cc.pipci.iscsi:sn8888
Iface IPaddress: 192.168.1.16
Iface HWaddress: <empty>
Iface Netdev: <empty>
SID: 1
iSCSI Connection State: LOGGED IN
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: NO CHANGE
*********
Timeouts:
*********
Recovery Timeout: 120
Target Reset Timeout: 30
LUN Reset Timeout: 30
Abort Timeout: 15
*****
CHAP:
*****
username: <empty>
password: ********
username_in: <empty>
password_in: ********
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 8192
FirstBurstLength: 65536
MaxBurstLength: 262144
ImmediateData: Yes
InitialR2T: Yes
MaxOutstandingR2T: 1

root@debian:~#
-----------------------------------------------------------------

5、此时先看下target端的target信息
-----------------------------------------------------------------
root@debian:~# tgt-admin  -s  |  more
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
I_T nexus: 1
Initiator: iqn.2019-10.cc.pipci.iscsi:sn8888
Connection: 0
IP Address: 192.168.1.16
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:
LUN: 10

--More--
-----------------------------------------------------------------
其中I_T nexus表示initiator到target的关联信息,nexus的值是该initiator关联到target的次数。多个initiator会显示多个I_T nexus信息。这里可以看到只有一个I_T nexus,说明只有一个initiator进行了关联,这里可以看到initiator的iqn号和ip地址。

6、扫描所有关联的target/session
一旦登录成功,所有分配给当前主机的LUN都可以看到了,但有时,新分配的LUN,LUN的信息发生变化后,主要不能立即看到,这样就需要rescan了 --rescan 。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -R
Rescanning session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
root@debian:~#

root@debian:~# iscsiadm -m session -R
Rescanning session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
root@debian:~
-----------------------------------------------------------------

7、解除关联
解除单个关联
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260  -u
Logging out of session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
Logout of [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.
root@debian:~#
-----------------------------------------------------------------

解除所有关联
iscsiadm -m node -U all

8、连接死掉(断网或者target端断掉或目标器IP改变)时,可以删除老节点,然后再重新发起discovery生成新节点,使用如下指令删除
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  -o  delete
-----------------------------------------------------------------

删除所有node信息
iscsiadm -m node -o delete

通过上面的删除操作其实就是清除了在discovery时存储在/etc/iscsi/nodes中的信息,已经设置开机启动的node因为没有了数据库信息也不会随开机启动了,但是在删除前可能需要先解除管理

9、设置开机自动登录
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  --op  update  -n  node.startup  -v  automatic
-----------------------------------------------------------------
对于还没有关联的节点,编辑配置文件/etc/iscsi/iscsid.conf,在其中增加一项node.startup = automatic ,将默认的node.startup = manual项注释掉,这样以后通过discovery新发现的节点的node.startup都会被设置为automatic,设置自动管理目标器以后,即使没有通过命令设置开机启动,每次启动iscsi服务时都会自动关联目标器

10、取消开机自动登录
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  --op  update  -n  node.startup  -v  manual
-----------------------------------------------------------------

十六、/etc/iscsi/iscsid.conf 主要的配置文件,我们主要关系下面几个部分

1、# Startup settings initator启动设置

node.startup = automatic   是表示当iscsi initator启动时就会自动登陆到发现过的target。

node.startup = manual        是表示当iscsi initator启动时不会自动登陆到发现过的target。

2、# CHAP Settings   主要是一些安全设置。

3、# Timeouts 部分是我们重点关注的地方:

node.session.timeo.replacement_timeout
指网络出现问题,多长时间通知上层:

node.session.timeo.replacement_timeout = 120
一般我们可以把这个时间改小,防止IO被hang太长时间,如:
node.session.timeo.replacement_timeout = 3

下面两个时间是sessison登录和登出Target的超时时间,也可以适当减少。
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.logout_timeout = 15

node.conn[0].timeo.noop_out_interval 指发ping包的时间间隔,
node.conn[0].timeo.noop_out_timeout 为接收心跳包的超时时间

node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5
这两个时间根据需要减少,如:
node.conn[0].timeo.noop_out_interval = 1
node.conn[0].timeo.noop_out_timeout = 1

node.session.initial_login_retry_max 为登录的重试次数:
node.session.initial_login_retry_max = 4
可以适当减少到 2:
node.session.initial_login_retry_max = 2

设置完成后启动iscsi initiator服务

十七 account模式和CHAP认证

1 CHAP认证

基于IP的认证不够安全,不过多数时候已经够用了。但对于安全性要求高的环境来说,使用CHAP认证更好一些。

CHAP(Challenge-Handshake Authentication Protocol),称为挑战式握手认证协议,它是双向认证,当然也支持单向认证。

对于iscsi而言,在CHAP认证的机制上有两种方式:initiator authentication和target authentication。

initiator authentication认证
 
在initiator尝试连接到一个target的时候,initator需要提供一个用户名和密码给target被target进行认证。也就是说initiator需要被target认证,它向target端提供的账号和密码是target端指定的。
 
这个账号和密码对于target来说是流入的账号和密码,用incoming表示。所以后面称呼这个账号和密码为incoming账号和incoming密码。再次说明,incoming账号是initiator端提供给target端,被target端认证的账号。incoming账号可以有多个。
 
target authentication认证
 
在initiator尝试连接到一个target的时候,target有时也需要被initiator认证,以确保该target是合法而非伪装的target,这就要求target提供一个用户名和密码给initiator被initiator进行认证。
 
target向initiator提供的账号和密码对于target而言是流出的,所以称之为outgoing。所以outgoing使用的账号和密码在后文称为outgoing账号和outgoing密码。而对于initiator而言是incoming的,所以在initiator配置文件中称为in。也就是说outgoing账号是target端提供给initiator端,被initiator认证的账号,但尽管如此,这个账号和密码还是在target端创建和绑定的。target的outgoing账号只能有一个。

综上,不管是什么认证,账号和密码都是target端创建和绑定。

以上两种认证方式是有层次顺序的。一般来说,有认证需求的时候都是服务器验证客户端是否有权限,iscsi也一样。

initiator authentication可以单独存在,它可以在没有target authentication的情况下应用,这时候的CHAP认证就是单向认证(target认证initiator的合法性)。

但target authentication只有在initiator authentication的基础上才能进行。也就是说target认证和initiator认证必须同时存在才可以。即initiator和target需要相互认证实现双向CHAP认证

2、tgtadm命令的account模式用法

以下是tgtadm --help关于account的结果,但是用法给的并不全面。

--lld  <driver>  --mode  account  --op  new  --user  <name>  --password  <pass>
--lld  <driver>  --mode  account  --op  delete  --user  <name>
--lld  <driver>  --mode  account  --op bind  --tid  <id>  --user  <name>  [--outgoing]
--lld  <driver>  --mode  account  --op unbind  --tid  <id>  --user  <name>

以下是个人发现的较为全面的用法,为了偷懒,所以使用短选项格式来表示。其中

# 新建一个用户
-L <driver> -m account -o new --u <name> --p <pass>

# 删除一个用户
-L <driver> -m account -o delete --u <name>

# 查看用户列表
-L <driver> -m account -o show

# 绑定用户到target上,outgoing的意义在后文会说明
-L <driver> -m account -o bind -t <tid> -u <name> [--outgoing]

# 从target上解绑用户
-L <driver> -m account -o unbind -t <tid> -u <name> [--outgoing]

十八、实现CHAP单向认证

1、首先确保target的ACL是允许initiator进行discovery的。
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

2、在target端创建initiator authentication所需的账号和密码并绑定到target_ID上。这个账号是用来对initiator进行单向认证的,所以对于target而言是incoming账号。
-----------------------------------------------------------------
root@debian:~# tgtadm  -L  iscsi  -m  account  -o  new --user  laopi  --password  pi1234
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopi
root@debian:~#
-----------------------------------------------------------------

3、查看下绑定情况
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------
由于gtg的工作在用户态,所以配置好后无需重启服务,这些账号相关的就可以生效。

4、在initiator端修改配置文件/etc/iscsi/iscsid.conf,设置以下几项,这里故意没启用密码认证部分,是为了看到认证失败的结果。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi
node.session.auth.password = pi12       #错误的密码
-----------------------------------------------------------------

5、在initiator发现,然后关联。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure) #提示由于授权失败导致iSCSI登录失败
iscsiadm: Could not log into all portals
root@debian:~#
-----------------------------------------------------------------

6、因为认证所需的密码没设置,所以认证失败了。设置为正确的账号和密码再进行发现、关联认证。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi
node.session.auth.password = pi1234      #正确的密码

root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260      #需要从新发现一次
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.      #成功
root@debian:~#
-----------------------------------------------------------------

十九、 实现CHAP双向认证

1、要双向认证,那么target端需要创建一个outgoing账号和密码,并绑定到target上。注意下面的--outgoing选项,表示是从target流出的账号,即表示该target要被initiator认证。target authentication只有在initiator authentication的基础上才能进行。所以要先创建initiator认证
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o new --user laopi --password pi1234
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopi #创建initiator认证
root@debian:~# tgtadm -L iscsi -m account -o new --user laopiout --password pi123456 #两个认证的密码要不一样否则登录会有错误
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopiout --outgoing #创建target认证
root@debian:~#
-----------------------------------------------------------------

2、查看下target上的账号信息。在信息中,outgoing的账号后面使用括号对此进行了标识。
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
laopiout (outgoing)      #两个认证都存在了
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

3、然后在initiator端配置CHAP双向认证。同样,此处先配置一个错误的情况以作比较。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi             #单向的配置选项
node.session.auth.password = pi1234
node.session.auth.username_in = laopiout      #双向的配置选项
node.session.auth.password_in = pi12
-----------------------------------------------------------------

4、重新进行发现和关联。不过首先要解关联已经关联的target。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -U all        #解除已经关联的

root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)      #关联失败和上面报的错误不一样
iscsiadm: Could not log into all portals
root@debian:~#
-----------------------------------------------------------------

5、配置为正确的密码然后再进行发现、关联。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.      #登录成功

root@debian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 18G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 1G 0 part
sdc 8:32 0 5G 0 disk        #可以正常的识别磁盘
sdd 8:48 0 2G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
-----------------------------------------------------------------

二十、tgtadm上解绑和删除用户

1、先查看下有目前有哪些用户。
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o show
Account list:
laopiout
laopi
root@debian:~#
-----------------------------------------------------------------

2、再查看下哪些用户是已经绑定到target上的
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
laopiout (outgoing)
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

3、对incoming账号进行解绑
-----------------------------------------------------------------
root@debian:~#tgtadm -L iscsi -m account -o unbind -t 1 -u laopi
-----------------------------------------------------------------

4、对outgoing账户解绑
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o unbind -t 1 -u laopiout --outgoing
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:                  #绑定的帐号已经全部解除
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

6、删除账户
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o delete -u laopi
root@debian:~# tgtadm -L iscsi -m account -o delete -u laopiout
root@debian:~# tgtadm -L iscsi -m account -o show
root@debian:~#                      #全部删除了
-----------------------------------------------------------------

二一、target将CHAP认证添加到配置文件,重启后依然生效
通过命令生产的配置文件格式如下所示:
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc
incominguser laopi PLEASE_CORRECT_THE_PASSWORD
outgoinguser laopiout PLEASE_CORRECT_THE_PASSWORD
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
如果将上面的文件内容直接导入到配置文件/etc/tgt/conf.d/tgt1.conf(这个文件上面第十二节已经介绍)中,initiator端关联会报认证失败的错误,因为上面的密码部分已经不是通过命令时创建的密码,导入配置文件后需要改成如下的格式
-----------------------------------------------------------------
root@debian:~# tgt-admin --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc
incominguser laopi pi1234           #incoming账号的密码必须直接体现出来
outgoinguser laopiout pi123456       #outgoing账号的密码必须直接体现出来
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
通过上面的更改保持后,重启tgt服务或系统都会生效,正常关联,在通过tgt-admin --dump命令查看到的密码还是没改前的形式

二十二、格式化分区添加的设备

1、查看新添加的设备
-----------------------------------------------------------------
root@debian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 18G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 1G 0 part
sdc 8:32 0 5G 0 disk
sdd 8:48 0 2G 0 disk       #新添加的iscsi设备
sde 8:64 0 5G 0 disk       #新添加的iscsi设备
sr0 11:0 1 1024M 0 rom
-----------------------------------------------------------------
2、将新添加的设备分区格式化为ext4 并挂在到/mnt目录
-----------------------------------------------------------------
root@debian:~# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
udev devtmpfs 991M 0 991M 0% /dev
........
/dev/sde1 ext4 2.0G 6.0M 1.8G 1% /mnt     #成功挂载
root@debian:~#
-----------------------------------------------------------------

二十三、常遇到的问题

1、initiator开机一直处于等待状态
该问题在前文描述过。

出现这个问题是因为initiator端设置了iscsi或iscsid开机自启动,正好又无法和target联系,如通信出现故障、target处于关机状态、target中的tgtd服务未启动、target上的target_id和target_name等配置改变了。

总而言之,开机自启动的时候无法正常关联target就会出现此问题。

解决办法也是建议的办法是把iscsi和iscsid的开机自启动关闭掉,然后把启动他们的命令放到启动加载文件中。

如果已经遇到了无法正常开机的情况,那么可以多等待些时间,或者修改target端让target端能够和initiator匹配上。如target端本来是关机状态,将其开机即可。

initiator连接target后关机开机的顺序是:
关机:先关initiator在关target
开机:先开target在开initiator

2、iSCSI的数据不安全性(不同步性)

因为target共享的分区可以被多个initiator同时挂在,当多个主机同时使用逻辑存储,数据会冲突并且不能及时同步而导致数据丢失。这是因为target没有设备锁机制,也就是当有一个
initiator正在写入的时候不会锁定这个分区不让其他initiator也同时写写入,所以,iscsi一定要配合集群文件系统或者分布式文件系统来使用以防止上述问题。

3、重启tgtd服务不加载配置文件的问题
如果在正常状态下有initiator关联了target设备,此时重启tgtd服务很可能会导致配置文件中的配置不生效,这是为了保护initiator仍然可以随时关联target而不丢失数据和状态设立的机制。但不得不说,这个特性真的很让人烦恼,配置不生效,难道非得再使用tgtadm来重新生成到内核吗?上述问题只有使用force-reload选项或重启能解决
-----------------------------------------------------------------
root@debian:~# systemctl force-reload tgt.service
-----------------------------------------------------------------

https://wiki.archlinux.org/index.php/ISCSI_Target_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://wiki.archlinux.org/index.php/ISCSI_initiator_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://segmentfault.com/a/1190000002717726

https://fedoraproject.org/wiki/Scsi-target-utils_Quickstart_Guide

https://www.cnblogs.com/sting2me/p/6937578.html

https://blog.csdn.net/qqqqqq999999/article/details/72547970

https://www.cnblogs.com/f-ck-need-u/p/9067906.html

https://blog.csdn.net/celeste7777/article/details/48783385

https://forum.huawei.com/enterprise/zh/thread-217813.html

http://stgt.sourceforge.net/manpages/tgtadm.8.html

https://www.cnblogs.com/wuchanming/p/4894373.html

05-08 08:20