一、提供远程块设备(ISCSI)

1、存储概念

    DAS,direct attached storage直连存储,提供的是块设备

    NAS,network attached storage,网络附加存储,通过TCP/IP网络,提供一个文件系统。如:NFS、SAMBA、FTP等。传输的是file,用于分享数据。

    SAN,storage area network,存储区域网络,通过专用的高速网络提供一个没有文件系统的裸设备。传输的是块,用于分享存储设备。

 

1.1、SAN

在SAN中,传输的指令是SCSI的读写指令。

  • FC-SAN,使用专属的FC光纤通道协议,使用光纤作为传输介质。效率高。缺点:需要专属的支持FC协议的FC-HBA卡、光纤交换机等网络设备,成本太高

  • IP-SAN,即ISCSI,使用TCP/IP协议和标准的以太网,成本相对FC-SAN更低。缺点:相对FC-SAN,效率稍欠。

  • FCoE,FC over ethernet,基于以太网的光纤通道,允许在以太网上发送FC帧,光纤存储和以太网共享同一个端口,不再需要单独部署一套专用的FC网络。

 

注意:

  • 在成本方面,IP-SAN的千兆起步价格确实比较便宜,但今天的千兆以太网如果要在性能上与FC-SAN一争高下的话,必须全部升级来达到下一代10G的速度才有可能与4G FC-SAN相提并论。但目前来看,10G以太网技术主要应用在大型城域网骨干,10G桌面的以太网技术和产品尚不普及,10G IP SAN价格也远高于4G FC SAN

  • FCoE,采用增强型的二层以太网(非标准的万兆以太网)作为物理网络传输架构,能够提供标准的光纤通道有效内容载荷,避免了TCP/IP协议开销。使用FCOE,需要支持FCOE协议的交换机和网卡。

 

HBA卡:

  • 专门负责数据块解包工作的网卡,我们叫它HBA卡

 

1.2、ISCSI架构

    Internet SCSI,将SCSI指令和数据封装到TCP/IP包中,然后通过IP网络进行传输。目前IP-SAN基本采用的就是ISCSI协议。

    SCSI:small computer system interface,是一个块数据传输协议

 

ISCSI,由target和initiator组成:

  • target,可以理解为一个SCSI控制器,这里由Linux内核实现。每个target,都有一个ID,称为TID;一个target,可以关联多个后端存储设备(最多32个),实现共享;也可以创建多个target,每个target关联一个存储设备,实现隔离。

  • initiator,连接target的设备,可以是一个硬件(HBA卡),也可以是一个软件。

 

1.3、连接方式

普通以太网卡+initiator软件:

  • TCP/IP协议栈,以及ISCSI协议的处理都需要主机CPU完成。

 

TOE网卡+initator软件:

  • TOE:TCP off-loading engine,TCP负载空闲引擎,将TCP/IP的处理从主机CPU上卸载。

  • TOE网卡自身支持TCP/IP协议栈的处理,减轻主机CPU负担,提高数据传输效率。

 

ISCSI HBA卡:

  • 连接ISCSI设备的专用适配器,支持TOE的同时,也支持对ISCSI协议的处理,更进一步减轻主机CPU负担。

 

1.4、其它术语

  • block,target关联的后端存储

  • IQN,iscsi qualified name,iscsi完全合格名称。target和initiator都基于IQN进行唯一标识(类似光纤通道的WWN)。格式:iqn.YEAR-MONTH.域名反写:string[.substring]

  • string,一般用于标识,比如:哪个机架的哪台主机

  • LUN,logical unit number(逻辑单元号),用于标识一个后端设备

  • ACL,访问控制列表

  • portals,监听端口,默认3260

 

2、target端配置

2.1、装包

#targetcli是Linux-IO Target的用户态的管理配置工具

#targetcli提供一个类似shell的界面,各种Target、TPG、LUN、backstore对象则被组织成目录树的形式,用户可以用ls、cd命令来浏览目录树,用create、delete命令来创建和删除各种对象

yum install -y targetcli

 

2.2、配置防火墙

#开放3260端口

firewall-cmd --permanent --add-port=3260/tcp --zone=public

firewall-cmd --reload

 

2.3、创建block

也就是配置ISCSI的共享资源池

targetcli

>cd backstores/block

>create dev=/dev/vdb name=target1

 

2.4、创建target

>cd iscsi

>create iqn.2016-06.com.example:target1

  • 每个target要有一个唯一标识,IQN,可以手工指定,也可以直接使用create命令,自动生成IQN

  • iqn.年份-月份.域名反写:设备识别

  • 冒号后面只是一个描述,可随便写,但最好和target名称一样,否则容易混淆

 

2.5、创建LUN

