ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage
Edit page

Linux下搭建i Scsi共享存储的方法 Tgt方式 次

一、概述

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

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

img

img

1、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 设备(目标target或启动器initiator)。此名称类似于与光纤通道设备相关联的全球名称 (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 技术的技术实现)所组成。

2、iSCSI initiator发现iSCSI target的过程:

  1. ISCSI initiator按照配置文件/etc/iscsi/iscsid.conf中配置的相应项目,利用iSCSI的发现机制在网络中搜索目标设备target
  2. ISCSI target将返回有效的iqn名称给iSCSI initiator
  3. ISCSI target按照配置的验证方式接受initiator的登录并返回目标设备target标识
  4. ISCSI initiator发生查询请求给target请求查询target的相关信息
  5. target响应initiator的查询请求,并将设备的有关信息返回给initiator
  6. initiator创建可以的目标设备target列表

3、iSCSI设备的特性:

  • 支持报头和数据摘要
  • 支持两种挑战握手协议CHAP(ChallengeHandshake Authentication Protocol)的认证方式
  • 目标端支持R2T(ReadytoTransfer)流控制
  • 从RHEL4U2开始支持多通道(multipath)
  • 支持sendtargets发现机制
  • 支持动态目标端发现
  • 具备异步事件通知入口
  • 支持即时数据更新
  • 支持动态设备重配
  • 支持自动挂接iSCSI技术
  • 支持IPV6技术

4、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。

5、为什么要搭建iSCSI共享存储?

因为穷!!!,如果有钱最好的方法是买一台真正的存储,因为没钱还要做很多需要共享存储才能测试的功能,比如 Oracle RAC ,虚拟化的HA等都需要一台共享存储,下面将介绍通过Linux 软件来实现iscsi目标器,从而自己搭建一台iscsi存储,组建iscsi

实验

角色IP
Initiator10.0.0.44
target10.0.0.54

二、tgt管理target

1、安装iscsi目标器tgt

由于CentOS 7上面已经废弃了原来的scsi-target-utils,如果想安装可以添加EPEL yum源后安装scsi-target-utils,这里我使用CentOS6.9来实现

[root@CentOS ~]# yum install scsi-target-utils   #Ubuntu: apt install tgt

设置tgt服务开机启动同时启动tgt

[root@CentOS ~]# chkconfig tgtd on    #设置开机启动
[root@CentOS ~]# service tgtd start    #启动tgt

关闭防火墙或开启TCP 3260 端口,tgt通过TCP的3260端口来进行数据的传输。

2、创建tgt共享资源

共享资源可以是分区(不需要格式化)、整块硬盘或通过dd命令创建一个文件,以上的创建方法这里就不介绍了

3、tgtadm创建目标器(target)

我们需要通过命令tgtadm来创建目标器,同时把共享资源添加到目标器中,这样客户端的启动器才可以访问目标器上的存储资源。

服务器端管理配置工具使用tgtadm

tgtadm是一个高度模式化的命令,他们的模式很相近。有三个模式:target、logicalunit、account。指定模式时使用–mode选项。每个mode下有多种操作,可以使用–op来指定对应模式下的选项。另外,使用-lld指定driver(或协议),有两种driver:iscsi和iser,当操作iscsi时,使用iscsi。

1、模式target下的语法格式:

tgtadm --lld <driver> --mode target --op {new|delete|show|update|bind|unbind} [option]
示例:
tgtadm --lld iscsi --mode target --op new --tid 1 --targetname testtarget

其中driver一般为iscsi。

–op后面的参数表示要进行的操作如下

  • new:   表示增加一个target,语法格式为:--tid <id> --targetname <name>。注意:创建target时,tid不能是0,因为0是被系统保留的。
  • 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选项,将被添加的用户作为outgoing账号来使用
  • unbind: 表示在某个特定的target上删除某个账号,语法格式为:account --op unbind --tid <id> --user <name>

4、在tgtadm命令中,某些长选项可以使用短选项来代理,如:

img

4、示例

1、创建一个target

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

如下,分别使用了长格式选项和短格式选项分别创建和显示target。

注意:创建target时,tid不能是0,因为0是被系统保留的。

