您的位置:首页 > 理论基础 > 计算机网络

iscsi搭建ip存储网络

2013-12-03 18:58 218 查看
偶然看到高俊峰老师讲“iscsi搭建ip存储网络”的视频,闲着没事儿学习了下,视频很长,看着感觉太浪费时间,不过我还是坚持看完了,内容很少。
以下是我从视频中总结的有用的内容,以及自己试验的整个过程。不过我试验用的是centos6的系统,源码包编译的时候遇到了问题,还是小折腾了一会儿,最后让我明白做事还是得注重细节啊!

######操作系统
CentOS release 6.3 (Final)
2.6.32-431.el6.x86_64
######实验机器
服务端 192.168.1.248
客户端 192.168.1.249
######存储类型
SCSI:小型计算机系统接口(Small Computer System Interface)
FC:光纤通道(Fibre Channel)
DAS:直连式存储(Direct-Attached Storage)
NAS:网络接入存储(Network-Attached Storage)
SAN:存储区域网络(Storage Area Network)
iscsi定义:
iSCSI是一种在Internet协议上,特别是以太网上进行数据块传输的标准,它是一种基于IP Storage理论的新型存储技术,该技术是将存储行业广泛应用的SCSI接口技术与IP网络技术相结合,可以在IP网络上构建SAN存储区域网,简单地说,iSCSI就是在IP网络上运行SCSI协议的一种网络存储技术
######iscsi架构类型
控制器架构
采用专用的数据传输芯片、专用的RAID数据校验芯片、专用的高性能cache缓存和专用的嵌入式系统平台,是一个核心全硬件的设备。
优点:具有较高的安全性和和稳定性。
缺点:核心处理器全部采用硬件,制造成本较高,因而售价也很高。
适用环境:可以用于对性能的稳定性和高可用性具有较高要求的在线存储系统,例如:中小型数据库系统、大型数据库备份系统、远程容灾系统等。
######iSCSI连接桥架构
连接桥构架分为另个部分:
前端协议转换设备
后端存储
前端协议转换部分一般是硬件设备,只有协议转换功能,没有RAID校验和快照、卷复制等功能,因此,创建RAID组、创建LUN等操作必须在存储设备上完成。
后端存储一般采用SCSI磁盘阵列和FC存储设备。
随着iscsi技术的日益成熟,连接桥架构的iSCSI设备越来越少
PC架构
也就是将存储设备搭建在PC服务器上,通俗的说就是选择一个性能良好、可支持多块硬盘的PC 服务器,然后选择一款成熟的存储端管理软件(iSCSI Target),并将软件安装在这台PC服务器上,这样就将一个普通的PC服务器变成了一台ISCSI存储设备了。最后通过PC服务器的以太网卡对外提供ISCSI数据传输服务。
客户端主机可以安装iscsi客户端软件(iSCSI initiator)通过以太网连接PC服务器共享出来的存储空间。

######iscsi存储链接方式
以太网卡+initiator软件方式
硬件TOE网卡+initiator软件方式
iSCSI HBA卡连接方式
######ISCSI系统工作原理
基本实现过程:
iSCSI协议定义了在TCP/IP网络发送、接收 block(数据块)级的存储数据的规则和方法:
发送端将SCSI命令和数据封装到TCP/IP包中再通过网络转发,接收端收到 TCP/IP包之后,将其还原为SCSI命令和数据并执行,完成之后将返回的SCSI命令和数据再封装到TCP/IP包中再传送回发送端。
整个过程在用户看来: 使用远端的存储设备就象访问本地的 SCSI设备一样简单。