#我们需要将前面加入到ISCSI共享资源池中的磁盘设备添加到该target,这样,以后用户登录到该target,就可以使用这块磁盘了。

>cd iscsi/iqn.2016-06.com.example:target1/tpg1/luns

>create /backstores/block/target1

 

2.6、创建ACL

#默认,ISCSI通过客户端IQN来进行身份验证,也就是说,用户在访问target时,不需要用户密码,只要客户端的IQN能和ACL中某一个IQN匹配即可。

>cd iscsi/iqn.2016-06.com.example:target1/tpg1/acls

>create iqn.1994-05.com.redhat:68aa29df771

 

注意:

  • 这里是客户端的标识,在客户端查看:cat /etc/iscsi/initiatorname.iscsi

  • 也可这里设置好,改客户端的标识

 

2.7、创建portals

#设置ISCSI服务端监听的IP和端口,可使用多块网卡,实现多路径。

默认会自动监听0.0.0.0,如果要自定义,要先删除,再创建

>cd iscsi/iqn.2016-06.com.example:target1/tpg1/portals

>delete 0.0.0.0 3260

>create 172.25.0.113260

 

2.8、保存退出

>exit

  • 默认,会将配置保存在:/etc/target/saveconfig.json

 

2.9、重启服务

systemctl restart target

systemctl enable target

 

3、initiator端配置

3.1、安装客户端

yum install -y iscsi-initiator-utils

 

注意:initiator端,有两个服务:

  • iscsi,实现启动时,自动实现和target的持久连接

  • iscsid,实现和target的数据传输

 

systemctl start iscsi

systemctl enable iscsi

systemctl start iscsid

systemctl enable iscsid

 

3.2、发现target

#发现target

iscsiadm -m discovery -t st -p 172.25.0.11

  • -m discovery,指定iscsiadm工具的工作方式,扫描并发现可用ISCSI资源

  • -t st,st是sendtargets的简写,指定扫描操作的类型,通过ISCSI协议,侦测target信息

 

#查看保存在本地的发现信息

ls /var/lib/iscsi/send_targets/

 

3.3、登陆target

#登陆target

iscsiadm -m node -T iqn.2016-06.com.example:target1 -l

  • -m node,将客户端所在主机作为一个节点

  • -T,--targetname,指定要使用的target名称,也就是target的IQN

  • -l,登陆

 

#查看本地块设备

lsblk

 

3.4、查看

yum install -y lsscsi

 

#查看SCSI映射到本地的哪个磁盘

lsscsi

 

#查看会话信息

iscsiadmin -m session -P 3

  • -P,指定会话级别

 

iscsiadmin -m discover -P 1

iscsiadmin -m node -P 1

 

注意:

  • 客户端挂载文件系统的时候,要加_netdev选项,表示网络启动后再挂载,因为磁盘是从网络登陆的,需要网络启动后,才有这个磁盘

 

3.5、排错

如果ACL中的iqn和客户端的iqn不一致,而客户端又没改,就执行了发现操作,后面再改,也是无法登陆的,这时怎么办呢?

systemctl stop iscsi

