Linux上搭建软件iSCSI存储设备
ISCSI这个概念炒作了很多年了,直到前些天用到了iSCSI设备,才有了个全面了解
进而发现,用服务器安装Linux可以充当iSCSI的存储设备
linux还真是伟大啊,什么角色都可以做
此外,共享的文件系统,借助于iSCSI,可以变成本地磁盘来使用了
很多特性终于可以在远程存储上使用了
好几个月没写长篇技术文章了,终于又鼓捣出来一篇的说
本文全文为PDF格式,转载请注明出处。
http://www.swsoft.com.cn/downloads/Prima/Docs/iSCSI_HOWTO.pdf
---------------------------------
目 录
基于Linux后端的iSCSI配置与使用
一、 iSCSI简介
1. NAS
2. SAN
3. iSCSI架构
二、 配置Linux存储服务器为iSCSI-target
1. iscsi-target-enterprise安装
2. 配置与启动
三、 配置Windows为iSCSI-initiator
1. 微软iSCSI-initiator安装
2. 配置与启动
四、 配置Linux为iSCSI-inititor
1. 安装
2. 配置与启动
五、 总结
一、 iSCSI简介
提到iSCSI,这里需要首先介绍一下目前应用最为广泛的两种数据存储设备:NAS与SAN。
1. NAS
NAS的全称是Network-attached storage,即网络连接存储设备。NAS设备通常是一个完整的服务器架构,包含了CPU、内存、网卡、磁盘,其上安装通用操作系统或者精简的专用操作系统,并通过扩展接口连接了大量存储阵列。NAS的访问形式是通过TCP/IP网络进行远程访问,NAS自身的操作系统上运行着相应的网络服务程序,比如Windows文件共享服务、Linux Samba文件共享服务、Linux/Unix的NFS文件系统等。需要访问NAS的设备,通过TCP/IP网络,在远程使用客户端软件来访问。Windows文件共享是操作系统自身已经包含,Linux则需要安装Samba客户端或者NFS客户端来访问NAS设备。
NAS主要用途是大容量存储,并带有一定的冗余功能,侧重点在于容量和相对较低的实施成本,对于吞吐量、并发数、冗余性能等通常要求不高。此外,由于NAS的访问形式是文件共享式的访问,操作系统只能将NAS设备挂载成一个网络共享设备,而一些操作系统原生特性是无法在网络共享文件系统上实现的,例如磁盘配额、格式化磁盘、组件磁盘阵列等都不能在远程上实现,这也给NAS的应用造成了一定的局限性。
如图,在远程的Windows系统中挂载NAS提供的网络驱动器。
如图,在远程Windows服务器上,NAS被作为网络驱动器被映射后,通过磁盘管理器功能是无法获知NAS的任何信息的。对NAS系统的底层操作如磁盘配额、组建阵列、格式化等都需要在NAS服务器本地来实施,不能在远程访问的客户端上进行。
2. SAN
SAN的全称是Storage Area Network 。对比于NAS,SAN存储更像是一个外置磁盘阵列,SAN设备本身通常只包含阵列、控制器、接口卡,不包含CPU、内存、通用操作系统。SAN通过标准外置SCSI接口或者光纤SCSI接口连接到服务器上。因此,使用SAN的时候,相应的服务器必须带有外置SCSI、光纤接口等扩展卡。连接到SAN以后,在操作系统上,可以将SAN提供的磁盘阵列直接读取为本地磁盘驱动器,,操作系统不关心这些硬盘是安装在服务器内部的,还是装载SAN设备内的。
SAN的侧重点在于高性能、高可靠性,SAN通常容量不是很大,但是提供了光纤、SCSI接口用于同时连接到多个服务器上,SAN所提供的阵列带有RAID5以上的高级冗余功能,确保当部分磁盘故障时,系统性能下降的幅度尽可能的小。SAN的缺点是实施成本比较高,如果采用外置SCSI接口,则需要速度匹配的高性能SCSI接口卡。如果采用光纤接口,还需要光纤交换机等设备。
在客户端上使用SAN设备,无论其接口形式是何种,就像使用本地磁盘一样,从磁盘管理器中可以完全看到服务器挂载的SAN设备。如下图,磁盘1和磁盘2分别映射为分区“P”及分区“O” ,即是远程的SAN存储设备。
NAS与SAN的特性简单对比如下表:
3. iSCSI架构
从上文的介绍可以看出,NAS和SAN分别有着不同的侧重点。SAN虽然有着很好的性能,但是受限于外置SCSI、光纤通道等连接设备,部署成本较高,且外置SCSI铜缆受到线缆长度的限制,不能远距离部署使用。为了改善SAN的这一缺点,iSCSI协议和规范在2003年被正式确定下来。
ISCSI的全称是IP-based SCSI,通过TCP/IP和Internet来传输SCSI的数据包,即基于以太网接口的外置SCSI存储设备。ISCSI分成服务器端和客户端,服务器端叫做iSCSI-target,在实际应用中就是支持iSCSI协议的SAN设备;客户端叫做iSCSI-initiator,在实际应用中就是要访问SAN的服务器。在服务器端和客户端中间,数据的传输通道借助于TCP/IP协议完成,服务器端和客户端都有自己的IP地址,数据传输可通过交换机、路由器进行中继,进而达到在很远的距离上,各种客户端设备依然可以连接到SAN并进行工作。
在基于外置SCSI铜缆和光纤SCSI通道的SAN上,SAN连接到的服务器是不需要进行任何特殊配置的,操作系统会将连接上来的SCSI设备视为一个物理磁盘设备。而iSCSI是通过以太网接口连接的,标准的操作系统仅仅将SAN视为一个网络节点,可以通过TCP/IP访问,但不能将其作为物理磁盘设备来使用。这就是为什么需要iSCSI-initiator客户端软件的原因。
如图,iSCSI的结构是部署方式:
为了进一步降低部署成本,可以在Windows服务器上和Linux服务器上安装iSCSI-target服务器端软件,让现有的服务器变成支持iSCSI协议的SAN存储设备。
本文主要讲述的就是如何在一台Linux服务器上安装iSCSI-target服务器端,并分别在
二、 Windows、Linux上安装iSCSI-initiator客户端访问SAN。
1. iscsi-target-enterprise安装
ISCSI的安装有多种,可以通过源代码编译安装,也可以直接使用现有的rpm二进制包来完成。首先上传相应的安装包到服务器上,包括iscsi-target的主包和一个内核模块的包。注意,请无比确认上传的版本和当前内核的相匹配。
[root@raid ~/iscsi-target]# ls
iscsitarget-0.4.12-4_EL.i386.rpm iscsitarget-kernel-0.4.12-4_2.6.9_22.EL.i386.rpm
[root@raid ~/iscsi-target]#
执行rpm -ivh 安装iscsi-target相关rpm文件。
[root@raid ~/iscsi-target]# rpm -ivh iscsitarget-*.rpm
Preparing... ########################################### [100%]
1:iscsitarget-kernel ########################################### [ 50%]
2:iscsitarget ########################################### [100%]
[root@raid ~/iscsi-target]#
将服务设置成自动启动。
[root@raid ~/iscsi-target]# chkconfig --add iscsi-target
[root@raid ~/iscsi-target]# chkconfig --level 345 iscsi-target on
安装完成。
2. 配置与启动
首先将老的配置文件彻底改名,换成新的配置文件。
[root@raid ~]# mv /etc/ietd.conf /etc/ietd.conf.old
编辑/etc/ietd.conf,写入全新的conf配置,内容如下:
Target iqn.2007-10.cn.com.swsoft.test.iscsi:test
IncomingUser public public123456
Lun 0 Path=/dev/sdb1,Type=fileio
Lun 1 Path=/dev/sdb2,Type=fileio
MaxConnections 5
这是一个iscsi-target所需要的最小配置。第一行target表示本设备的完全标识,命名方法是iqn.yyyy-dd.domain_name加冒号id。iqn是保留名称,必须用iqn开头,yyyy-dd表示年和日期,表示此SAN设备建立时间。后边的域名和冒号自行起名即可。IncomingUser是授权的用户名和密码,用空格隔开。注意:由于微软的Windows iSCSI-initiator要求密码长度需要在6到12位之间,否则会报错,因此这里设置密码长度要在6到12位之间。Lun 0 这一行表示SAN要提供访问的设备,例如/dev/sda1。如果有多个设备,可以写多行。最后一行MaxConnections 5表示最大并发连接是5。
设置完成后启动iscsi-target服务。
[root@raid ~]# /etc/init.d/iscsi-target restart
Stoping iSCSI target service: [ OK ]
Starting iSCSI target service: [ OK ]
[root@raid ~]#
如果服务启动成功,则检查TCP协议的3260端口,可看到监听。
[root@raid ~]# netstat -anp | grep 3260
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 4860/ietd
tcp 0 0 :::3260 :::* LISTEN 4860/ietd
[root@raid ~]#
三、 配置Windows为iSCSI-initiator
1. 微软iSCSI-initiator安装
微软为Windows2003系统提供了免费的iSCSI-initiator支持,可以从微软官方网站下载到这个组件。将其下载到桌面后,开始安装。
双击执行安装,点击下一步继续。
选中所有的安装项目。
同意许可协议。
安装进行中。
安装完成。
2. 配置与启动
双击桌面上的图标启动iSCSI-initiator。
启动iSCSI-Initator管理器的界面。
选择标签“Discovery”,然后点击Add按钮。
输入要连接的iSCSI-target服务器的ip地址和端口。(端口默认是3260)
添加设备完成。
点击“Targets”标签,可看到这个设备现在是inactive状态。
点击屏幕下方的logon按钮,登录到iSCSI-target上。
选中第一个选项,再每次系统启动时候自动进行连接。然后点击下边的“高级按钮” 。
在高级选项框中,首先选中“CHAP login infomation” ,然后输入用户名和密码。在前文配置iscsi-target过程中,用户名被设置为“public” ,密码设置为“public123456” 。这里输入用户名和密码,然后点击确定。
点击确定后,可看到设备的状态变成了“Connected” ,即连接成功了。
现在进入Windows的磁盘管理器,可以看到有磁盘1和磁盘2两个没有初始化的磁盘出现,他们就是来自iscsi-target上映射过来的/dev/sdb1和/dev/sdb2设备。
在磁盘上点击鼠标右键,首先进行初始化。
选中两个磁盘都进行初始化。
初始化后的磁盘将可以被调用。
创建分区并格式化完毕。
设备已经可以使用了。
四、 配置Linux为iSCSI-inititor
1. 安装
从Redhat Enterprise Linux AS 4.0起,已经提供了对ISCSI的支持。从第四张光盘内可找到名为 iscsi-initiator-utils的rpm包,将其上传到服务器上。
执行rpm -ivh 命令安装。
[root@test ~]# rpm -ivh iscsi-initiator-utils-4.0.3.0-2.i386.rpm
warning: iscsi-initiator-utils-4.0.3.0-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
Preparing... ########################################### [100%]
1:iscsi-initiator-utils ########################################### [100%]
[root@test ~]#
将服务设置为自动启动状态。
[root@test ~]# chkconfig --add iscsi
[root@test ~]# chkconfig --level 345 iscsi on
安装完成。
2. 配置与启动
首先将老的配置文件彻底改名,换成新的配置文件。
[root@test ~]# mv /etc/iscsi.conf /etc/iscsi.conf.old
编辑/etc/iscsi.conf,写入全新的conf配置,内容如下:
DiscoveryAddress=192.168.7.100
Username=public
Password=public123456
在这个配置文件中,第一行表示要查找的ISCSI设备的IP地址,下边设置好用户名和密码。保存配置文件并退出。
注意:目前的某些版本上,iscsi-initiator在开启CHAP身份验证的时候,会出现拒绝登录的错误。遇到这种情况,请关闭iscsi-target和iscsi-initiator上的所有身份验证选项,并改用防火墙IP地址限制进行访问策略控制。
启动iscsi-initiator后台服务。
[root@test ~]# /etc/init.d/iscsi restart
Stopping iscsid: [ OK ]
Checking iscsi config: [ OK ]
Loading iscsi driver: [ OK ]
Starting iscsid: [ OK ]
[root@test ~]#
服务启动完成后,检查/var/log/message里边的日志,确认是否加载SAN成功。如果有下边这样的一段,则表示加载成功。
Oct 17 18:03:30 vzlinux iscsid[4153]: Connected to Discovery Address 192.168.7.100
Oct 17 18:03:30 vzlinux kernel: iscsi-sfnet:host12: Session established
Oct 17 18:03:30 vzlinux kernel: scsi12 : SFNet iSCSI driver
Oct 17 18:03:30 vzlinux kernel: Vendor: IET Model: VIRTUAL-DISK Rev: 0
Oct 17 18:03:30 vzlinux kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 17 18:03:30 vzlinux kernel: SCSI device sda: 4194304 512-byte hdwr sectors (2147 MB)
Oct 17 18:03:30 vzlinux kernel: SCSI device sda: drive cache: write back
Oct 17 18:03:30 vzlinux kernel: SCSI device sda: 4194304 512-byte hdwr sectors (2147 MB)
Oct 17 18:03:30 vzlinux kernel: SCSI device sda: drive cache: write back
Oct 17 18:03:30 vzlinux kernel: sda: sda1
Oct 17 18:03:30 vzlinux kernel: Attached scsi disk sda at scsi12, channel 0, id 0, lun 0
Oct 17 18:03:30 vzlinux scsi.agent[4192]: disk at /devices/platform/host12/target12:0:0/12:0:0:0
Oct 17 18:03:30 vzlinux kernel: Vendor: IET Model: VIRTUAL-DISK Rev: 0
Oct 17 18:03:30 vzlinux kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 17 18:03:30 vzlinux kernel: SCSI device sdb: 4194304 512-byte hdwr sectors (2147 MB)
Oct 17 18:03:30 vzlinux kernel: SCSI device sdb: drive cache: write back
Oct 17 18:03:30 vzlinux kernel: SCSI device sdb: 4194304 512-byte hdwr sectors (2147 MB)
Oct 17 18:03:30 vzlinux kernel: SCSI device sdb: drive cache: write back
Oct 17 18:03:30 vzlinux kernel: sdb: sdb1
Oct 17 18:03:30 vzlinux kernel: Attached scsi disk sdb at scsi12, channel 0, id 0, lun 1
Oct 17 18:03:30 vzlinux scsi.agent[4239]: disk at /devices/platform/host12/target12:0:0/12:0:0:1
执行iscsi-ls命令查看刚才连接的设备。
[root@vzlinux ~]# iscsi-ls
*******************************************************************************
SFNet iSCSI Driver Version ...4:0.1.11(12-Jan-2005)
*******************************************************************************
TARGET NAME : iqn.2007-10.cn.com.swsoft.test.iscsi:test
TARGET ALIAS :
HOST ID : 12
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.7.100:3260,1
SESSION STATUS : ESTABLISHED AT Wed Oct 17 18:03:30 CST 2007
SESSION ID : ISID 00023d000001 TSIH 100
*******************************************************************************
[root@vzlinux ~]#
能够查看到设备则表示配置成功了。
作为客户端的initiator服务器将远程SAN上的磁盘视为了/dev/sdb的标准SCSI磁盘设备。现在可以用fdisk/mkfs等命令来执行分区、格式化等操作了。
[root@vzlinux ~]# fdisk -l
.........
Disk /dev/sda: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 260 2088418+ 7 HPFS/NTFS
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 260 2088418+ 7 HPFS/NTFS
[root@vzlinux ~]#
格式化磁盘为ext3格式。
[root@vzlinux ~]# mkfs.ext3 /dev/sdb1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
261120 inodes, 522104 blocks
26105 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
16320 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information:
done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@vzlinux ~]#
挂载这个设备到某目录。
[root@vzlinux ~]# mkdir -p /mnt/SAN/sdb1
[root@vzlinux ~]# mount /dev/sdb1 /mnt/SAN/sdb1
[root@vzlinux ~]# ls -l /mnt/SAN/sdb1
total 16
drwx------ 2 root root 16384 Oct 17 18:10 lost+found
[root@vzlinux ~]#
现在配置完成,磁盘可以使用了。
五、 总结
具有高度灵活性和较低成本的ISCSI出现,为存储领域提供了更多选择。更多文档,请参考iscsi-enterprise-target及iscsi-initiator软件包内自带文档。
全文完。
2007-10-17
powered by pcman.