Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329131
  • 博文数量: 46
  • 博客积分: 1921
  • 博客等级: 上尉
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-03 17:07
文章分类

全部博文(46)

文章存档

2011年(19)

2010年(4)

2009年(11)

2008年(12)

我的朋友

分类: BSD

2009-06-09 15:33:47

利用开源iSCSI项目模拟共享盘柜(转载)


很多时候在公司做一些测试的时候,都需要共享盘柜的支持,比如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            Port number (dflt 3260)
      -s           Amount to sleep before accepting new login (dflt 0)
      -v                  Output version and exit
      -b    Choose from 512, 1024, 2048, 4096 (dflt 512)
      -n      Number of blocks per logical unit (dflt 262144)
      -l            Number of logical units (dflt 1)
      -d          e.g., /dev/sdb, /dev/sg1, /dev/raw/raw2, /tmp/file
                          (default is ramdisk)
      -t       Output I/O trace to (replayed by fitness)
      -u                  Display this usage


以为我没有多余的磁盘和分区,一般都采用文件的方式


[root@wgzhao home]# udisk -b 512 -n 4096000 -d iscsi

Usage: -p            Port number (dflt 3260)
      -s           Amount to sleep before accepting new login (dflt 0)
      -v                  Output version and exit
      -b    Choose from 512, 1024, 2048, 4096 (dflt 512)
      -n      Number of blocks per logical unit (dflt 262144)
      -l            Number of logical units (dflt 1)
      -d          e.g., /dev/sdb, /dev/sg1, /dev/raw/raw2, /tmp/file
                          (default is ramdisk)
      -t       Output I/O trace to (replayed by fitness)
      -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!
阅读(3810) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~