rm -rf /var/lib/iscsi/{ifaces,nodes,send_targets,slp,static}/*

改客户端的IQN

systemctl start iscsi

 

3.6、注销

#登出

iscsiadm -m node -T iqn.2016-06.com.example:target1 -u

 

#删除发现信息

iscsiadm -m node -T iqn.2016-06.com.example:target1 -o delete

 

lsblk

systemctl restart iscsi

 

4、发现认证

ISCSI认证,只支持CHAP认证方式

iSCSI认证分为发现认证和登录认证,其中每种认证又分为单向认证和双向认证

  • 单向认证,target要验证initiator端

  • 双向认证,是指在单向认证的基础上,initiator端也要验证target端

 

4.1、target端单向认证配置

targetcli

 

#发现认证,这是一个全局配置,所以要在iscsi目录下配置

cd /iscsi/

 

#查看当前设置

get discovery_auth

 

#配置单向认证

set discovery_auth enable=1 userid=user1 password=redhat

  • discovery_auth,表示设置发现认证

  • enable=1,表示开启发现认证

  • userid,target端验证initiator端的用户名

  • password,target端验证initiator端的密码

 

4.2、target端双向认证配置

set discovery_auth enable=1 userid=user1 password=redhat mutual_userid=initiator mutual_password=redhat

  • mutual_userid,initiator端验证target端的用户名

  • mutual_password,initiator端验证target端的密码

 

4.3、initiator端单向认证配置

vi /etc/iscsi/iscsid.conf

#开启CHAP认证

discovery.sendtargets.auth.authmethod = CHAP

 

#指定单向认证账号和密码

discovery.sendtargets.auth.username = user1

discovery.sendtargets.auth.password = redhat

 

4.4、initiator端双向认证配置

vi /etc/iscsi/iscsid.conf

#开启CHAP认证

discovery.sendtargets.auth.authmethod = CHAP

 

#target端验证initiator端的账号和密码

discovery.sendtargets.auth.username = user1

discovery.sendtargets.auth.password = redhat

 

#initiator端验证target端的账号和密码

discovery.sendtargets.auth.username_in = initiator

discovery.sendtargets.auth.password_in = redhat

 

5、登陆认证

登陆认证在每个target下面单独配置

登陆认证分两部分:ACL和authentication

 

5.1、ACL

#generate_node_acls属性表示是否开启ACL,no-gen-acls表示开启,initiator端的iqn号(/etc/iscsi/initiatorname.iscsi下)必须加入acl才能登陆

tagetcli

cd /iscsi/iqn.2019-11.com.example:t1/tpg1/

get attribute generate_node_acls

  • 默认值为0,表示要作ACL过滤

 

5.2、authentication

#在tpg目录下打开认证set attribute authentication=1,表示开启认证,然后设置用户和密码

tagetcli

cd /iscsi/iqn.2019-11.com.example:t1/tpg1/

 

#查看

get attribute authentication

  • 默认为0,表示不开始认证

 

#开启认证

set attribute authentication=1

 

#查看认证

get auth

 

#target端验证initiator端的账号和密码

set auth userid=user1

set auth password=redhat

 

#initiator端验证target端的账号和密码

set auth mutual_userid=initiator

set auth mutual_password=redhat

 

initiator端定义和发现认证一样

 

6、Centos6配置

6.1、target端

yum install -y scsi-target-utils

 

配置工具:

  • tgtadm,完整的配置工具,但重启就没了

  • tgt-admin,根据配置文件/etc/tgt/target.conf配置target

 

6.2、tgtadm

注意:

  • 此种方法,重启配置就没了

 

#启动服务

service tgtd start

chkconfig tgtd on

 

#创建target

tgtadm --lld iscsi --mod target --op new --tid 1 \

--targetname iqn.2008-01.com.example:s1.t1

  • --lld,指定驱动

  • --mod,指定创建的对象

  • --op,指定动作

  • --tid,指定target id

  • --targetname,指定该target的IQN

 

#删除target

tgtadm --lld iscsi --mod target --op delete --tid 1

 

#查看

tgtadm --lld iscsi --mod target --op show

 

注意:

  • 默认,已经有一个LUN0,作为LUN的控制器,所以后面就不能再使用LUN0了。

 

#创建LUN

tgtadmin --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 \

--backing-store /dev/sdb

 

#删除LUN

tgtadmin --lld iscsi --mode logicalunit --op delete --tid 1 --lun 1

 

#授权

#支持两种方式:IP和用户名密码(挑战式握手协议),建议IP方式

#基于IP

tgtadmin --lld iscsi --mode target --op bind --tid 1 \

--initiator-address 192.168.1.0/24

 

#基于用户密码

tgtadm --lld iscsi --mode account --op new \

--user user1 --password redhat

 

#账号绑定到target

tgtadm -L iscsi -m account -o bind --tid 1 --user user1

 

注意:账号密码方式,有两种方式:

  • in,相对于target而言,接收账号密码,用来验证客户端身份

  • out,相对于target而言,提供账号密码,验证target端身份

  • 上面命令不带--outgoing,即表示使用in的方式,验证客户端身份。

 

6.3、target配置永久生效

vi /etc/tgt/targets.conf

default-driver iscsi

<target iqn.2008-01.com.example:l1.c1>

backing-store /dev/vdb

backing-store /dev/vdc

initiator-address 172.25.0.0/16

<target>

 

service tgtd restart

 

#查看

tgtadm -L iscsi -m target -o show

 

6.4、initiator端

yum install -y iscsi-initiator-utils

 

#启动服务

service iscsi start

service iscsid start

chkconfig iscsi on

chkconfig iscsid on

 

#修改iqn

vi /etc/iscsi/initiatorname.iscsi

 

注意:

  • initiator的iqn后面的string,一般是随机值,可以使用iscsi-inam工具创建该IQN

iscsi-iname -p iqn.2008-01.com.example

 

#发现target

iscsiadm -m discovery -t sendtarget -p 172.25.0.11

 

#登陆

iscsiadm -m node -T iqn.2016-06.com.example:target1 -l

 

#基于账号密码

vi /etc/iscsi/iscsid.conf

node.session.auth.username = user1

node.session.auth.password = redhat

discovery.sendtargets.auth.username = user1

discovery.sendtargets.auth.password = user1

 

#in的方式,目前不支持

node.session.auth.username_in = user1

node.session.auth.password_in = redhat

 

service iscsi restart