# 创建一个target
[root@CentOS ~]# tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.pipci.cc.iscsi:debian.tgt1
# 查看target
[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
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
    Account information:
    ACL information:

以上是第一个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/vdb1。当然,使用整个磁盘或通过dd命令创建的文件来做实验也可以。

[root@CentOS ~]# tgtadm -L iscsi -m logicalunit -o new -t 1 -l 1 -b /dev/vdb1
[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
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk  #类型为disk,而非controller
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 1074 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: rdwr  #read+write
            Backing store path: /dev/vdb1
            Backing store flags:
    Account information:
    ACL information:

从LUN 1信息中可以看出,lun type已经是disk而非controller,且显示了此lun的容量大小是2155M。另外还显示了使用的逻辑设备是/dev/sdb1,且是可读可写的(rdwr)。

但到目前为止,该target都没有定义共享给谁,这从target信息的最后两行Account/ACL information中可以看出。

3、绑定特定的initiator

现在将此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@CentOS ~]# tgtadm -L iscsi -m target -o bind -t 1 -I 10.0.0.0/24
[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
            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: 1074 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/vdb1
            Backing store flags:
    Account information:
    ACL information:
        10.0.0.0/24  #允许哪些initiator访问

可以看到ACL information: 这里多了我们刚才添加的网络信息,我们这里添加的是一个网段,也可以添加某个固定的IP地址,共享出去的是target级别而不是lun级别的,所以一旦允许访问这个target,也就允许访问target下的所有LUN了,所以要让多个LUN有不同的主机访问就要创建多个target,通过上面的操作我们就可以通过initiator进行访问了

5、tgt-admin生成target配置文件

target端使用tgtadm命令配置的结果都是工作在内核中的,临时生效,重启tgt服务或重启系统时,内存中的内容都会丢失。所以要永久让配置生效需要写入到配置文件中去。

target的配置文件默认是/etc/tgt/targets.conf,但是可以在/etc/tgt/temp/目录(默认不存在)下建立多个以”.conf"为后缀的配置文件,然后启用主配置文件中的include指令即可。通过target配置文件配置,重启后依然生效。

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

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

tgt的配置文件为/etc/tgt/targets.conf,该配置文件的格式很容易读懂,能实现的target和lun的配置方式多种多样。

[root@centos79-ljz-4 ~]# cat /etc/tgt/targets.conf
# This is a sample config file for tgt-admin.
#
# The "#" symbol disables the processing of a line.

# Set the driver. If not specified, defaults to "iscsi".
default-driver iscsi

# Set iSNS parameters, if needed
#iSNSServerIP 192.168.111.222
#iSNSServerPort 3205
#iSNSAccessControl On
#iSNS On

# Continue if tgtadm exits with non-zero code (equivalent of
# --ignore-errors command line option)
#ignore-errors yes

下面就使用tgt-admin为当前的target生成对应的配置文件来稍作分析。

首先列出当前target的信息。

#显示(show)所有的target
[root@CentOS ~]# 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: 1074 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/vdb1
            Backing store flags:
    Account information:
    ACL information:
        10.0.0.0/24

使用–dump选项输出为配置文件的格式

[root@centos79-ljz-4 ~]# tgt-admin --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
	backing-store /dev/vdb1
	initiator-address 10.0.0.0/24
</target>

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

将通过命令生产的配置信息导入到配置文件/etc/tgt/conf.d/tgt1.conf

# 添加第2个LUN
[root@centos79-ljz-4 ~]# tgtadm -L iscsi -m logicalunit -o new -t 1 -l 2 -b /dev/vdb2

[root@CentOS ~]# mkdir /etc/tgt/temp
#tgt1.conf是自定义的
[root@CentOS ~]# tgt-admin --dump > /etc/tgt/temp/tgt1.conf 

[root@CentOS ~]# cat /etc/tgt/temp/tgt1.conf
default-driver iscsi

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

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

include /etc/tgt/temp/*.conf

将此行注释后,以后可以导出配置文件到/etc/tgt/temp目录下并以.conf作为后缀,重启tgtd服务即可重新加载,而不需要在手动加载了。不过有个问题,使用dump出来的配置文件会有default-driver指令行,而这一行在主配置文件中也有,且他们是不能出现多次的,否则将会报错,所以需要将主配置文件中的default-driver指令注释掉。

现在将已有的target全部删除,再去查看信息就已经没有了

[root@CentOS ~]# tgt-admin --delete ALL
[root@CentOS ~]# tgt-admin -s

重启tgt服务然后查看信息,发现已经有了target

[root@CentOS ~]# service tgtd restart      #重启tgt服务
停止 SCSI target daemon: [确定]
正在启动 SCSI target daemon: [确定]
[root@CentOS ~]# 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: 1074 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/vdb1
            Backing store flags:
        LUN: 2
            Type: disk
            SCSI ID: IET     00010002
            SCSI SN: beaf12
            Size: 1074 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/vdb2
            Backing store flags:
    Account information:
    ACL information:
        10.0.0.0/24

自定义lun的号

backing-store的顺序决定了lun号码的顺序,上面的配置中/dev/vdb1会是Lun1,/dev/vdb2会是lun2。若想要为每个逻辑设备指定想要指定的lun号码,需要将每个backing-store封装在target中并独立指定lun号码。

把/etc/tgt/conf.d/tgt1.conf配置文件改成下面的内容:

[root@CentOS ~]# cat /etc/tgt/conf.d/tgt1.conf
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
  <backing-store /dev/vdb1>
      lun 10
  </backing-store>
  <backing-store /dev/vdb2>
      lun 11
  </backing-store>
	initiator-address 10.0.0.0/24
</target>

[root@CentOS ~]# service tgtd restart     #重启tgt服务
停止 SCSI target daemon: [确定]
正在启动 SCSI target daemon: [确定]

[root@CentOS ~]# 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: 1074 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/vdb1
            Backing store flags:
        LUN: 11
            Type: disk
            SCSI ID: IET     0001000b
            SCSI SN: beaf111
            Size: 1074 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/vdb2
            Backing store flags:
    Account information:
    ACL information:
        10.0.0.0/24

三、iSCSI Initiator

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

1、iscsi-initiator-utils关于initiator说明

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

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

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

  • Discovery (/var/lib/iscsi/send_targets/)

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

  • Node (/var/lib/iscsi/nodes)

/var/lib/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地址和端口构成。

2、安装iscsi-initiator-utils

1、安装initiator程序iscsi-initiator-utils

[root@CentOS ~]# yum install iscsi-initiator-utils  #Ubuntu中使用open-iscsi安装包

安装完成后,比较重要的配置文件有两个:

/etc/iscsi/iscsid.conf :所有刚发起的iSCSI session默认都将使用这个文件中的参数设定

/etc/iscsi/initiatorname.iscsi :软件iSCSI initiator的intiator名称配置文件,后面会介绍

此外,还会有如下命令:

/usr/sbin/iscsi-iname
/usr/sbin/iscsiadm
/usr/sbin/iscsid
/usr/sbin/iscsistart

2、设置iscsi服务开机启动同时启动iscsi

[root@CentOS ~]# chkconfig iscsi on
[root@CentOS ~]# chkconfig iscsid on
[root@CentOS ~]# service iscsi start
[root@CentOS ~]# service iscsid start

启动完查看iscsi和iscsid的服务状态可能还是关闭,不用纠结继续有就可以,这可能是系统的bug

3、iscsi-iname命令

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

1、初始状态的iname如下:

[root@CentOS ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:dee1cfa2225b

2、通过命令iscsi-iname命令生成随机的iqn号

[root@CentOS ~]# iscsi-iname 
iqn.1994-05.com.redhat:693b57cc2fd
[root@CentOS ~]# iscsi-iname
iqn.1994-05.com.redhat:3383d6c3831b
[root@CentOS ~]# iscsi-iname
iqn.1994-05.com.redhat:c1226551ce

通过上面的执行可以看出来,每次运行这个命令都会生成一个不一样的iqn号,但是iqn的前缀iqn.1994-05.com.redhat:都是一样的,只是后面的随机数不一样。

我们可以通过“-p”选项来指定前缀,如下所示:

[root@CentOS ~]# iscsi-iname -p iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:45ecbde3d08c
[root@CentOS ~]# iscsi-iname -p iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:105a189c3c1          #只是后面的随机数变化了

3、通过修改/etc/iscsi/initiatorname.iscsi的内容来实现默认的iqn

通过上面的命令生成的iqn重启iscsi服务后还会读取默认的,所以我们直接通过修改这个配置文件来得到一个容易记忆的iqn修改内容如下:

[root@CentOS ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2019-10.cc.pipci.iscsi:sn8888 #后面的随机数推荐用主机的sn号后4位或6位,这样比较好管理

#修改完重启服务
[root@CentOS ~]# service iscsi restart

十五、iscsiadm命令

iscsiadm是用来管理(更新、删除、插入、查询)iSCSI配置数据库文件的命令行工具,用户能够用它对iSCSI nodes、sessions、connections和discovery records进行一系列的操作。

iscsiadm也是一个模式化的命令,使用-m指定mode。mode有:discovery、node、session、iface。一般就用前两个mode。

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

在客户端使用Target提供的存储空间前,必须在服务器上通过Initiator软件执行以下步骤:

发现目标设备 –> 关联(登录)目标设备 –> 与目标设备建立会话

下面分别说明通过各个命令进行说明。

**1、发现target(discovery)**生成node

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

即使用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。

示例:现在可以进行discovery来发现target

[root@centos79-ljz-3 ~]# iscsiadm -m discovery -t st -p 10.0.0.54:3260
10.0.0.54:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

#测试一个不存在的target
[root@centos79-ljz-3 ~]# iscsiadm -m discovery -t st -p 10.0.0.55:3260
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: cannot make connection to 10.0.0.55: No route to host
iscsiadm: connection login retries (reopen_max) 5 exceeded
iscsiadm: Could not perform SendTargets discovery: encountered connection failure

如果出现以上错误,检查下是不是防火墙阻挡了,是不是IP地址写错了。

在发现了target后,在/var/lib/iscsi中的nodes和send_targets目录中就有了文件。

[root@centos79-ljz-3 ~]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│   └── iqn.pipci.cc.iscsi:debian.tgt1
│       └── 10.0.0.54,3260,1
│           └── default
├── send_targets
│   ├── 10.0.0.54,3260
│   │   ├── iqn.pipci.cc.iscsi:debian.tgt1,10.0.0.54,3260,1,default -> /var/lib/iscsi/nodes/iqn.pipci.cc.iscsi:debian.tgt1/10.0.0.54,3260,1
│   │   └── st_config
│   └── 10.0.0.55,3260  #discovery失败
│       └── st_config
├── slp
└── static

11 directories, 3 files

可以看到,对于discovery失败的在send_targets目录中也会记录,只不过是空目录。在nodes目录和正确discovery到的send_targets子目录中都有几个配置文件,都是些参数信息。而且可以看到,send_targets中的目录是nodes目录的软链接。

如果想重新发现已存在的target时,可以清空nodes目录中对应的项,然后再discovery。

查看发现的target

# 查看已经发现的target:
root@ipmi237:~# iscsiadm -m node  #1个target对应多个node
10.110.64.126:3260,-1 iqn.2010-10.org.openstack:volume-ffa423bb-6ccb-4cba-9738-076af3605e8a
10.110.64.126:3260,-1 iqn.2010-10.org.openstack:volume-4b287249-6f47-43c4-8a43-89b07b0075ec
10.110.64.126:3260,-1 iqn.2010-10.org.openstack:volume-61ddf535-4f71-4c6d-bf3a-3dcc33f5b428
10.110.64.126:3260,-1 iqn.2010-10.org.openstack:volume-5887d7b1-d2b6-4abc-a21d-9818950c4f90
10.110.64.126:3260,-1 iqn.2010-10.org.openstack:volume-b4c1b5df-614a-4c2c-95b8-13d573caed30

在完成目标发现后,即可以登录(关联)到相应的节点,使用目标设备提供的存储空间。

**2、关联target(node)**建立session

关联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。发现的target都会保存在本地的数据库中
[root@CentOS ~]# iscsiadm -m node
10.0.0.54:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

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

关联发现的所有目标器:

iscsiadm -m node -L all

实际上,在执行discovery的时候很可能就已经自动执行了关联,所以再次关联很可能什么消息也看不到。如果是这样的话,需要先退出session,再进行关联。当然也可能是直接显示successful,这样就说明原来discovery的时候是没有主动关联的。

iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 10.0.0.54:3260 -u

此时lsblk看看是否已经多出了两块硬盘出来。

[root@centos79-ljz-3 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    1G  0 disk  #第1块
sdb      8:16   0    1G  0 disk  #第2块
vda    252:0    0   40G  0 disk
├─vda1 252:1    0  500M  0 part /boot
└─vda2 252:2    0 39.5G  0 part /

现在就可以对这两块逻辑盘进行分区格式化(创建文件系统),并投入使用。

此时先看下target端的target信息。

[root@centos79-ljz-4 ~]#tgt-admin -s | less
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:  #表示initiator到target的关联信息
        I_T nexus: 1
            Initiator: iqn.1994-05.com.redhat:dee1cfa2225b alias: centos79-ljz-3.novalocal
            Connection: 0
                IP Address: 10.0.0.44
    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: 1074 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/vdb1
            Backing store flags:
        LUN: 11
            Type: disk
            SCSI ID: IET     0001000b
            SCSI SN: beaf111
            Size: 1074 MB, Block size: 512
            Online: Yes
            Removable media: No
:

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

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

现在在initiator上将/dev/sdb进行格式化,并向其中写入一个文件。

parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart /dev/sdb1 ext4 1 10G
mkfs.ext4 /dev/sdb1
parted /dev/sdb print
mount /dev/sdb1 /mnt/
echo "haha" > /mnt/test.txt

然后配置服务器C(192.168.100.6),让其作为另一台initiator。

bash> yum -y install iscsi-initiator-utils
bash> iscsiadm -m discovery -t st -p 192.168.100.151:3260
bash> iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l
bash> fdisk -l
bash> mount /dev/sdb1 /mnt

bash> ls /mnt
lost+found  test.txt

不出所料,C服务器也能挂载/dev/sdb1,且在B服务器写入的test.txt文件也已经同步过来了。

再看看此时target的target信息。

bash> tgt-admin -s
Target 1: iqn.2017-03.com.longshuai:test.disk1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 1
            Initiator: iqn.2017-03.com.longshuai:b01d684ad13f
            Connection: 0
                IP Address: 192.168.100.5
        I_T nexus: 2
            Initiator: iqn.1994-05.com.redhat:42b7f829d2ec
            Connection: 0
                IP Address: 192.168.100.6

现在在C服务器上,向/dev/sdb1挂载的目录/mnt下写入一个文件,看看是否会同步到B服务器上。

echo "hehe" >/mnt/test1.txt

在192.168.100.5上执行:

ls /mnt/
lost+found  test.txt

echo "heihei" >/mnt/test3.txt

显然,test1.txt并没有同步到B服务器上。同理,此时B中再写入文件也不会同步到C上。

那么在C上卸载/mnt,然后再次挂载会有什么情况呢?

umount /mnt
mount /dev/sdb1 /mnt

ls /mnt
lost+found  test3.txt  test.txt

没看错,test1.txt确实没了。这就是使用iscsi出现的问题,多个主机同时使用逻辑存储,数据会冲突并且不能及时同步而导致数据丢失。

所以,iscsi一定要配合集群文件系统或者分布式文件系统来使用以防止上述问题。

4、其他操作

查看登录的session

可以通过选项-P 0|1|2|3 来打印更详细的信息

[root@centos79-ljz-3 ~]# iscsiadm -m session
tcp: [1] 10.0.0.54:3260,1 iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)


[root@centos79-ljz-3 ~]# iscsiadm -m session -P 2     #打印更详细的信息
Target: iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)
	Current Portal: 10.0.0.54:3260,1
	Persistent Portal: 10.0.0.54:3260,1
		**********
		Interface:
		**********
		Iface Name: default
		Iface Transport: tcp
		Iface Initiatorname: iqn.1994-05.com.redhat:dee1cfa2225b
		Iface IPaddress: 10.0.0.44
		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

重新扫描所有关联的target/session

一旦登录成功,所有分配给当前主机的LUN都可以看到了,但有时,新分配的LUN,LUN的信息发生变化后,主要不能立即看到,这样就需要rescan了: -R|--rescan

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


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

解除关联

解除单个关联:

[root@centos79-ljz-3 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    1G  0 disk
sdb      8:16   0    1G  0 disk
vda    252:0    0   40G  0 disk
├─vda1 252:1    0  500M  0 part /boot
└─vda2 252:2    0 39.5G  0 part /

[root@centos79-ljz-3 ~]# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 10.0.0.54:3260 -u
Logging out of session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 10.0.0.54,3260]
Logout of [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 10.0.0.54,3260] successful.

[root@centos79-ljz-3 ~]# lsblk  #之前的磁盘已经不存在
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    252:0    0   40G  0 disk
├─vda1 252:1    0  500M  0 part /boot
└─vda2 252:2    0 39.5G  0 part /

解除所有关联:

iscsiadm -m node -U all

删除关联的node

连接死掉时(断网或者target端断掉或目标器IP改变),可以删除老节点,然后再重新发起discovery生成新节点。

使用如下指令删除单个node:

[root@centos79-ljz-3 ~]# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 10.0.0.54:3260 -o delete

[root@centos79-ljz-3 ~]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
├── send_targets
│   ├── 10.0.0.54,3260
│   │   └── st_config
│   └── 10.0.0.55,3260
│       └── st_config
├── slp
└── static

8 directories, 2 files

[root@centos79-ljz-3 ~]# iscsiadm -m node
iscsiadm: No records found

删除所有node信息:

iscsiadm -m node -o delete

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

设置开机自动登录

[root@CentOS ~]# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 10.0.0.54:3260 --op update -n node.startup -v automatic

对于还没有关联的节点,编辑配置文件/etc/iscsi/iscsid.conf,在其中增加一项node.startup = automatic ,将默认的node.startup = manual项注释掉,这样以后通过discovery新发现的节点的node.startup都会被设置为automatic,设置自动管理目标器以后,即使没有通过命令设置开机启动,每次启动iscsi服务时都会自动关联目标器

取消开机自动登录

[root@CentOS ~]# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 10.0.0.54:3260 --op update -n node.startup -v manual

十六、/etc/iscsi/iscsid.conf 配置文件

3.1 initiator的配置文件

一般而言,对于initiator的配置文件/etc/iscsi/iscsid.conf,里面默认设置了重启服务就自动对已发现过的target进行关联,所以重启iscsi服务的时候会自动进行关联

如果不使用CHAP,则基本可以无视这个配置文件。使用CHAP认证的时候配置下面CHAP相关的段落就够了,其他的配置段落可以不用理会。关于CHAP认证,稍后就介绍。

# *************
# CHAP Settings
# *************

####以下是initiator authentication相关
# To enable CHAP authentication set node.session.auth.authmethod to CHAP. The default is None.
#node.session.auth.authmethod = CHAP

# To set a CHAP username and password for initiator authentication by the target(s):
#node.session.auth.username = username
#node.session.auth.password = password

####以下是target authentication相关
# To set a CHAP username and password for target(s) authentication by the initiator:
#node.session.auth.username_in = username_in
#node.session.auth.password_in = password_in

####以下是discovery认证相关,iscsi-initiator-utils似乎不支持这个认证,所以以下项不能开启和设置
# To enable CHAP authentication for a discovery session to the target
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
#discovery.sendtargets.auth.authmethod = CHAP

# To set a discovery session CHAP username and password for the initiator authentication by the target(s):
#discovery.sendtargets.auth.username = username
#discovery.sendtargets.auth.password = password

# To set a discovery session CHAP username and password for target(s) authentication by the initiator:
#discovery.sendtargets.auth.username_in = username_in
#discovery.sendtargets.auth.password_in = password_in

所以,如果只要实现单向认证,则开启以下三项即可。

node.session.auth.authmethod = CHAP
node.session.auth.username = username
node.session.auth.password = password

如果要实现双向认证,则需要开启以下5项。

node.session.auth.authmethod = CHAP
node.session.auth.username = username
node.session.auth.password = password
node.session.auth.username_in = username_in
node.session.auth.password_in = password_in

且需要注意的是,如果是单向认证,则后两项必须不能开,开了就会进行双向认证。

虽然iscsi-initiator-utils支持discovery认证,但是由于scsi-target-utils不支持discovery认证,所以在认证关联target之前必须先进行discovery,也就是说在target端的访问控制列表ACL项中必须要定义允许initiator进行discovery。

我们主要关系下面几个部分

**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服务

4.1 CHAP认证

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

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

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

  1. initiator authentication认证   在initiator尝试连接到一个target的时候,initator需要提供一个用户名和密码给target被target进行认证。也就是说initiator需要被target认证,它向target端提供的账号和密码是target端指定的。   这个账号和密码对于target来说是流入的账号和密码,用incoming表示。所以后面称呼这个账号和密码为incoming账号和incoming密码。再次说明,incoming账号是initiator端提供给target端,被target端认证的账号。  
  2. 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端创建和绑定。

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

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

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

4.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]

4.3 实现CHAP单向认证

  1. 首先确保target的ACL是允许initiator进行discovery的。
bash> tgt-admin -s | sed -n '/Account/,$p'
    Account information:
    ACL information:
        192.168.100.0/24
  1. 在target端创建initiator authentication所需的账号和密码并绑定到target_ID上。这个账号是用来对initiator进行单向认证的,所以对于target而言是incoming账号。
tgtadm -L iscsi -m account -o new --user incoming_malong --password incoming_123456 
tgtadm -L iscsi -m account -o bind -t 1 --user incoming_malong

查看下绑定情况。

tgt-admin -s | sed -n '/Account/,$p'
    Account information:
        incoming_malong
    ACL information:
        192.168.100.0/24

由于tgtg的工作在内核当中的,所以配置好后无需重启服务,这些账号相关的就可以生效。

  1. 在initiator端修改配置文件/etc/iscsi/iscsid.conf,设置以下几项,这里故意没启用密码认证部分,是为了看到认证失败的结果。。(这里使用的是服务器B,即192.168.100.5这台机器,服务器C即192.168.100.6在后面绑定多个账号的时候拿来做测试用)
vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_malong
#node.session.auth.password = incoming_123456
  1. 在initiator发现,然后关联。
bash> iscsiadm -m discovery -t st -p 192.168.100.151:3260
192.168.100.151:3260,1 iqn.2017-03.com.longshuai:test.disk1  
   
bash> iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l
Logging in to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals

因为认证所需的密码没设置,所以认证失败了。设置为正确的账号和密码再进行发现、关联认证。

bash> vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_malong
node.session.auth.password = incoming_123456

bash> iscsiadm -m discovery -t st -p 192.168.100.151:3260
192.168.100.151:3260,1 iqn.2017-03.com.longshuai:test.disk1

bash> iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l
Logging in to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] (multiple)
Login to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] successful.

4.4 实现CHAP双向认证

要双向认证,那么target端需要创建一个outgoing账号和密码,并绑定到target上。注意下面的--outgoing选项,表示是从target流出的账号,即表示该target要被initiator认证。

tgtadm -L iscsi -m account -o new --user outgoing_malong --password outgoing_123456
tgtadm -L iscsi -m account -o bind -t 1 --user outgoing_malong --outgoing

查看下target上的账号信息。在信息中,outgoing的账号后面使用括号对此进行了标识。

tgt-admin -s | sed -n '/Account/,$p'
    Account information:
        incoming_malong
        outgoing_malong (outgoing)
    ACL information:
        192.168.100.0/24

然后在initiator端配置CHAP双向认证。同样,此处先配置一个错误的情况以作比较。

vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_malong
node.session.auth.password = incoming_123456
node.session.auth.username_in = outgoing_malong
#node.session.auth.password_in = outgoing_123456

重新进行发现和关联。不过首先要登出已经登录的target。

iscsiadm -m node -Tiqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -u

iscsiadm -m discovery -t st -p 192.168.100.151:3260
192.168.100.151:3260,1 iqn.2017-03.com.longshuai:test.disk1

iscsiadm -m node -Tiqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l
Logging in to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2017-03.com.longshuai:test.disk1, portal: 192.168.100.151,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)
iscsiadm: Could not log into all portals

它提示遇到不可重试的iscsi登录错误,因为target无法被initiator认证,initiator认为这个target是非法的target。

配置为正确的密码然后再进行发现、关联。

vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_malong
node.session.auth.password = incoming_123456
node.session.auth.username_in = outgoing_malong
node.session.auth.password_in = outgoing_123456

iscsiadm -m discovery -t st -p 192.168.100.151:3260
iscsiadm -m node -Tiqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l

4.5 绑定多个outgoing账号

tgtadm -L iscsi -m account -o new --user outgoing_user1 --password outgoing_passwd1

tgtadm -L iscsi -m account -o bind -t 1 --user outgoing_user1 --outgoing
tgtadm: this target already has an outgoing account

绑定的时候提示已经有一个outgoing账号,说明一个target的outgoing账号只能有一个。也就是说,某一个target被认证的时候是1对多的关系。

但是incoming账号并非如此。

4.6 绑定多个incoming账号

tgtadm -L iscsi -m account -o new --user incoming_user1 --password incoming_passwd1
tgtadm -L iscsi -m account -o new --user incoming_user2 --password incoming_passwd2 
tgtadm -L iscsi -m account -o bind -t 1 --user incoming_user1   
tgtadm -L iscsi -m account -o bind -t 1 --user incoming_user2 

tgt-admin -s | sed -n '/Account/,$p'
    Account information:
        incoming_malong
        incoming_user1
        incoming_user2
        outgoing_malong (outgoing)
    ACL information:
        192.168.100.0/24

用服务器C即192.168.100.6来登录一个看看。

vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_user1
node.session.auth.password = incoming_passwd1
node.session.auth.username_in = outgoing_malong
node.session.auth.password_in = outgoing_12345

发现并关联。

iscsiadm -m node -U all
iscsiadm -m discovery -t st -p 192.168.100.151:3260
iscsiadm -m node -T iqn.2017-03.com.longshuai:test.disk1 -p 192.168.100.151:3260 -l

所以,incoming账号可以有多个。

4.7 解绑和删除用户

先查看下有目前有哪些用户。

tgtadm -L iscsi -m account -o show
Account list:
    outgoing_user1
    incoming_user2
    incoming_user1
    outgoing_malong
    incoming_malong

再查看下哪些用户是已经绑定到target上的。

tgt-admin -s | sed -n '/Account/,$p'
    Account information:
        incoming_malong
        incoming_user1
        incoming_user2
        outgoing_malong (outgoing)
    ACL information:
        192.168.100.0/24

对incoming_user1和incoming_user2进行解绑。

tgtadm -L iscsi -m account -o unbind -t 1 -u incoming_user1
tgtadm -L iscsi -m account -o unbind -t 1 -u incoming_user2

对outgoing账户解绑。

tgtadm -L iscsi -m account -o unbind -t 1 -u outgoing_malong --outgoing

删除多余的账户。

tgtadm -L iscsi -m account -o delete -u incoming_user1 
tgtadm -L iscsi -m account -o delete -u incoming_user2
tgtadm -L iscsi -m account -o delete -u outgoing_malong
tgtadm -L iscsi -m account -o delete -u outgoing_user1 

第5章 快速配置iscsi两端

这里是对前文的一个总结,用于解释要使用iscsi时对target端和initiator大致需要做哪些事情。

#############################
# target端所需要做的事情
#############################

tgtadm -L iscsi -m target -o new -t 1 -T iqn.2017-03.com.longshuai:test1.disk1
tgtadm -L iscsi -m logicalunit -o new -t 1 -l 1 -b /dev/sdb1
tgtadm -L iscsi -m logicalunit -o new -t 1 -l 2 -b /dev/sdc
tgtadm -L iscsi -m target -o bind -t 1 -I 192.168.100.0/24

#如果要CHAP认证,则继续添加相关账户和密码并绑定到target上
tgtadm -L iscsi -m account -o new -u USERNAME -p PASSWORD
tgtadm -L iscsi -m account -o bind -t 1 -u USERNAME [--outgoing]

#最后将配置放入到配置文件中
sed -i -r 's/#include(.*)/include\1/' /etc/tgt/targets.conf
mkdir /etc/tgt/temp
tgt-admin --dump | sed '/default/d' >/etc/tgt/temp/tgt1.conf

#不用重启服务。
#如特殊情况,出现重启tgtd服务器但是配置文件不生效的情况,适应force-reload选项
#service tgtd force-reload


#############################
# initiator端所需要做的事情
#############################

#第一件事是决定是否要自定义initiator的名称,如果需要自定义,则修改/etc/iscsi/initiatorname.iscsi文件
#首先discovery目标主机上有哪些可用的target
iscsiadm -m discovery -t st -p 192.168.100.151:3260

# 然后登陆target
iscsiadm -m node -T iqn.2017-03.com.longshuai:test1.disk1 -p 192.168.100.151:3260 -l

#如果需要CHAP认证,则启用/etc/iscsi/iscsid.conf中的相关CHAP认证指令
#前三项实现单向认证,target端认证initiator是否合法
#同时启用这5项实现双向认证,target端和initiator都会认证对方是否合法
node.session.auth.authmethod = CHAP
node.session.auth.username = incoming_malong
node.session.auth.password = incoming_123456
node.session.auth.username_in = outgoing_malong
node.session.auth.password_in = outgoing_123456

第6章 windows上配置initiator

在"运行"中输入iscsicpl.exe,打开iscsi发起程序。

Linux上配置使用iSCSI详细说明 Linux 第19张

Linux上配置使用iSCSI详细说明 Linux 第20张

但要注意,Windows中格式化的NTFS文件系统在Linux中默认是不支持的,所以iscsi的共享存储不能跨Windows和Linux系统使用,除非安装支持插件。

二十三、常遇到的问题

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

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

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

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

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

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

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

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

参考资料:

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