您的位置:首页 > 理论基础 > 计算机网络

SCST在SAN网络环境中的应用

2015-08-24 13:53 661 查看

问题描述

在SAN网络环境中,Linux服务器上的SCSI设备,如何通过HBA卡,走光纤网络,让其他的服务器使用到这些设备?本文采用SCST - Generic SCSI Target Subsystem for Linux,试图解决该问题。

查看HBA卡的信息

# lspci | grep -i fibre
01:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)
01:00.1 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)


一块卡上有2个端口。

在/sys/class/fc_host/目录下,可以查看HBA卡信息

# cd /sys/class/fc_host/
# ls
host0  host1    # 有两个端口
# cat ./host1/port_name # 查看端口1的名称
0x2101001b3235b031
# cat ./host1/port_state # 查看端口1的状态
Online
# cat ./host1/speed # 查看端口1的速率
4 Gbit


通过查看host0,host1目录下的属性文件,可以查看HBA的各种信息。

安装systool工具,可以方便的查看HBA信息,该工具在sysfsutils包中。

# rpm -ivh libsysfs-2.1.0-7.el6.x86_64.rpm
# rpm -ivh sysfsutils-2.1.0-7.el6.x86_64.rpm

查看端口名称
# systool -c fc_host -v | grep "port_name"
port_name           = "0x2100001b3215b031"
port_name           = "0x2101001b3235b031"
查看端口速率
# systool -c fc_host -v | grep "speed"
speed               = "unknown"
supported_speeds    = "1 Gbit, 2 Gbit, 4 Gbit"
speed               = "4 Gbit"
supported_speeds    = "1 Gbit, 2 Gbit, 4 Gbit"
查看端口状态
# systool -c fc_host -v
Class = "fc_host"
......
Class Device = "host1"
Class Device path = "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/host1/fc_host/host1"
dev_loss_tmo        = "45"
fabric_name         = "0xffffffff"
issue_lip           = <store method only>
max_npiv_vports     = "127"
node_name           = "0x2001001b3235b031"
npiv_vports_inuse   = "0"
**port_id             = "0x0000ef"**
**port_name           = "0x2101001b3235b031"**
**port_state          = "Online"**
port_type           = "Point-To-Point (direct nport connection)"
**speed               = "4 Gbit"**
supported_classes   = "Class 3"
supported_speeds    = "1 Gbit, 2 Gbit, 4 Gbit"
symbolic_name       = "QLE2462 FW:v7.03.00 DVR:v8.07.00.08.06.6-k1"
system_hostname     = ""
tgtid_bind_type     = "wwpn (World Wide Port Name)"
uevent              =
vport_create        = <store method only>
vport_delete        = <store method only>

Device = "host1"
Device path = "/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1/host1"
fw_dump             =
nvram               = "ISP "
optrom              =
optrom_ctl          = <store method only>
reset               = <store method only>
sfp                 = ""
uevent              = "DEVTYPE=scsi_host"
vpd                 = "."


将HBA卡修改为Target模式

把HBA开装到服务器上,因为Linux操作系统内核已经支持了qla2xxx的驱动,所以不需要去Qlogic去下载特殊的驱动,就可以使用HBA,只是该HBA卡处理initiator模式。

# lsmod | grep qla2xxx
qla2xxx               469784  0
scsi_transport_fc      55075  1 qla2xxx


CentOS 6.x的内核版本是2.6.32,只支持Qlogic的HBA卡的init模式,不支持Target模式。

解决办法有两个,都需要重新编译内核,第一个办法,在Linux kernel 2.6.32内核上,把HBA卡的驱动换成支持Target模式的驱动;第二个办法,将Linux内核版本升级到3.x。

在这里,采用第一个办法,更换HBA的驱动。

准备工作

构建本地YUM源

创建DVD挂载点
# mkdir -p /mnt/centos
# mount -o loop CentOS-6.6-x86_64-bin-DVD1.iso /mnt/centos
修改YUM源配置文件
# cd /etc/yum.repos.d/
# vi CentOS-Media.repo
...
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/centos/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


还有一些必要的软件,本地源无法提供,采用163的YUM进行安装

http://mirrors.163.com/.help/centos.html下载CentOS6的YUM源配置文件CentOS6-Base-163.repo,将该文件上传到服务器上的/etc/yum.repos.d/目录下。

移去当前正在使用的由系统提供的qla2xxx模块,并在下次启动时屏蔽:

# rmmod qla2xxx
# echo  blacklist  qla2xxx >/etc/modprobe.d/blacklist-qla2xxx.conf
# reboot


编译内核

查看内核代码

# uname -r
2.6.32-504.el6.x86_64


下载内核源代码:kernel-2.6.32-504.el6.src.rpm

安装内核源代码

# groupadd mockbuild #解决warning: group mockbuild does not exist - using root问题
# useradd mockbuild -g mockbuild #解决warning: user mockbuild does not exist - using root 问题
# rpm -ivh kernel-2.6.32-504.el6.src.rpm


安装后,会生成rpmbuild目录。

产生随机数

