1、概述
ISCSI ( internel small system computer interface):是基于TCP/IP网络 的存储技术,它利用TCP/IP网络来存储scsi命令,本身因为TCP/IP的特性,因此会架构便宜(IP 网络设备价格远比存储网络的价格要低),可以从LAN扩展到WAN上面
IP-SAN是作为存储区域网络的一种便宜的方案,但通常我们建议是将IP-SAN 建立在一个单独隔离的网络上,而不是和平常的业务网络一起用(存储网络与业务网络分离)
iscsi协议本身不加密,只是在发起连接的时候有CHAP认证(包括单向认证和双向认证),在互联网上传送并不安全,因此较少用在互联网上,通常是作为一个单独的存储网络使用,另外也可以使用LUKS linux unified key setup磁盘加密,这样保证数据在传送过程中加密,但协议本身是没有保护的,也可以让ipsec协议保护,因为ipsec本身有认证和加密的功能
Iscsi使用TCP协议、默认使用3260端口
冗余:
可以用网卡绑定或者多径来保证存储访问的高可用性
注意:bonding只是保证网卡到它连接的设备(通常是交换机)的高可用,但是多径技术 (multi-path)是保证端到端的冗余,因此多径技术更高级。
iscsi相对于NFS 或者DAS HDD的好处在于:
1、对于DAS而言,服务器坏了,硬盘没坏,也不能访问了
iscsi磁盘还是可以让其他客户端访问的
2、NFS而言,扩容不容易
iscsi target 可以1个,2个,3个,直接扩容,创建物理卷,将物理卷加入现存卷组,扩容逻辑卷,创建文件系统,加挂,但nfs有难度
3、要求网络存储,提供给多台主机同时访问,如集群环境
iscsi协议
理解ISCSI协议重点是理解封装的概念,SCSI命令通过 iscis协议封装后在TCP/IP网络上传送,因此需要CPU资源来处理报文头的封装与解封装(也有专用的iscsiHBA卡,不过价格较贵罢了)
iSCSI术语
IQN(iSCSI Qualified Name)用来识别iSCSI通信的服务端和客户端,格式是
iqn.yyyy-mm.com.reverse.domain:optional-extra-name
如主机名为instructor.example.com。第一个分享的LV空间可以是iqn.2013-10.com.example.instructor:lv1-my-first-lv
可选部分(含前面的冒号)加上可以用于区分多个分享的设备,如有多个lv要分享的时候
target :iSCSI服务端叫target,target 分享LUN,logical unit ,一台服务器可以分享一个或者多个LUN
initiator:iSCSI客户端叫initiator,可以由软硬件实现,通常软件实现的较多(省钱)
node: iSCSI服务端,iSCSI客户端都叫node
Portal :在iSCSI中,Portal是一个target或者initiator的IP,用于建立连接
iSNS: internet storage name service ,一个命名服务,用来让initiator发现target,较少使用
2、安装包
scsi-target-utils
iscsi-initiator-utils
scsi-target-utils包中的主要配置文件以及命令:
/etc/tgt/target.conf : 主要配置文件
/usr/sbin/tgt-admin : 在线查询、删除target等功能的命令
/usr/sbin/tgtd : 主要提供iscsi target服务的主程序
iscsi-initiator-utils中的主要配置文件以及命令:
/etc/iscsi/iscsid.conf : 主要配置文件
/sbin/iscsid : 启动iscsi initiator的主要服务程序
/sbin/iscsiadm : 管理iscsi initiator的管理程序
/etc/intit.d/iscsid : 主要服务进程
/etc/init.d/iscsi : 启动该脚本,可以使发现过的iscsi target配置生效,一般直接使用该脚本即可,initiator未执行的话,会调用/etc/init.d/iscsid启动initiator。
Target可做磁盘分享给Initiator使用的方式:
(1)大型文件(dd命令生成)(2) 磁盘阵列、磁盘或者磁盘分区等真实磁盘(3)使用LVM中的逻辑卷LV
3、tgtadm命令详解
[root@ser ~]# tgtadm -h
Usage: tgtadm [OPTION]Linux SCSI Target Framework Administration Utility, version 1.0.24--lld <driver> --mode(模式) target --op(操作) new --tid <id> --targetname <name> 注:tid不能为0,0默认保留给本机--lld <driver> --mode target --op delete [--force] --tid <id>--lld <driver> --mode target --op show--lld <driver> --mode target --op show --tid <id>--lld <driver> --mode target --op update --tid <id> --name <param> --value <value> //更改目标参数--lld <driver> --mode target --op bind(绑定) --tid <id> --initiator-address <address>--lld <driver> --mode target --op bind --tid <id> --initiator-name <name>--lld <driver> --mode target --op unbind(解除绑定) --tid <id> --initiator-address <address>--lld <driver> --mode target --op unbind --tid <id> --initiator-name <name>--lld <driver> --mode logicalunit(逻辑磁盘块) --op new --tid <id> --lun <lun> \--backing-store <path> --bstype <type> --bsoflags <options>--lld <driver> --mode logicalunit(逻辑单元) --op delete --tid(tid号) <id> --lun(逻辑单元) <lun>--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>--control-port <port> use control port <port>--help display this help and exittgtadm模式化命令:
--mode
常用模式:target、logicalunit、account
target --op
new 、delete、show、update、bind、unbind
logicalunit --op //逻辑单元块(可以是一个卷、一个磁盘、一个RAID、一个LVM),一定要在target的基础上创建lun,并为lun分配一个单元号
new 、delete
account --op //帐号绑定
new、delete、bind、unbind
--lld //设备块地址
--tid //指定tid号,target的编号。不可为0,0保留给当前主机使用的。
--lun //指定逻辑单元号
--backing-store //指定后端存储
--user //指定用户名
--password //指定密码
targetname(target命名):
iqn.yyyy-mm.<reversed domain name>[:identifier]
例如:iqn.2014-12.com.wgmml:t
t:是描述,可以是硬盘所在机房机柜位置。注以时间后域名段要反写。如上
例:
服务端:
# tgtadm --lld iscsi --mode target --op new --targetname iqn.2014.12.com.ser:dosk1 --tid 1
//新建一个target,target名为iqn.2014.12.com.ser:dosk1 ,tid为1
# tgtadm --lld iscsi --mode target --op show //查看当前主机target
注:一个target上最多有32个lun
# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb
//在tid为1的target上创建新lun并连接存储设备(sdb为新加的硬盘)
# tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 10.1.1.0/24
//绑定10.1.1.0/24网段可访问tid为1的target
客户端:
# iscsi-iname //显示initatorname
iqn.1994-05.com.redhat:c42a4a9748db
# iscsi-iname -p iqn.1994-05.com.wgmml //命令更改initator端名
iqn.1994-05.com.wgmml:35536bb7a6
#vim /etc/iscsi/initiatorname.iscsi //保存initator名的文件,也可以在此文件创建别名
# echo "InitiatorName=`iscsi-iname -p iqn.2014.12.com.wgmml`" > /etc/iscsi/initiatorname.iscsi
//iscsi-iname -p修改后的InitiatorName永久保存到initiatorname.iscsi 文件
# iscsiadm -h
iscsiadm -m discoverydb [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type -p ip:port -I ifaceN ... [ -Dl ] ] | [ [ -p ip:port -t type] [ -o operation ] [ -n name ] [ -v value ] [ -lD ] ]
iscsiadm -m discovery [ -hV ] [ -d debug_level ] [-P printlevel] [ -t type - p ip:port -I ifaceN ... [ -l ] ] | [ [ -p ip:port ] [ -l | -D ] ]
iscsiadm -m node [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ -S ] [ [ -T targetname -p ip:port -I ifaceN ] [ -l | -u | -R | -s] ] [ [ -o operation ] [ -n name ] [ -v value ] ]
iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]
iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename | -H hostno|MAC ] [ [ -o operation ] [ -n name ] [ -v value ] ] [ -C ping [ -a ip ] [ -b packetsize ] [ -c count ] [ -i interval ] ]
iscsiadm -m fw [ -l ]
iscsiadm -m host [ -P printlevel ] [ -H hostno|MAC ] [ -C chap [ -o operation ] [ -v chap_tbl_idx ] ]
iscsiadm -k priority
iscsiadm模式化命令
-m
常用模式:discovery|node|session|iface
discovery:发现某服务器是否有target输入,以及输出哪些target;
node:管理跟某target的关联关系,建立关联、断开关联。。。
session:会话管理
iface:端口管理
例:
# iscsiadm -m discovery -d 2 -t st -p 10.1.1.2
10.1.1.2:3260,1 iqn.2014.12.com.wgmml:disk1
//查看10.1.1.2主机共享的target及端口,发现完后会在/var/lib/iscsi/send_targets/下显示记录,不想使用是需要删除。
# iscsiadm -m node -T iqn.2014.12.com.wgmml:disk1 -p 10.1.1.2 -l
//挂载登录 10.1.1.2target服务器 iqn.2014.12.com.wgmml:disk1磁盘
4、实例一:target端共享一个10G的硬盘块,硬盘路径为/dev/sdb,target端ip:10.1.1.2 Initiator端ip:10.1.1.3
Target端:
[root@ser ~]# yum install scsi-target-utils //YUM安装scsi target端
[root@ser ~]# service tgtd start //启动服务
[root@ser ~]# netstat -na |grep 3260 //查看是否启动
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN tcp 0 0 :::3260 :::* LISTEN
[root@ser ~]# tgtadm --lld iscsi --mode target --op new --targetname iqn.2014.12.disk1 --tid 1 //创建一个新的target,命名为 iqn.2014.12.disk1 ,target的tid为1
[root@ser ~]# tgtadm --lld iscsi --mode target --op show //查看本机的target基本信息,包括target名及target下Lun信息、磁盘大小等信息
[root@ser ~]# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb //在tid为1的target下创建新lun并连接logicalunit
[root@ser ~]# tgtadm --lld iscsi --mode target --op show //查看新lun是否添加成功
[root@ser ~]# tgtadm --lld iscsi --mode target --op bind --tid 1 -I ALL //target设置访问权限允许任意访问
[root@ser ~]# tgtadm --lld iscsi --mode target --op unbind --tid 1 -I ALL //任意访问不安全,删除任意访问权限
注:为target分配任意存储设备后,需要设置访问权限控制后才可以使用。
[root@ser ~]# tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.1.1.0/24 //设置指定网段可访问
注: 访问控制列表可使用“tgtadm --lld iscsi --mode target --op show”下的“ACL information”查看
Initiator端:
Linux:
[root@initiator ~]# yum install iscsi-initiator-utils //安装initiator端
[root@initiator ~]# iscsiadm -m discovery -t sendtargets -p 10.1.1.2 //发现网络中可用的target
Starting iscsid: [ OK ]
10.1.1.2:3260,1 iqn.2014.12.disk1
[root@initiator ~]# iscsiadm -m node -T iqn.2014.12.disk1 -p 10.1.1.2 -l //登录可用target会话
Logging in to [iface: default, target: iqn.2014.12.disk1, portal: 10.1.1.2,3260] (multiple)
Login to [iface: default, target: iqn.2014.12.disk1, portal: 10.1.1.2,3260] successful.
[root@initiator ~]# fdisk -l //查看是否多了一个10G的磁盘
windows:
运行iSCSi发起程序
在目标里填写Target的地址并点击快速连接(需等待一段时间加载驱动)
磁盘管理中查看是否连接成功
实验二:开机自动创建
Target端:
# vim /etc/tgt/targets.conf
<target iqn.2014.12.com.wgmml.target1> //targetname名
backing-store /dev/sdb //target共享的磁盘
initiator-address 10.1.1.2/24 //有访问控制权限的网段
</target>
实例三:iscsi chap身份验证
iscsi除了指定IP做ACL,还可以透过user/password (CHAP-Challenge Handshake Authentication Protocol(使用MD5的加密验证) )来做身分验证。
1. iscsi CHAP验证种类
1.1 单向CHAP验证:在此安全性等级,只有目标Target会做验证
1.2 相互( Mutual ) CHAP验证:在此安全性等级,目标Target与启动器Initiator皆会被彼此做验证.
1.3 Reverse CHAP验证:一般的CHAP使用one-way hash,密码档无法回朔,但是使用Reverse CHAP是可以的
2. iscsi单向CHAP验证
预设iSCSI 采用了单向CHAP(Challenge Handshake Authentication Protocol) 的身分验证方式,基本上是一种以MD5 的加密验证方式.方式如下:
2.1. 在双方(Target/Initiator) 建立连线后,Target 送出"challenge" 的讯息告知Initiator 要做身分验证.
2.2. Initiator 会将使用者密码(md5码加密)给Target 端.
2.3. Target端将密码和Initiator发送的密码做比对,如果比对正确,这身份验证即成立,否则中断此次连结做.
2.4. 在正常连线过程中会不时重复做1~3 的CHAP 身分验证.
3. iscsi单向CHAP配置
3.1. target端配置
3.1.1 创建target并为其分配设备
[root@station9 ~]# tgtadm --lld iscsi --mod target --op new --tid=1 -T iq.example.station9:disk1
[root@station9 ~]# tgtadm --lld iscsi --mod logicalunit --op new --tid 1 --lun 1 -b /dev/sdb1
[root@station9 ~]# tgtadm --lld iscsi --mod target --op bind --tid 1 -I ALL
l 3.1.2 创建CHAP验证帐号(与系统帐号无关)
[root@station9 ~]# tgtadm --lld iscsi --mode account --op new --user RedHat --password redhat123
#创建帐号redhat密码为redhat123,password 和username 的最大限制是256 字元
[root@station9 ~]# tgtadm --lld iscsi --mode account --op bind --tid 1 --user redhat
#将帐号redhat绑定到tid为1的target
[root@station9 ~]# tgtadm --lld iscsi --mode target --op show
3.2. initiator端配置
3.2.1修改iscsi配置文件,添加CHAP验证帐号
[root@station2 ~]# vim /etc/iscsi/nf
node.session.timeo.replacement_timeout = 20 #默认延迟时间120太长,
node.session.auth.authmethod = CHAP #开启CHAP验证
node.session.auth.username = redhat #CHAP帐号,与target中一样
node.session.auth.password = redhat123
3.2.2 链接target
[root@station2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.32.39:3260
192.168.32.39:3260,1 iq.example.station9:disk1
[root@station2 ~]# iscsiadm -m node -T iq.example.station9:disk1 -p 192.168.32.39:3260 -l
Logging in to [iface: default, target: iq.example.station9:disk1, portal: 192.168.32.39,3260]
Login to [iface: default, target: iq.example.station9:disk1, portal: 192.168.32.39,3260]: successful
4. 相互(Mutual)HAP incoming / outgoing验证
相互( Mutual ) CHAP验证: CHAP的认证端可为Target(Incoming Authentication)或是Initiator(Outgoing Authentication)任一端来认证.也就是说Target(Incoming Authentication)是由Target端为Initiator认证.这样的认证方式可以允许多个Initiator来连接到Target.而Initiator(Outgoing Authentication)是由Initiator来认证Target端。
刚刚已经设定过Incoming 的认证方式,现在要透过"tgtadm" 来建立Outgoing 的认证
4.1. target端创建outgong帐号
[root@station9 ~]# tgtadm --lld iscsi --op new --mode account --user out_redhat --password out_redhat123
[root@station9 ~]# tgtadm --lld iscsi --mode account --op bind --tid 1 --user out_redhat –outgoing
[root@station9 ~]# tgtadm --lld iscsi --mode target --op show
4.2. initiator配置
[root@station2 ~]# vim /etc/iscsi/iscsid.conf
node.session.timeo.replacement_timeout = 20
node.session.auth.authmethod = CHAP
node.session.auth.username = redhat
node.session.auth.password = redhat123
node.session.auth.username_in = out_redhat
#initiator端验证帐号,和target设备的outgoing帐号一样
node.session.auth.password_in = out_redhat123