Linux下实现iSCSI2011-03-21 16:28:14 | 419次阅读 | 评论:0 条 | Linux网络环境iSCSI技术的实现主要有三种方式: 1. 纯软件方式 服务器采用普通以太 网卡 来进行网络连接,通过运行上层软件来实现iSCSI和TCP/IP协议栈功能层。这种方式由于采用标准网卡,无需额外配置适配器,因此 硬件 成本最低。但是在这种方式中,服务器在完成自身工作的同时,还要兼顾网络连接,造成主机运行时间加长,系统性能下降。这种方式比较适合于预算较少,并且服务器负担不是很大的用户。目前不论是Microsoft Windows、 IBM AIX、 HP -UX、Linux、Novell Netware等各家操作系统,皆已陆续提供这方面的服务,在价格上,比起前两种方案,远为低廉,甚至完全免费。但由于Initiator驱动程序工作时会耗费大量的 CPU 使用率及系统资源,所以性能最差。在此建议,最好是采用1GHz以上CPU的主机,如此才能获得较佳的效能表现,如果公司主机CPU在1GHz以下,那么最好不要采用。至于在各类协议的支持上,Initiator驱动程序可以同时支持iSCSI、NFS及CIFS协议。当然现在大多数服务器CPU都可以满足这个要求。这里免费的iSCSI Initiator驱动程序,才可以将一般Gigabit网卡仿真成iSCSI Initiator。然后再透过iSCSI桥接器将一般SCSI接口的 存储 配备仿真成iSCSI Target,如此就形成一个iSCSI-SAN。 2. iSCSI TOE网卡实现方式 在这种方式中,服务器采用特定的TOE网卡来连接网络,TCP/IP协议栈功能由智能网卡完成,而iSCSI层的功能仍旧由主机来完成。这种方式较前一种方式,部分提高了服务器的性能。在三种iSCSI Initiator中,价格比iSCSI HBA便宜,但比软件Initiator 驱动程序贵,性能也居于两者之间。目前市面上Intel的TOE(TCP Offload Engine,TCP卸载引擎) HBA价格在150美金左右。 3. iSCSI HBA卡实现方式 使用iSCSI存储适配器来完成服务器中的iSCSI层和TCP/IP协议栈功能。这种方式使得服务器CPU无需考虑iSCSI以及网络配置,对服务器而言,iSCSI存储器适配器是一个HBA(存储主机主线适配器)设备,与服务器采用何种操作系统无关。该方式性能最好,但是价格也最为昂贵。在三种iSCSI Initiator中,价格最贵,但性能最佳。目前价格已由一开始的1000美金左右,下降跌至500美元左右。对于有高效能应用需求的企业,最好采用iSCSI HBA卡,如此才能获得最好的性能。 考虑到笔者使用Linux 服务器 使用2.4G Intel 至强处理器,而且网络负载不大,本文使用第一种方式,拓朴结构见图2.
图2 网络拓朴结构 说明:iSCSI 储存设备架构: 型号为PROMISE Vtrak 15200 ,使用 iSCSI 机型; 使用5 颗 硬盘 ,1 颗为 spare disk,其余4 颗做成 RAID-5; IP:iSCSI 储存设备的 IP 地址设置为 192.168.11.201 连接到储存设备的账号与密码分别为: myaccount/iscsimy1Spw Linux 服务器: 系统: Red Hat 9 Linux核心 ( 2.4.20-8mp ) IP: Red Hat 9 Linux服务器IP地址设置为 192.168.10.3
硬件 : Dell PowerEdge 16000SC(2.4G Intel 至强处理器,512MB DDR ECC 内存 )基础型服务器。用于邮件服务器(商业版本的sendmail:3Rsoft)。 1.准备工作 因为安装iSCSI驱动需要配合核心来编译,所以会使用到内核源代码,此外,也需要编译器 ( compiler ) 的帮助,因此,先确定您的 Linux 系统当中已经下列软件的存在 :kernel-source 、kernel、gcc、perl、Apache。 打开一个终端,使用命令检查: # rpm -qa | grep gcc;rpm -qa | grep make # rpm -qa | grep kernel ;rpm -qa | grep make iSCSI 驱动程序下载网址是:http:///project/showfiles.p hp group_id=26396 这个网站根据Linux内核(2.4/2.6)提供两种驱动程序,请根据内核版本下载相应的驱动,首先使用下面的命令查询目前所使用的Linux的内核版本: #uname –a Linux cao 2.4.20-8#1Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux 2. 得到版本信息后,到其官方网站下载系统所需的驱动。下载完成就可以使用下面的命令安装该组件然后编译内核: #cd cd /usr/local/src # wegt http://nchc.dl./sourceforge/linux-iscsi/linux-iscsi-3.4.3.2.tgz #tar -zxvf linux-iscsi-3.4.3.2.tgz # cd linux-iscsi-3.4.3.2 #make clean # make #make install 3. 修改配置文件开始进行修改的工作: # vi /etc/iscsi.conf Username= myaccount #用户名# Password= iscsimy1Spw #口令# DiscoveryAddress=192.168.11.201 #iSCSI 储存设备的 IP 地址# Username=myaccount Password=iscsimy1Spw 4. 启动iscs #/etc/init.d/iscsi start Starting iSCSI: iscsi iscsid fsck/mount 5. 使用iscsi-ls命令可以看到更为详细的磁盘信息:: # iscsi-ls ***************************************************************** SFNet iSCSI Driver Version ... 3.4.3.2 (27-Jun-2005 ) **************************************************************** TARGET NAME : iqn.1994-12.com.promise.target.3b.31.4.55.1.0.0.20 TARGET ALIAS : Vtrak 15200 HOST NO : 0 BUS NO : 0 TARGET ID : 0 TARGET ADDRESS : 192.168.11.201:3260 SESSION STATUS : ESTABLISHED AT Thu Nov 10 20:13:43 2005 NO. OF PORTALS : 1 PORTAL ADDRESS 1 : 192.168.11.201:3260,2 SESSION ID : ISID 00023d000001 TSIH 04 **************************************************************** iSCSI节点名称有两种格式,即 iqn-type 格式和 eui-type 格式。 Linux常用的是iqn-type的格式为: 6.使用fdisk命令进行磁盘分区 fdisk命令格式 fdisk [-l] [-b SSZ] [-u] device 主要选项: -l: 察看指定的设备的分区表状况。 -b SSZ:将指定的分区大小输出到标准输出上,单位为区块。 -u:搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址。 device:要这些操作的设备名称。 fdisk是各种Linux发行版本中最常用的分区工具,是被定义为Expert级别的分区工具。我们可以通过fdisk来分区使用iscsi设备。它还包括一个二级选单,首先输入命令,然后出现问答式界面,用户通过在这个界面中输入命令参数来操作fdisk。见图3。
图3 fdisk分区工具 选项介绍: a:设定硬盘启动区。 b:编辑一个BSD类型分区。 c:编辑一个DOS兼容分区。 d: 删除一个分区。 l: 察看指定的设备的分区表状况。 m:显示Fdisk命令各个参数的说明。 o:创建一个DOS分区。 n:设定新的硬盘分区。 p:打印分区信息。 s:创建一个空 Sun 分区表。 t:改变硬盘分区类型。 q: 结束分区,不保存操作内容。 v:校验硬盘分区表。 w:结束分区,保存操作内容。 x:进入高级操作模式。 # fdisk /dev/hdd 运行后出现fdiak的命令提示符: Command (m for help): 使用n命令创建一个分区,会出现选择主分区(p primary partition)还是扩展分区(l logical)的提示,通常选用主分区。然后按照提示输入分区号(Partion number(1-4):)、新分区起始的磁盘块数(First Cylinder)和分区的大小,可以是以MB为单位的数字(Last cylindet or +siza or +sizeM or +sizeK:)。例如: fdisk /dev/sda Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-189971, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-189971, default 189971): Using default value 1899719 Command (m for help): w 7.格式化分区: #mke2fs -t ext3 -c /dev/sda1 8.设定加载点: #mkdir /cluster/raid # mount -t ext3 /dev/sda1 /cluster/raid 经过以上的操作,我的 Linux服务器已经连接到 iSCSI 储存设备, 并且如同Linux 本机上面的一个 SCSI 硬盘一样。 使用的方式几乎一模一样。 9. 自动挂载一个iSCSI卷 可以通过向/etc/fstab.iscsi (filesystem table)中添加指令行来告诉Linux如何自动挂载卷了。使用vi编辑器修改/etc/fstab,依次使用shift+G命令(将光标定位到最后一行)然后使用o命令(插入新行并且进入编辑状态),输入以下内容: /dev/sda1 /cluster/raid ext3 defaults 0 0 存盘后从新启动计算机Linux即可自动挂载iSCSI卷。 五、保护iSCSI安全
光纤 通道环境给人感觉具有比较高的安全性,原因在于它们是受控的专有网络。iSCSI 给人感觉安全性较低,原因在于它是基于以太网的网络。不过从本质上来说,光纤通道是没有安全功能的,而iSCSI提供了非常丰富的安全功能。iSCSI 规范提供了initiator与目标端两方面的身份验证(使用 CHAP、SRP、Kerberos 和 SPKM),能够阻止未经授权的访问,只允许那些可信赖的节点进行访问。另外,IPsec Digests(IPsec 摘要)和 Anti-Reply(防回复)功能阻止了插入、修改和删除操作,而 IPsec Encryption(IPsec 加密)功能防止被偷听,确保了私密性。 最简单的iSCSI实现方式,就是没有任何加密和认证机制的连接。这种方式仅提供“SCSI指令在TCP/IP协议上传输”这样一个最基本的功能,连接到网络上的任何一台主机都可以毫无阻碍地连接到iSCSI 存储 设备上。这种方式显然对任何危险都没有防范能力。但是,这种方式也有一个明显的优势,那就是性能。没有了认证和加密,自然也就省去了很多额外的开销。如果您非常需要您的iSCSI磁盘阵列全速工作,这种方式无疑是最好的选择。 当然,选择这种方式的时候,用来连接iSCSI磁盘阵列的网络 交换机 最好是与外界隔离的。 妥善选择口令 口令应避免与个人资料有关系,不要选用诸如身份证号码、出生日期、 电话 号码等作为密码。建议选用字母、数字混合的方式,以提高密码破解难度。尽量避免在不同的操作系统使用同一密码,否则密码一旦遗失,后果将不堪设想。黑客们经常用一些常用字来破解密码。曾经有一位美国黑客表示,只要用“password”这个字,就可以打开全美多数的计算机。其它常用的单词还有:account、ald、alpha、beta、computer、dead、demo、dollar、games、bod、hello、help、intro、kill、love、no、ok、superuser、system、test、work、yes等。另外相信设置空白口令这件事就会让很多网络管理员头疼。很多用户嫌口令难记,干脆留空,或者随手设成111111之类。这种口令实在令人着急,稍微耐心一点儿的黑客,手工都可以试出来,更何况眼下各种字典攻击程序满天飞。对iSCSI磁盘阵列来说,情况也是一样。如果仅靠用户认证不能解决问题,就需要借鉴传统IP网络的办法,在内网和外网之间架设 防火墙 ,阻击外面那些有充分精力和耐心的“尝试者”。 如果iSCSI磁盘阵列(Target)和主机(Initiator)需要跨广域网连接,最好使两者以 VPN 互连。总之就是一个目的,不让iSCSI磁盘阵列使用公网的IP地址。 总结:至此这里给予Linux网络下中小企业一个低成本的iSCSI的解决方案。 iSCSI小贴士: 1.应该使用 硬件 initiator 还是软件 initiator? iSCSI initiator 是使用硬件还是软件要取决于多种因素,包括预算、性能要求以及 服务器 工作负荷。软件 iSCSI initiator 能够实现成本最低的 iSCSI 解决方案。纯软件 iSCSI initiator 使用标准以太 网卡 ,并依靠主机 CPU 来处理 iSCSI 命令和 TCP/IP 栈。对于具有 2G CPU 的最新一代服务器来说,大部分客户工作负荷在 iSCSI 协议处理方面不会引发明显的性能开销。如果您的服务器拥有千兆以太网卡则对软件 initiator 的评测过程几乎不会有任何问题,原因是在绝大多数流行的操作系统中,initiator 都是免费提供的。如果 CPU 较陈旧,服务器的负荷较重,则可能更适合采用硬件 iSCSI initiator。硬件 iSCSI initiator 会将 iSCSI 和 TCP/IP 处理工作转移到 iSCSI HBA 中。其结果就是能够大幅度降低 CPU 的性能开销,这点堪与光纤通道 HBA 相比。硬件 initiator 还能提供软件解决方案所不具备的功能,例如支持高可用性环境的硬件多通道功能,支持密集服务器环境中的远程引导功能。 2.硬件和软件 initiator 如何影响应用程序的性能? 如果应用程序位于负担较轻的服务器上,在大多数情况下,采用软件 initiator 的 iSCSI 的性能开销也不会明显影响应用程序的性能。如果服务器的负荷较重,则必须采用硬件 iSCSI initiator。不过,在大多数环境中,传输带宽以及主机 CPU 的性能开销完全不是问题 — 应用程序性能问题在很大程度上要归因于存储的轴数有限(承担工作负荷的磁盘太少)。这不是协议或传输问题。这是直连式存储系统的一个普遍问题,但是采用基于 iSCSI 的 SAN 解决方案可以非常方便地解决这一问题。 3.Linux下哪些服务器适合使用iSCSI构架? 目前Linux的擅长应用领域是:单一应用的基础服务器应用,譬如DNS和DHCP服务器、Web服务器、目录服务器、防火墙、文件服务器、打印服务器、互联网连接代理服务器、数据库。其中,数据库服务器及邮件服务器最适合采用iSCSI构架,另外NetApp表示由于ERP数据库系统采用块协议,所以非常适合建置在iSCSI构架 上。 参考文件: Linux iSCSI project:http://linux-iscsi./ A Quick Guide to iSCSI on Linux:http://www./articles/iscsi/index.html
http://www./objects/support/Solaris_Cisco-APP-CHN-004-01.pdf
安装:
1.服务器端:iscsitarget-0.4.16.tar.gz #tar xvfz iscsitarget-0.4.16.tar.gz #cd iscsitarget-0.4.16 #make [root@localhost iscsitarget-0.4.16]# make Applying Patch compat-2.6.22-2.6.23.patch patching file kernel/block-io.c patching file kernel/config.c patching file kernel/digest.c patching file kernel/event.c Applying Patch compat-2.6.19-2.6.21.patch patching file kernel/event.c patching file kernel/iscsi.c Hunk #1 succeeded at 1762 (offset 5 lines). patching file kernel/tio.c Applying Patch compat-2.6.14-2.6.18.patch patching file kernel/iscsi.h patching file kernel/digest.c patching file kernel/file-io.c patching file kernel/iscsi.c patching file kernel/tio.c Applying Patch compat-rhel4.patch patching file kernel/config.c patching file kernel/event.c make -C usr make[1]: Entering directory `/utils/iscsitarget-0.4.16/usr' cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o ietd.o ietd.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o iscsid.o iscsid.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o conn.o conn.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o session.o session.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o target.o target.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o message.o message.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o ctldev.o ctldev.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o log.o log.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o chap.o chap.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o event.o event.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o param.o param.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o plain.o plain.c cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o isns.o isns.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 -o ietd -lcrypto cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -c -o ietadm.o ietadm.c cc ietadm.o param.o -o ietadm make[1]: Leaving directory `/utils/iscsitarget-0.4.16/usr' make -C /lib/modules/2.6.9-55.EL/build SUBDIRS=/utils/iscsitarget-0.4.16/kernel modules make[1]: Entering directory `/usr/src/kernels/2.6.9-55.EL-i686' CC [M] /utils/iscsitarget-0.4.16/kernel/tio.o CC [M] /utils/iscsitarget-0.4.16/kernel/iscsi.o CC [M] /utils/iscsitarget-0.4.16/kernel/nthread.o CC [M] /utils/iscsitarget-0.4.16/kernel/wthread.o CC [M] /utils/iscsitarget-0.4.16/kernel/config.o CC [M] /utils/iscsitarget-0.4.16/kernel/digest.o CC [M] /utils/iscsitarget-0.4.16/kernel/conn.o CC [M] /utils/iscsitarget-0.4.16/kernel/session.o CC [M] /utils/iscsitarget-0.4.16/kernel/target.o CC [M] /utils/iscsitarget-0.4.16/kernel/volume.o CC [M] /utils/iscsitarget-0.4.16/kernel/iotype.o CC [M] /utils/iscsitarget-0.4.16/kernel/file-io.o CC [M] /utils/iscsitarget-0.4.16/kernel/null-io.o CC [M] /utils/iscsitarget-0.4.16/kernel/target_disk.o CC [M] /utils/iscsitarget-0.4.16/kernel/event.o CC [M] /utils/iscsitarget-0.4.16/kernel/param.o CC [M] /utils/iscsitarget-0.4.16/kernel/block-io.o LD [M] /utils/iscsitarget-0.4.16/kernel/iscsi_trgt.o Building modules, stage 2. MODPOST CC /utils/iscsitarget-0.4.16/kernel/iscsi_trgt.mod.o LD [M] /utils/iscsitarget-0.4.16/kernel/iscsi_trgt.ko make[1]: Leaving directory `/usr/src/kernels/2.6.9-55.EL-i686' #make install [root@localhost iscsitarget-0.4.16]# make install `usr/ietd' -> `/usr/sbin/ietd' `usr/ietadm' -> `/usr/sbin/ietadm' `etc/initd/initd.redhat' -> `/etc/init.d/iscsi-target' `etc/ietd.conf' -> `/etc/ietd.conf' `etc/initiators.allow' -> `/etc/initiators.allow' `etc/initiators.deny' -> `/etc/initiators.deny' `doc/manpages/ietadm.8' -> `/usr/share/man/man8/ietadm.8' `doc/manpages/ietd.8' -> `/usr/share/man/man8/ietd.8' `doc/manpages/ietd.conf.5' -> `/usr/share/man/man5/ietd.conf.5' install: creating directory `/usr/share/doc/iscsitarget' `ChangeLog' -> `/usr/share/doc/iscsitarget/ChangeLog' `COPYING' -> `/usr/share/doc/iscsitarget/COPYING' `README' -> `/usr/share/doc/iscsitarget/README' `README.vmware' -> `/usr/share/doc/iscsitarget/README.vmware' install: creating directory `/lib/modules/2.6.9-55.EL/kernel/iscsi' `kernel/iscsi_trgt.ko' -> `/lib/modules/2.6.9-55.EL/kernel/iscsi/iscsi_trgt.ko' Running depmod #vi /etc/ietd.conf 找到这个条目修改成你机器的文件位置 Lun 0 Path=/dev/sdj,Type=fileio Alias itest (此处的设备可以是IDE盘或LV) 启动服务器端: #service iscsi-target start 2.客户端:iscsi-initiator-utils-4.0.3.0-5.i386.rpm #rpm -ivh iscsi-initiator-utils-4.0.3.0-5.i386.rpm 修改配置文件:/etc/iscsi.conf Target Name Category 下的这个"#"号删除 #TargetName=iqn.1987-05.com.jsh:00.0d1d898e8d66.t0 TargetName=iqn.1987-05.com.jsh:00.0d1d898e8d66.t0 Discovery Address Category 找到这个值修改成你服务器的IP地址 #DiscoveryAddress=192.168.1.241:3260 DiscoveryAddress=192.168.1.241:3260 #service iscsi start 用iscsi-ls -l查看到,系统多了一个DEV:/dev/sda [root@localhost /]# iscsi-ls -l ******************************************************************************* SFNet iSCSI Driver Version ...4:0.1.11-4(15-Jan-2007) ******************************************************************************* TARGET NAME : iqn.2001-04.com.example:storage.disk2.sys1.xyz TARGET ALIAS : HOST ID : 1 BUS ID : 0 TARGET ID : 0 TARGET ADDRESS : 192.168.1.241:3260,1 SESSION STATUS : ESTABLISHED AT Tue Apr 22 16:36:42 CST 2008 SESSION ID : ISID 00023d000001 TSIH 200 DEVICE DETAILS: --------------- LUN ID : 0 Vendor: IET Model: VIRTUAL-DISK Rev: 0
Type : Direct-Access ANSI SCSI revision: 04 page83 type1: 49455400000000000000000001000000110600000d000000 page80: 0a Device: /dev/sda ******************************************************************************* 编辑/etc/fstab文件(先自己创建/mnt/data1) /dev/sda1 /mnt/data1 ext3 _netdev 0 0 挂接分区: mount /mnt/data1 df可看到/dev/sda1已挂接进来。 [root@localhost /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 73G 4.6G 65G 7% / /dev/hda1 99M 9.4M 85M 10% /boot none 248M 0 248M 0% /dev/shm /dev/hdd 2.2G 2.2G 0 100% /media/cdrom /dev/sda1 689M 80M 575M 13% /mnt/data1 windows上也可以使用iscsi盘,只是需要到网上下载iscsi客户端软件。 |
|