# yum install rng-tools # 安装rngd
# rngd -r /dev/urandom # 生成随机数,否则下面的rpmbuild的过程会很漫长


执行kernel.spec的”%prep”部分,主要是解开源代码并打相应补丁

安装必要的软件
# yum install patchutils xmlto elfutils-libelf-devel elfutils-devel binutils-devel python-devel
# yum install asciidoc newt-devel perl-ExtUtils-Embed
# yum install audit-libs-devel bison hmaccalc
# yum install gcc rpm-build

# cd /root/rpmbuild/SPECS
# rpmbuild -bp kernel.spec


SCST打补丁

在modprobe scst_changer的时候,如果出现错误FATAL: Error inserting scst_changer: … Invalid argument, 可以通过查看/var/log/messages文件,看看错误在哪里。

# tail -f messages
......
Aug 14 16:10:57 mhvtl kernel: scst: ***ERROR***: Pass-through dev handlers (handler "dev_changer") not supported. Consider applying on your kernel patch scst_exec_req_fifo-<kernel-version>


从SCST网站上下载 scst-3.0.1.tar.bz2

解压scst-3.0.1.tar.bz2
# tar xvfj scst-3.0.1.tar.bz2

打补丁
# cd /root/rpmbuild/BUILD/kernel-2.6.32-504.el6/linux-2.6.32-504.el6.x86_64
# patch -p1 < /root/scst-3.0.1/kernel/scst_exec_req_fifo-2.6.32.patch
patching file block/blk-map.c
Hunk #2 succeeded at 275 (offset 3 lines).
patching file include/linux/blkdev.h
Hunk #1 succeeded at 695 (offset -13 lines).
Hunk #2 succeeded at 809 (offset -5 lines).
patching file include/linux/scatterlist.h
Hunk #2 succeeded at 223 (offset 4 lines).
patching file lib/scatterlist.c
Hunk #1 succeeded at 591 (offset 98 lines).

# cd /root/rpmbuild/BUILD/kernel-2.6.32-504.el6/linux-2.6.32-504.el6.x86_64/block
# vi blk-map.c
397行
int res = 0; # 对res进行初始化,否则,编译不通过


替换驱动

从SCST网站上下载 qla2x00t-3.0.1.tar.bz2

解压qla2x00t-3.0.1.tar.bz2
# tar xvfj qla2x00t-3.0.1.tar.bz2
将原有的kernel source自带的qla2xxx目录改名保存
# cd /root/rpmbuild/BUILD/kernel-2.6.32-504.el6/linux-2.6.32-504.el6.x86_64/drivers/scsi
# mv qla2xxx/ qla2xxx.bak
创建链接,替换驱动
# ln -s /root/qla2x00t-3.0.1 qla2xxx


配置内核

# yum install ncurses ncurses-devel
# cd /root/rpmbuild/BUILD/kernel-2.6.32-504.el6/linux-2.6.32-504.el6.x86_64
# cp .config config.bak
# make menuconfig


选择菜单: “Device Drivers -> SCSI device support,采用默认配置即可。



比较内核配置的前后差异
# diff .config config.bak
diff .config config.bak
4c4
< # Fri Aug 14 13:29:52 2015
---
> # Fri Aug 14 13:05:49 2015
1475d1474
< CONFIG_SCSI_QLA2XXX_TARGET=y

内核版本,增加扩展版本号
# vi Makefile
EXTRAVERSION = -504-scst
编译
# make
# make modules
# mkdir -p /lib/modules/2.6.32-504-scst
# make modules_install
# make install
编译完毕后重启
# reboot
在GRUB启动界面,选择新内核,启动系统。


查看qla2xxx驱动模块信息

# modinfo qla2xxx
......
parm:           qlini_mode:Determines when initiator mode will be enabled. Possible values: "exclusive" (default) - initiator mode will be enabled on load, disabled on enabling target mode and then on disabling target mode enabled back; "disabled" - initiator mode will never be enabled; "enabled" - initiator mode will always stay enabled. (charp)
......

有qlini_mode参数,允许选择target mode
设置为exclusive 和 enabled,处于initiator模式;
设置为disabled,处于Target模式

装载模块
# modprobe qla2xxx
查看模块的参数设置
# systool -m qla2xxx -v
......
qlini_mode          = "exclusive"   # 处于initiator模式
......
卸载模式
# modprobe -r qla2xxx


设置qla2xxx驱动处理target模式

编辑qla2xxx.conf
# vi qla2xxx.conf
options qla2xxx qlini_mode=disabled
装载模块
# modprobe qla2xxx
查看模块的参数设置
# systool -m qla2xxx -v
......
qlini_mode          = "disabled"    # 处于target模式
......


安装SCST

安装介质: scst-3.0.1.tar.bz2

# tar xvfj scst-3.0.1.tar.bz2
# cd scst-3.0.1
# make all
# make install
安装完成后,可以看到SCST生成的内核模块
# ls -l /lib/modules/`uname -r`/extra
drwxr-xr-x. 2 root root    4096 Aug  7 21:43 dev_handlers
-rw-r--r--. 1 root root 4180135 Aug  7 21:43 scst.ko
# ls -l /lib/modules/`uname -r`/extra/dev_handlers
-rw-r--r--. 1 root root 291902 Aug  7 21:43 scst_cdrom.ko
-rw-r--r--. 1 root root 282334 Aug  7 21:43 scst_changer.ko
-rw-r--r--. 1 root root 295411 Aug  7 21:43 scst_disk.ko
-rw-r--r--. 1 root root 295494 Aug  7 21:43 scst_modisk.ko
-rw-r--r--. 1 root root 282358 Aug  7 21:43 scst_processor.ko
-rw-r--r--. 1 root root 282286 Aug  7 21:43 scst_raid.ko
-rw-r--r--. 1 root root 301992 Aug  7 21:43 scst_tape.ko
-rw-r--r--. 1 root root 628155 Aug  7 21:43 scst_user.ko
-rw-r--r--. 1 root root 909397 Aug  7 21:43 scst_vdisk.ko


安装qla2x00t

安装介质:qla2x00t-3.0.1.tar.bz2

# tar xvfj qla2x00t-3.0.1.tar.bz2
# cd qla2x00t-3.0.1
# cd qla2x00-target
修改SCST的include和src文件的路径
# vi Makefile
SCST_INC_DIR := $(shell if [ -e "$$PWD/../../scst" ];                   \
then echo "$$PWD/../../scst-3.0.1/include";                   \
else echo "$(DESTDIR)$(PREFIX)/include/scst"; fi)
SCST_DIR := $(shell if [ -e "$$PWD/../../scst-3.0.1" ];                 \
then echo "$$PWD/../../scst-3.0.1/src";                     \
else echo "$(DESTDIR)$(PREFIX)/include/scst"; fi)
# make
# make install


安装mhVTL

安装依赖包

# yum install mtx mt-st lsscsi zlib-devel lzo-devel


mhVTL内核部分安装

# tar xvfz mhvtl-2015-04-14.tgz
# cd mhvtl-1.5/
# cd kernel
# make
# make install


mhVTL用户空间部分安装

创建用户以及组

# groupadd vtl
# useradd -g vtl vtl


mhVTL的目录说明:

/etc/mhvtl 配置文件路径

/opt/mhvtl 虚拟带库存储路径

安装mhVTL

# cd mhvtl-1.5
# make
# make install

# chown -R vtl:vtl /opt/mhvtl
这一步是必需的,要不然,启动mhvtl的时候,会报make_vtl_media failed.的错误

# /etc/init.d/mhvtl start
启动mhVTL的后台进程


查看虚拟带库信息

# lsscsi -g
[2:0:0:0]    disk    ATA      ST3500413AS      HP63  /dev/sda   /dev/sg0
[8:0:0:0]    mediumx STK      L700             0105  /dev/sch0  /dev/sg9
[8:0:1:0]    tape    IBM      ULT3580-TD5      0105  /dev/st0   /dev/sg1
[8:0:2:0]    tape    IBM      ULT3580-TD5      0105  /dev/st1   /dev/sg2
[8:0:3:0]    tape    IBM      ULT3580-TD4      0105  /dev/st2   /dev/sg3
[8:0:4:0]    tape    IBM      ULT3580-TD4      0105  /dev/st3   /dev/sg4
[8:0:8:0]    mediumx STK      L80              0105  /dev/sch1  /dev/sg10
[8:0:9:0]    tape    STK      T10000B          0105  /dev/st4   /dev/sg5
[8:0:10:0]   tape    STK      T10000B          0105  /dev/st5   /dev/sg6
[8:0:11:0]   tape    STK      T10000B          0105  /dev/st6   /dev/sg7
[8:0:12:0]   tape    STK      T10000B          0105  /dev/st7   /dev/sg8


配置SCST

装载驱动模块

# modprobe scst
# modprobe scst_changer
# modprobe scst_tape

# modprobe qla2xxx
# modprobe qla2x00tgt
查看系统日志
# /var/log
# tail -f messages
......
Aug 14 19:20:21 mhvtl kernel: qla2x00t: Initializing QLogic Fibre Channel HBA Driver target mode addon version 3.0.1
Aug 14 19:20:21 mhvtl kernel: scst: Target **21:00:00:1b:32:15:b0:31** for template qla2x00t registered successfully
Aug 14 19:20:21 mhvtl kernel: qla2x00t(0): using 64 Bit PCI addressing
Aug 14 19:20:21 mhvtl kernel: scst: Target **21:01:00:1b:32:35:b0:31** for template qla2x00t registered successfully
Aug 14 19:20:21 mhvtl kernel: qla2x00t(1): using 64 Bit PCI addressing
Aug 14 19:20:21 mhvtl kernel: qla2x00t: Target mode driver for QLogic 2x00 controller registered successfully
Aug 14 19:20:21 mhvtl kernel: scst: Target template qla2x00t registered successfully


此时,就可以在SAN网络的其他主机上能够看到输出的SCSI设备。(客户机可能需要重新启动,或是重新扫描硬件)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: