一、提供远程块设备(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