######target安装
下载iscsitarget-1.4.20.2.tar.gz包源码安装
[root@fone-server-2 tmp]# tar -zxvf iscsitarget-1.4.20.2.tar.gz
[root@fone-server-2 tmp]# cd iscsitarget-1.4.20.2
[root@fone-server-2 iscsitarget-1.4.20.2]# make
make后出错
cc: /lib/modules/2.6.32-279.el6.x86_64/build/include/linux/version.h:没有那个文件或目录
cc: 没有输入文件
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -lt: unary operator expected
make -C usr
make[1]: Entering directory `/tmp/iscsitarget-1.4.20.2/usr'
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o ietd.o ietd.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o iscsid.o iscsid.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o conn.o conn.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o session.o session.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o target.o target.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o message.o message.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o ctldev.o ctldev.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o log.o log.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o chap.o chap.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o event.o event.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o param.o param.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o plain.o plain.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o isns.o isns.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o md5.o md5.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o sha1.o sha1.c
cc ietd.o iscsid.o conn.o session.o target.o message.o ctldev.o log.o chap.o event.o param.o plain.o isns.o md5.o sha1.o -o ietd
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE -c -o ietadm.o ietadm.c
cc ietadm.o param.o -o ietadm
make[1]: Leaving directory `/tmp/iscsitarget-1.4.20.2/usr'
make -C /lib/modules/2.6.32-279.el6.x86_64/build SUBDIRS=/tmp/iscsitarget-1.4.20.2/kernel modules
make: *** /lib/modules/2.6.32-279.el6.x86_64/build: 没有那个文件或目录。 停止。
make: *** [kernel] 错误 2
解决办法:
安装如下包
yum -y install likernel-headers kernel* make gcc gcc-c++ flex patch
如果还不行的话reboot一下 注:安装kernel须重新启动
(编译这块搞了半天,其实上边的安装包我也装了就差一个重启,不重启添加的kernel相关的没生效)
######target配置
[root@fone-server-2 iet]# pwd
/etc/iet
[root@fone-server-2 iet]# vim ietd.conf
修改两行配置
35 Target iqn.2013-12.com.fone:sdb
52 Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz
如果是再共享一个磁盘需要将上边的两行都复制然后修改(要成对的)
######iscsi客户端安装(linux平台)
yum -y install iscsi-initiator*
安装完成后会生成/etc/iscsi/目录
[root@fone-server-3 ~]# cd /etc/iscsi/
有两个配置文件可以进行一定的设置
[root@fone-server-3 iscsi]# ls
initiatorname.iscsi iscsid.conf
启动iscsi服务
默认centos6.2iscsi服务启动了
iscsi target发现:
[root@fone-server-3 iscsi]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248 (这个ip是存储段的地址)
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb
Discovery (/var/lib/iscsi/send_targets):在/var/lib/iscsi/send_targets目录下,生成一个target服务器信息文件,文件名为“target服务的IP,端口号”(例如“192.168.1.248,3260”)。此文件用来记录target服务器信息。
Node (/var/lib/iscsi/nodes):在/var/lib/iscsi/nodes目录下,生成一个或多个以target存储服务器上的Target名命名的文件夹,每文件夹下有一个用来记录target服务器上特定Target信息的文件。
通过iscsiadm指令与iscsi Target建立关联
iscsiadm -m node -T iqn.2013-12.com.fone:sdb -p 192.168.1.248 -l
这里的“-T”后面跟target名称,“ip-address”是target主机的IP地址,-p指定ip地址 ,“port”是target主机的端口号,默认是3260
卸载
iscsiadm -m node -T iqn.2013-12.com.fone:sdb -p 192.168.1.248 -u
如果服务端新增加了一个共享磁盘,在客户端刷新信息
iscsiadm -m session -R
######iscsi在安全方面的设定
再在服务端共享一块磁盘
编辑配置文件
vim ietd.conf
接着前面的修改添加如下内容
Target iqn.2013-12.com.fone:sda
Lun 0 Path=/dev/sda,Type=fileio,ScsiId=xyz,ScsiSN=xyz
保存退出后重启服务
[root@fone-server-2 iet]# /etc/init.d/iscsi-target restart
Stopping iSCSI Target: [确定]
Starting iSCSI Target: [确定]
在客户端查看
[root@fone-server-3 /]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sda
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb
这样会有个问题,每当共享一块磁盘所有客户端都可以看到共享,这样就产生了混乱,不易于管理控制。
为了防止这种情况一共有两种方法:
###initiator主机以ip认证的方式获取iscsi target资源
修改[root@fone-server-2 iet]# vim initiators.allow
#ALL ALL (将此行注释,添加如下两行)
iqn.2013-12.com.fone:sdb 192.168.4.249
iqn.2013-12.com.fone:sda 192.168.4.232
设置sdb只共享给249,sda只共享给232
修改完成后要重启target
(如果一块磁盘需要给多个机器共享那么直接在后边加ip,要用逗号分隔)
[root@fone-server-2 iet]# /etc/init.d/iscsi-target restart
Stopping iSCSI Target: [确定]
Starting iSCSI Target: [确定]
现在验证配置是否好用
[root@fone-server-3 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb
[root@hadoop-slave232 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sda
232这个机器是我安装了initiator的一个机器
可见现在跟我们在服务端修改的限制一样,每个系统只能发现指定的共享磁盘
###密码认证获取iSCSI Target资源
target段设置
修改 vim initiators.allow
ALL ALL
#iqn.2013-12.com.fone:sdb 192.168.1.249
#iqn.2013-12.com.fone:sda 192.168.1.232
还原成没有做ip认证的样子
接着修改/etc/iet/ietd.conf文件,修改后的内容如下:
IncomingUser discovery.auth discoverysecret
第一个“IncomingUser”是个全局参数,用来指定Discovery查询认证所使用的账号和密码,必须与initiator主机中设定的用户名密码一致。
如下格式:
共享给linux
Target iqn.2013-12.com.fone:sdb
IncomingUser login.linux.auth linuxsecret
Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz
如果是共享给windows如下
Target iqn.2013-12.com.fone:sdc
IncomingUser login.linux.auth windowssecret
Lun 0 Path=/dev/sdc,Type=fileio,ScsiId=xyz,ScsiSN=xyz
Initiator主机以密码认证获取iSCSI Target资源
修改/etc/iscsi/iscsid.conf文件,添加如下选项:
#以下三个是针对login的
node.session.auth.authmethod = CHAP #表示在login时启用CHAP验证。
node.session.auth.username = login.linux.auth #验证用户名称,可以是任意字符,但必须与target端IncomingUse配置的名字一致。
node.session.auth.password = linuxsecret #验证密码,必须与target端对应的IncomingUse选项设置的密码一致。
#以下三个是针对discovery的
discovery.sendtargets.auth.authmethod = CHAP #表示discovery时启用CHAP验证。
discovery.sendtargets.auth.username = discovery.auth #验证用户名称,可以是任意字符,但必须与target端IncomingUse配置的名称一致。
discovery.sendtargets.auth.password = discoverysecret #验证密码,必须与target端对应的IncomingUse选项设置的密码一致。
修改完成后要重启initiator
此时可以重新发现测试!

本文出自 “学无止境” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: