一,ISCSI简介
iSCSI,即internet SCSI,又称为IP-SAN,是IETF制订的一项标准,用于将SCSI数据块映射成以太网数据包。iSCSI是一种基于TCP/IP 的协议,用来建立和管理IP存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。SAN 使得SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。SCSI 结构基于C/S模式,其通常应用环境是:设备互相靠近,并且这些设备由SCSI 总线连接。
iSCSI 的主要功能是在TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器 target)之间进行大量数据的封装和可靠传输过程。
从根本上说,iSCSI协议是一种跨过IP网络来传输潜伏时间短的SCSI数据块的方法。
完整的iSCSI系统的拓扑结构如下:
与传统的SCSI技术比较起来,iSCSI技术有以下三个革命性的变化:
<code> 把原来只用于本机的SCSI协同透过TCP/IP网络传送,使连接距离可作无限的地域延伸; 连接的服务器数量无限(原来的SCSI-3的上限是15); 由于是服务器架构,因此也可以实现在线扩容以至动态部署。 </code>
ISCSI的协议结构:
二,搭建基于 IP SAN 的 ISCSI 存储系统
<code> 规划: 环境: CentOS 6.6 32位 服务器端 IP: 192.168.1.43 客户端 IP : 192.168.1.111 共享磁盘: /dev/sdb </code>
1,配置服务器端
<code> [root@localhost ~]# yum -y install scsi-target-utils #安装服务器端软件 [root@node1 iscsi]# rpm -ql scsi-target-utils /etc/rc.d/init.d/tgtd /etc/sysconfig/tgtd /etc/tgt/targets.conf #配置文件 /usr/sbin/tgt-admin /usr/sbin/tgt-setup-lun /usr/sbin/tgtadm /usr/sbin/tgtd /usr/sbin/tgtimg /usr/share/doc/scsi-target-utils-1.0.24 /usr/share/doc/scsi-target-utils-1.0.24/README /usr/share/doc/scsi-target-utils-1.0.24/README.iscsi /usr/share/doc/scsi-target-utils-1.0.24/README.iser /usr/share/doc/scsi-target-utils-1.0.24/README.lu_configuration /usr/share/doc/scsi-target-utils-1.0.24/README.mmc /usr/share/man/man5/targets.conf.5.gz /usr/share/man/man8/tgt-admin.8.gz /usr/share/man/man8/tgt-setup-lun.8.gz /usr/share/man/man8/tgtadm.8.gz [root@localhost ~]# lsmod |grep scsi mptscsih 31330 1 mptspi mptbase 86744 2 mptspi,mptscsih scsi_transport_spi 19726 1 mptspi #高级驱动程序 </code>
iscsi可以使用命令或配置文件进行配置,我们首先使用命令行来进行配置:
<code> [root@node1 iscsi]# service tgtd start Starting SCSI target daemon: [ OK ] [root@node1 iscsi]# ss -tlnp |grep 3260 #其监听在3260端口 LISTEN 0 128 :::3260 :::* users:(("tgtd",11882,5),("tgtd",11885,5)) LISTEN 0 128 *:3260 *:* users:(("tgtd",11882,4),("tgtd",11885,4)) [root@localhost ~]# tgtadm -L iscsi -o new -m target -t 1 -T iqn.2015-08.com.feiyu.testsan:1 #创建一个target,-t指定TID,-T指定名称 </code>
iqn表示“ISCSI Qualified Name”,简称iqn。
<code> [root@localhost ~]# tgtadm -L iscsi -o show -m target Target 1: iqn.2015-08.com.feiyu.testsan:1 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 Backing store type: null Backing store path: None Backing store flags: Account information: ACL information: </code>
然后设定LUN(Logical Unit Number,逻辑单元号),服务器端只需要创建好分区,不需要格式化:
<code> [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/sdb5 #创建一个LUN,-m表示模式,-l :LUN ,-b: 设备 [root@localhost ~]# tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.0.0/16 [root@node1 iscsi]# tgtadm -L iscsi -o show -m target Target 1: iqn.2015-08.com.feiyu.testsan:1 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 Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 2107 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /dev/sdb5 Backing store flags: Account information: ACL information: [root@node1 iscsi]# tgtadm -L iscsi -o bind -m target -t 1 -I 192.168.0.0/16 #设定共享区 [root@node1 iscsi]# tgtadm -L iscsi -o show -m target Target 1: iqn.2015-08.com.feiyu.testsan:1 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 Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 2107 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /dev/sda5 Backing store flags: Account information: ACL information: 192.168.0.0/16 [root@localhost ~]# tgtadm -L iscsi -o new -m logicalunit -t 1 -l 2 -b /dev/sdb6 #绑定第二个LUN </code>
2,配置客户端
<code> [root@node1 ~]# yum install -y iscsi-initiator-utils #安装客户端 [root@node1 iscsi]# echo "InitiatorName=`iscsi-iname -p iqn.2013-05.com.feiyu`" > /etc/iscsi/initiatorname.iscsi #生成iqn [root@node1 iscsi]# echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi #定义别名 [root@node1 iscsi]# ls initiatorname.iscsi iscsid.conf [root@node1 iscsi]# cat initiatorname.iscsi #查看所定义的数据 InitiatorName=iqn.2015-08.com.feiyu:10834bd52221 InitiatorAlias=initiator1 [root@node1 ~]# service iscsi start #启动服务,需要启动两个服务 [root@node1 ~]# service iscsid start [root@node1 ~]# chkconfig iscsi on [root@node1 ~]# chkconfig iscsid on </code>
若出现以下错误,可能由于服务器端的防火墙没有关!
<code> [root@node1 ~]# iscsiadm -m discovery -t st -p 192.168.1.43 Starting iscsid: [ OK ] iscsiadm: cannot make connection to 192.168.1.43: No route to host [root@node1 ~]# iscsiadm -m discovery -t st -p 192.168.1.43 #进行探测 192.168.1.43:3260,1 iqn.2015-08.com.feiyu.testsan:1 [root@node1 ~]# iscsiadm -m node -T iqn.2015-08.com.feiyu.testsan:1 -p 192.168.1.43 -l #登录节点 Logging in to [iface: default, target: iqn.2015-08.com.feiyu.testsan:1, portal: 192.168.1.43,3260] (multiple) Login to [iface: default, target: iqn.2015-08.com.feiyu.testsan:1, portal: 192.168.1.43,3260] successful. [root@node1 ~]# fdisk -l #登录成功可以看到多了一块硬盘, Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0006d052 Device Boot Start End Blocks Id System /dev/sda1 * 1 39 307200 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 39 2354 18598912 83 Linux /dev/sda3 2354 2610 2057689 5 Extended /dev/sda5 2354 2610 2057657+ 83 Linux Disk /dev/sdc: 10.7 GB, 10742183424 bytes -------> iscsi设备 64 heads, 32 sectors/track, 10244 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 </code>
为磁盘创建分区并格式化。
<code> [root@node1 ~]# mke2fs -t ext4 /dev/sdc1 </code>
若使用两个客户端,不要同时挂载同一个文件系统,它是单机的,不支持同时使用。可以将其分为多个分区,不同客户端挂载不同分区。
<code> [root@node1 mnt]# iscsiadm -m node -T iqn.2015-08.com.feiyu.testsan:1 -p 192.168.1.43 -u #登出 Logging out of session [sid: 1, target: iqn.2015-08.com.feiyu.testsan:1, portal: 192.168.1.43,3260] Logout of [sid: 1, target: iqn.2015-08.com.feiyu.testsan:1, portal: 192.168.1.43,3260] successful. [root@node1 mnt]# ls /var/lib/iscsi/ #此文件夹下存放所有信息 ifaces isns nodes send_targets slp static [root@node1 ~]# iscsiadm -m node -T iqn.2015-08.com.feiyu.testsan:2 -p 192.168.1.43 -o delete #删除探测到的信息 </code>
3,服务器端从配置文件中设定,在文件中设置比较简单
<code> [root@localhost ~]# tgtadm -L iscsi -o unbind -m target -t 1 -I 192.168.0.0/16 #解除绑定 [root@localhost ~]# tgtadm -L iscsi -o show -m target #查看iscsi信息 [root@localhost ~]# tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 2 #将target1上的LUN2 delete掉 [root@localhost ~]# tgtadm -L iscsi -o delete -m target -t 1 #删除target [root@localhost tgt]# vim targets.conf #添加以下配置 <target iqn.2015-08.com.feiyu.testsan:2> backing-store /dev/sdb4 </target> [root@localhost tgt]# service tgtd restart Stopping SCSI target daemon: [ OK ] Starting SCSI target daemon: [ OK ] [root@localhost tgt]# tgtadm -L iscsi -o show -m target Target 1: iqn.2015-08.com.feiyu.testsan:2 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 Backing store type: null Backing store path: None Backing store flags: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 0 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /dev/sdb4 Backing store flags: Account information: ACL information: ALL [root@localhost tgt]# vim targets.conf #设置访问控制权限 <target iqn.2015-08.com.feiyu.testsan:2> backing-store /dev/sdb4 initiator-address 192.168.0.0/16 </target> [root@localhost tgt]# service tgtd restart [root@localhost ~]# tgtadm -L iscsi -o show -m target #查看iscsi信息 </code>
说明:
1,服务端配置管理工具tgtadm的使用:
<code> tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]... </code>
(1)、添加一个新的 target 且其ID为 [id], 名字为 [name]:
<code> --lld [driver] --op new --mode target --tid=[id] --targetname [name] </code>
(2)、显示所有或某个特定的target:
<code> --lld [driver] --op show --mode target [--tid=[id]] </code>
(3)、向某ID为[id]的设备上添加一个新的LUN,其号码为[lun],且此设备提供给initiator使用。[path]是某“块设备”的路径,此块设备也可以是raid或lvm设备。lun0已经被系统预留:
<code> --lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path] </code>
(4)、删除ID为[id]的target:
<code> --lld [driver] --op delete --mode target --tid=[id] </code>
(5)、删除target [id]中的LUN [lun]:
<code> -lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun] </code>
(6)、定义某target的基于主机的访问控制列表,其中,[address]表示允许访问此target的initiator客户端的列表:
<code> --lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address] </code>
(7)、解除target [id]的访问控制列表中[address]的访问控制权限:
<code> --lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address] </code>
例如:
(1)创建一个target:
<code> # tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2013-05.com.magedu:tsan.disk1 </code>
(2)显示所有:
<code> # tgtadm --lld iscsi --op show --mode target </code>
(3)显示刚创建的target:
<code> # tgtadm --lld iscsi --op show --mode target --tid 1 </code>
(4)创建LUN,号码为1:
<code> # tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5 </code>
(5)开放给192.168.0.0/24网络中的主机访问:
<code> # tgtadm --lld iscsi --op bind --mode target --tid 1 -I 172.16.0.0/16 </code>
其中的-I相当于–initiator-address
2、iscsiadm工具的使用:
iscsiadm是个模式化的工具,其模式可通过-m或–mode选项指定,常见的模式有discovery、node、fw、session、host、iface几个,如果没有额外指定其它选项,则discovery和node会显示其相关的所有记录;session用于显示所有的活动会话和连接,fw显示所有的启动固件值,host显示所有的iSCSI主机,iface显示/var/lib/iscsi/ifaces目录中的所有ifaces设定。
<code> iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ] iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T tar-getname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ] -d, --debug=debug_level 显示debug信息,级别为0-8; -l, --login -t, --type=type 这里可以使用的类型为sendtargets(可简写为st)、slp、fw和 isns,此选项仅用于discovery模式,且目前仅支持st、fw和isns;其中st表示允许每个iSCSI target发送一个可用target列表给initiator; -p, --portal=ip[:port] 指定target服务的IP和端口; -m, --mode op 可用的mode有discovery, node, fw, host iface 和 session -T, --targetname=targetname 用于指定target的名字 -u, --logout -o, --op=OPEARTION:指定针对discoverydb数据库的操作,其仅能为new、delete、update、show和nonpersistent其中之一; -I, --interface=[iface]:指定执行操作的iSCSI接口,这些接口定义在/var/lib/iscsi/ifaces中; </code>
例:
<code> # iscsiadm -m discovery -t sendtargets -p 192.168.0.11 # iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -l # iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -u # iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -o delete </code>
查看会话相关信息:
<code> # iscsiadm -m session -s </code>