分类: LINUX
2009-05-21 19:36:46
储存区域网路(SAN)
谈到iSCSI就会先谈到储存区域网路(Storage Area Network, 简称 SAN),这是个专门用来传输磁碟资料的网路,以别于一般 TCP/IP 网路,通常预设 SAN 是使用光纤(FC,Fibre Channel)设备,不同的是 iSCSI 预设使用 Gigabit Ethernet(双交线)来作传输媒介,所以iSCSI 价格上比 Fibre Channel 低廉许多,所以这使得 iSCSI让许多中小企业能够以较低门槛就可以实现SAN的应用。
注:能够实现SAN应用有Fibre Channel,iSCSI与AoE 等等,其中以 Fibre Channel 价格最高、效能最优,而 iSCSI 是 Fibre Channel 之外较知名储存通讯协定,AoE 则是紧追在 iSCSI 的后起之秀,其实我也没有用过.
进阶学习:iSCSI 其实它也能够使用光纤来当传输媒介,但是通常为了节省费用而使用铜线。
iSCSI 介绍
iSCSI(Internet SCSI):一种主要应用在储存区域网路(SAN)通讯协定,iSCSI 将 SCSI 命令运行在 TCP/IP 网路上,用以传输磁碟资料。iSCSI 在 OSI 七层模型中属于传输层(Transport Layer)的通讯协定,提供给 iSCSI Target 与 iSCSI Initiator 之间沟通。
经由 iSCSI 技术,我们能够提供 Block-Level I/O 给 Initiator 主机,其目的不外乎是“将硬盘的排线网路化”、“把这台主机(Target 主机)幻化成另一台主机(Initiator 主机)的磁碟”以达成更大空间、更高 I/O 速度及具有冗余与高延展度的应用,类似 iSCSI 技术还有 Fibre Channel、AoE(ATA Over Ethernet)。
进阶学习:搭配 SAN 架构所应用之高阶技术之一为丛集档案系统(Cluster File System),RedHat 推广 GFS(Global FS)、SuSE 推广 OCFS2(Oracle Cluster FS)都是实际案例。
下面就SAN 中通常有两个角色“Target(服务端)”与“Initiator(客户端)”分别叙述如下:
Target_“储存设备”(Storage Device)
称为 Target 的通常是“储存设备”(Storage Device),也就是存放资料的硬盘(以硬盘阵列居多),在我们使用iSCSI时,会在 iSCSI 储存设备上去建立 LUN(Logical Unit Number)来提供给有 iSCSI Initiator 功能的主机来存取 iSCSI 储存设备。所以通俗一点讲,他就是服务端.
温馨提示:LUN 好比是个“逻辑单位磁碟”,为追求效率、冗余与延展性,这个 LUN 通常会是由数个实体磁碟(在搭配 RAID 或 LVM 技术后)所组成。
这次用来当作 iSCSI Target 主机是Centos5主机,因为Centos5本身是没有iSCSI Target的,其实别的发行版本也没有,所以我们只好手动编译iSCSI Enterprise Target.
编译 iSCSI Enterprise Target 软体
iscsitarget下载地址
http//iscsitarget.sourceforge.net/
最新的是 0.4.15 版
注意:安装要2.6.14以上内核
第一步:解压,然后进入目录
#tar -zxf iscsitarget-0.4.15.tar.gz”
#cd iscsitarget-0.4.15
#yum -y install gcc gcc-c++ kernel-devel
编译前,最好安装好上面这些包
第二步:编译程式
#make
#make install
第三步:加入到系统服务,设置开机预设启动 iscsi-target
#chkconfig --add iscsi-target
#chkconfig iscsi-target on
#/etc/init.d/iscsi-target start
注:iSCSI Target 端主机预设使用 tcp 的 3260 端口来服务,所以防火墙记的开.
#iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3260 -j ACCEPT
查看服务是否启动
# ps -C ietd
PID TTY TIME CMD
2691 ? 00:00:00 ietd
第四步:iSCSI Enterprise Target Daemon 设定档
iSCSI Enterprise Target Daemon 名称 ietd 使用 /etc/ietd.conf 当作设定档,您可以在原码目录(iscsitarget-0.4.15)内的 etc 目录下找到设定范本,范本内大多是“#”字号开头的注解,有需要用到这些设定时再将注解拿掉设定调整即可。不过,可以直接使用命令来建。不过重起后就没有了.
# ietadm --op new --tid=100 --params Name=iqn.2008-02.com.php-oa.iscsi:test
# ietadm --op new --tid=100 --lun=0 --params Path=/dev/VolGroup00/test
上面这一行中的“Target iqn.2008-02.com.php-oa:iscsi:test”这是 Target 名称,称作‘iSCSI Qualified Name'(简称:iqn),这格式在 iSCSI 规格书中有详细说明
iqn.yyyy-mm.
格式 意义 范例
yyyy-mm 年份-月份 2001-04
reversed domain name 倒过来的网域名称 com.php-oa
identifier 识别代号 iscsi:test
LUN(Logical Unit Number),“#Lun 0 Path=/dev/sdc,Type=fileio”这一行中, Path 改成您提供的硬盘名称,此例为“Path=/dev/VolGroup00/test”。
我们可以使用像是区块装置(Block devices,例 /dev/sdc)、一般档案(regular files)、LVM 逻辑卷轴(Logical Volume)与磁碟阵列(RAID)提供给 Initiators 主机当做‘区块装置’(硬盘).
当然.将范本设定档拷贝一份到 /etc 再来设定 /etc/ietd.conf 是个不错的选择。要重起后启用,记的编辑。你不可能重起后就不要了吧.
下面是我的ietd.conf的配置
Target iqn.2008-02.com.php-oa:storage.test
Lun 0 Path=/dev/sdb,Type=fileio
Alias Test
检查启动后的iscsi
#cat /proc/net/iet/volume
tid:1 name:iqn.2008-02.com.php-oa:storage.test
lun:0 state:0 iotype:fileio iomode:wt path:/dev/sdb
FQA:
1.make[1]: cc: Command not found错误
代表着这台linux 编译相关的程式(尤其是gcc)还没安装,Linux 称这类软体为开发工具(Develop Tool),只要把‘gcc'相关这一类的开发工具都安装即可。
可以使用下面的方法安装
#yum -y install gcc gcc-c++ kernel-devel openssl-devel
2.错误讯息“chap.c:20:25: error: openssl/sha.h: No such file or directory chap.c:21:25: error: openssl/md5.h: No such file or directory”
这个是因为openssl-devel'套件尚未安装所造成。
#yum openssl-devel krb5-devel zlib-devel e2fsprogs-devel
3.错误讯息“make: *** /lib/modules/2.6.18-53.1.13.el5/build: No such file or directory. Stop.
#yum install kernel-devel
Centos和RHEL对iSCSI Initiator 支持非常不错,但由于iSCSI、Linux 通常都是搭配应用在中、大型系统环境下,所以我们买的 iSCSI 硬体厂商都会提供驱动程式给 Linux 使用,尤以 RedHat、SuSE 这些 Linux 知名厂商支持度最高,直到最近 2007 年左右,现在 Linux 都渐渐已经内建 iSCSI Initiator 相关软体,来介绍如何在 Linux 实做 iSCSI Initiator。
Initiator 主要功能是提供电脑主机连线到 Target 作磁碟存取。这个 Initiator 可使用硬件方式 Initiator 或者软件方式 Initiator,我们下面的Initiator,基本都是使用软件方式 Target 与 Initiator。“软件”或“硬件”的 iSCSI Target 与 iSCSI Initiator 就好比 RAID 有“SoftRAID”与“Hardware RAID”。
第一步安装 iSCSI Initiator for Linux
在 Centos 5 软体内就有 iSCSI Initiator .
#yum -y install iscsi-initiator-utils
第二步:使用 iscsiadm 指令管理连线
#service iscsi start
#iscsiadm -m discovery --type sendtargets --portal 192.168.0.1
iSCSI Target 主机查找 Target Record 信息,其中 192.168.0.1 为 Target 主机 IP 或 DNS 名称。找到后会提示你发现...
#service iscsi restart
现在就可以在你的电脑中见到新的设备了./dev/sdb...之类,我们可以对他来象本地一样操作
接下来在 Linux分区、格式化与挂载就可以用了.
分区
#fdisk /dev/sdbX
#mkfs -j(ext3 格式)
#mkreiserfs(ReiserFS 格式)
#mount /dev/sdbX /
下次开机自动取得 iSCSI Target 磁碟
只要 iSCSI Initiator 主机曾经 sendtargets 过并且 login 相关 record,只要在 Initiator 主机使用指令“chkconfig iscsi on”设定下次开机自动启动 iSCSI Initiator Daemon,就可以办到‘下次开机自动取得 iSCSI Target 磁碟’功能。
#chkconfig iscsi on
有关iSCSI的其它
iSCSI 在安全方面相关设定,iSCSI 在安全管理方面有着不错优势,可以使用"主机"和"使用者"来完成允许或拒绝存取的设定。
1.iSCSI Target 实战以 IP 为基础的允许或拒绝 Initiator 主机
iSCSI Enterprise Target 软体本身有内建类似 TCP Wrapper(/etc/hosts.allow、/etc/hosts.deny)的 /etc/initiators.allow、/etc/initiators.deny,接下来示范设定这两个档案来限制 Initiator 主机存取。
设定 /etc/initiators.allow、/etc/initiators.deny这二个文件就可以控制主机了.安装完会默认生成
底下列出例子为“只允许 172.16.7.120 这台 Initiator”并“拒绝全部”设定
/etc/initiators.allow 内容,最后一行允许 172.16.7.120(其他三行被#注解)
# Some exmaples
#iqn.2001-04.com.example:storage.disk1.sys1.xyz 192.168.22.2, 192.168.3.8
#iqn.2001-04.com.example:storage.disk1.sys4.xyz [3ffe:302:11:1:211:43ff:fe31:5ae2], [3ffe:505:2:1::]/64
iqn.2001-04.com.example:storage.disk2.sys1.xyz 172.16.7.120
/etc/initiators.deny 内容,最后一行拒绝全部(其他四行被#注解)
# Some exmaples
#iqn.2001-04.com.example:storage.disk1.sys1.xyz ALL
#iqn.2001-04.com.example:storage.disk1.sys2.xyz 192.168.12.2, 192.168.3.0/24, 192.167.1.16/28
#iqn.2001-04.com.example:storage.disk1.sys4.xyz [3ffe:302:11:1:211:43ff:fe31:5ae2], [3ffe:505:2:1::]/64
iqn.2001-04.com.example:storage.disk2.sys1.xyz ALL
注意到 iqn 需与 /etc/ietd.conf 内的 iqn 相同。
2.iSCSI Target 使用者帐号密码为基础的允许或拒绝 Initiator 主机
iSCSI Target 使用帐号密码方式认证分成两阶段:
第一阶段是 Discovery 时认证所使用的帐号密码(SendTargets 用的)。
第二阶段是登入各别 Target / iqn / Lun 时所使用的帐号密码(Login 用的)。
一个 iSCSI Enterprise Target 能够在 /etc/ietd.conf 设定多个 Target 区段,分享多个 iqn / Lun 并且可以为每个 Target / iqn / Lun 设定存取的帐号密码。
由下图的上半个视窗可以看到在 Target 主机于 /etc/ietd.conf 设定两个 Target / iqn / Lun,而下半个视窗可看到 Initiator 主机使用 iscsiadm 指令发现两个 Target。
/etc/ietd.conf Initiator 主机设定
Discovery 时使用的帐号密码
(SendTargets 用的) IncomingUser joe secret
(独立于 Target 区段外) discovery.sendtargets.auth.username = joe
discovery.sendtargets.auth.password = secret
连接 Target / iqn / Lun 时使用的帐号密码
(Login 用的) IncomingUser joe2 secret2
(置于 Target 区段内) node.session.auth.username = joe2
node.session.auth.password = secret2
Note:joe、secret、joe2 与 secret2 都是测试用的帐号密码。
只要有改到 /etc/ietd.conf、/etc/iscsid.conf 别忘了各别需要使用 InitScripts(/etc/init.d/iscsi-target、/etc/init.d/iscsi)重新启动相关 Daemon(ietd、iscsid)。
SAN 架构与其相关技术应用非常广,比如我们可以配合集群(Cluster)与丛集群案系统(Cluster File System)的高级应用,像是 RedHat GFS 或是 Oracle OCFS2 档案系统,提供分享(Shared)Block Level I/O 给多台主机。
注意:若未使用及设定 Cluster File System 但却使用两个 Initiator 同时存取同一个 Target Device 会导致资料毁损,请小心!