分类: BSD
2009-06-09 15:33:47
很多时候在公司做一些测试的时候,都需要共享盘柜的支持,比如Oracle RAC的安装,比如HA的安装,而公司也不太可能只是为了测试就去购买一个昂贵的共享盘柜回来,再说即便买了,没有HBA卡,一样没戏。 而iSCSI作为SAN解决方案的一种,可以使用纯软件来实现,并且不需要FC环境,这无疑可能帮助我们来实现共享存储的。其实我一直都在使用这个方案来测试公司的HA,安装Oracle等,下面是我的配置手记。 1)预备环境 你得先预备三台机器,不必相同,台式机,笔记本都行,操作系统版本也没有一定的要求,我这里都是红旗桌面5.0 其中一台机器安装iSCSI target,充当共享盘柜。另外两台机器就充当应用服务器了。 2)下载最新的iSCSI 在sourceforge上,搜索iSCSI,你会得到不少项目的显示,其中一些iSCSI是专门作initiator端的,不适合我们的环境,我所了解的同时支持target和initiator端的有UNH-iSCSI Initiator and Target for Linux 和Intel OSD/iSCSI 。 我这里以intel-iscsi为例,目前最新的版本是2.0.16,你可以点击intel-iscsi 下载。 3)在模拟共享盘柜服务器上编译iSCSI Target [root@wgzhao ~]# tar -xzf intel-iscsi-2.0.16.tar.gz [root@wgzhao ~]# cd intel-iscsi-2.0.16 [root@wgzhao intel-iscsi-2.0.16]# ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc ............... config.status: creating Makefile config.status: creating src/Makefile config.status: executing depfiles commands [root@wgzhao intel-iscsi-2.0.16]# make Making all in src make[1]: Entering directory `/root/intel-iscsi-2.0.16/src' source='util.c' object='util.o' libtool=no \ depfile='.deps/util.Po' tmpdepfile='.deps/util.TPo' \ gcc -Wall -Wno-unused -g -O2 -DCONFIG_ISCSI_DEBUG -D_GNU_SOURCE -g -O2 -o utest utest.o tests.o osd_ops.o research.o-lpthread -lm -L . -linitiator -liscsi source='fitness.c' object='fitness.o' libtool=no \ depfile='.deps/fitness.Po' tmpdepfile='.deps/fitness.TPo' \ depmode=gcc3 /bin/sh ../aux/depcomp \ gcc -DPACKAGE_NAME=\"Intel\ iSCSI\" -DPACKAGE_TARNAME=\"intel-iscsi\" -DPACKAGE_VERSION=\"2.0.16\" -DPACKAGE_STRING=\"Intel\ iSCSI\ 2.0.16\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"intel-iscsi\" -DVERSION=\"2.0.16\" -I. -I. -Wall -Wno-unused -g-O2 -DCONFIG_ISCSI_DEBUG -D_GNU_SOURCE -g -O2 -c `test -f fitness.c || echo './'`fitness.c .............. [root@wgzhao intel-iscsi-2.0.16]# make install Making install in src make[1]: Entering directory `/root/intel-iscsi-2.0.16/src' make[2]: Entering directory `/root/intel-iscsi-2.0.16/src' /bin/sh ../aux/mkinstalldirs //bin /usr/bin/install -c udisk //bin/udisk /usr/bin/install -c utest //bin/utest /usr/bin/install -c fitness //bin/fitness /usr/bin/install -c uosd //bin/uosd /usr/bin/install -c iscsi_reset_counters //bin/iscsi_reset_counters /bin/sh ../aux/mkinstalldirs //bin /usr/bin/install -c iscsi-monitor //bin/iscsi-monitor /usr/bin/install -c iscsi-initiator-counters //bin/iscsi-initiator-counters /usr/bin/install -c iscsi-diff-initiator-counters //bin/iscsi-diff-initiator-counters /usr/bin/install -c iscsi-diff-target-counters //bin/iscsi-diff-target-counters /usr/bin/install -c iscsi-sample-counters //bin/iscsi-sample-counters ranlib //lib/libtarget.a /bin/sh ../aux/mkinstalldirs //etc /usr/bin/install -c -m 644 ips.conf //etc/ips.conf make install-exec-hook make[3]: Entering directory `/root/intel-iscsi-2.0.16/src' chmod a+s //bin/iscsi_reset_counters make[3]: Leaving directory `/root/intel-iscsi-2.0.16/src' ........... 4)运行iSCSI target intel-iSCSI的target程序是udisk,其用法如下: [root@wgzhao intel-iscsi-2.0.16]# udisk -u Usage: -p -s -v Output version and exit -b -n -l -d (default is ramdisk) -t -u Display this usage 以为我没有多余的磁盘和分区,一般都采用文件的方式 [root@wgzhao home]# udisk -b 512 -n 4096000 -d iscsi Usage: -p -s -v Output version and exit -b -n -l -d (default is ramdisk) -t -u Display this usage LUN 0: 2000 MB DISK FILE (512 byte block) 这样iscsi这个文件将在initiator端看来是一个2000M大小的磁盘。 5)在应用服务器上编译iSCSI initiator [root@wgzhao intel-iscsi-2.0.16]# ./configure --enable-2_6=/usr/src/linux checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no ........... 注意:后面的参数是指定linux内核源代码的位置,如果你是2.4的核心,请使用 [root@wgzhao intel-iscsi-2.0.16]# ./configure --enable-2_4=/usr/src/linux [root@wgzhao intel-iscsi-2.0.16]# make Making all in src make[1]: Entering directory `/root/intel-iscsi-2.0.16/src' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/root/intel-iscsi-2.0.16/src' Making all in linux-2.6 make[1]: Entering directory `/root/intel-iscsi-2.0.16/linux-2.6' if [ -x ../../=build ]; then \ ln -sf ../../=build/../src/*.c .; \ ln -sf ../../=build/../src/*.h .; \ else \ ln -sf ../src/*.h .; \ ln -sf ../src/*.c .; \ fi make -C /usr/src/linux M=`pwd` CC=gcc make[2]: Entering directory `/usr/src/linux-2.6.14-12DT .......................... make[3]: *** [/root/intel-iscsi-2.0.16/linux-2.6/driver.o] 错误 1 make[2]: *** [_module_/root/intel-iscsi-2.0.16/linux-2.6] 错误 2 make[2]: Leaving directory `/usr/src/linux-2.6.14-12DT' make[1]: *** [all] 错误 2 make[1]: Leaving directory `/root/intel-iscsi-2.0.16/linux-2.6' make: *** [all-recursive] 错误 1 如果你遇到了下面的上面的类似错误,请使用下面的命令来编译驱动 [root@wgzhao intel-iscsi-2.0.16]# cd /usr/src/kernels/2.6.14-12DT-i686/ [root@wgzhao 2.6.14-12DT-i686]# make M=/root/intel-iscsi-2.0.16/linux-2.6 CC [M] /root/intel-iscsi-2.0.16/linux-2.6/driver.o In file included from /root/intel-iscsi-2.0.16/linux-2.6/driver.c:74: /root/intel-iscsi-2.0.16/linux-2.6/util.h:242:21: warning: "__BIG_ENDIAN" is not defined CC [M] /root/intel-iscsi-2.0.16/linux-2.6/initiator.o In file included from /root/intel-iscsi-2.0.16/linux-2.6/iscsi.h:40, from /root/intel-iscsi-2.0.16/linux-2.6/initiator.h:36, from /root/intel-iscsi-2.0.16/linux-2.6/initiator.c:56: ............ Building modules, stage 2. MODPOST CC /root/intel-iscsi-2.0.16/linux-2.6/intel_iscsi.mod.o LD [M] /root/intel-iscsi-2.0.16/linux-2.6/intel_iscsi.ko [root@wgzhao intel-iscsi-2.0.16]#cd /root/intel-iscsi-2.0.16 [root@wgzhao intel-iscsi-2.0.16]#make install 上面两个命令的路径根据你实际情况修改。 通过上面的编译,intel-iscsi源代码的linux-2.6(如果是2.4的核心,则是linux-2.4)目录下有一个intel-iscsi.ko文件(如果是2.4的核心,则为intel-iscsi.o),到这一步,initiator已经准备好了。 6)配置和启动initiator 在应用服务器上,编辑/etc/ips.conf文件,这个文件是initiator的配置文件,里面对配置选项有大量的注释。这里最简单的方法是找到文件最后一行,类似下面: ip=1.1.1.2 修改成模拟存储盘柜的那台机器的IP地址,比如我的是 ip=172.16.81.175 然后加载模块 insmod -f /root/intel-iscsi-2.0.16/linux-2.6/intel_iscsi.ko 执行dmesg命令,你应该能够看到类似下面的几行信息: [root@wgzhao intel-iscsi-2.0.16]# dmesg Vendor: Intel Model: iSCSI Reference Rev: 2 Type: Direct-Access ANSI SCSI revision: 02 SCSI device sda: 4096000 512-byte hdwr sectors (2097 MB) SCSI device sda: drive cache: write through sda: unknown partition table Attached scsi disk sda at scsi4, channel 0, id 0, lun 0 这表示initiator已经运行成功,并且和target建立了会话,你也可以使用下面的命令看参考其他信息 [root@wgzhao intel-iscsi-2.0.16]# cat /proc/scsi/iscsi/1 Intel iSCSI 2.0.16 Write this file to reset counters (i.e., "echo reset-all > /proc/scsi/iscsi/*"). outstanding[0][0]: 0 bytes_sending[0][0]: 0 bytes_receiving[0][0]: 0 ops_succeeded[0][0]: 39 write_ops[0][0]: 0 read_ops[0][0]: 37 bidi_ops[0][0]: 0 ops_failed[0][0]: 0 ops_aborted[0][0]: 0 device_resets[0][0]: 0 bus_resets[0][0]: 0 host_resets[0][0]: 0 bytes_sent[0][0]: 0 bytes_received[0][0]: 405645 op_latencies[0][0]: 76821 usec op_depths[0][0]: 39 min_lba_a[0][0]: 0 max_lba_a[0][0]: 4095992 min_lba_b[0][0]: 0 max_lba_b[0][0]: 4095992 write_jumps[0][0]: 0 read_jumps[0][0]: 16355701 total_jumps[0][0]: 16355701 min_response_time[0][0]: 390 usec max_response_time[0][0]: 11992 usec avg_response_time[0][0]: 3201 usec (last 10) avg response time[0][0]: 1961 usec (last 39) avg response time[0][0]: 1961 usec (last 39) TID IP Address Port State Errors Nop-in Nop-out TargetName 0 172.16.81.175 3260 0x1f (FULL FEATURE) 0 0 0 iqn.2003-08.com.intel:localhost.localdomain OK,剩下的事情就是在另外一台应用服务器上重复刚才的操作,如果是同样的操作系统版本,那么你可以直接把intel-iscsi.ko和/etc/ips.conf文件拷贝过去就行了。 这样两台应用服务器都看到类似sda的设备。 接下来要做的事情就和你平常使用真正的共享盘柜没有什么差别了。 Enjoy it! |