Qlogic QLE2462

20120620 linux-3.4.3で構築 scstに3.4へのパッチがあったので

Qlogic QLE2462 PCI Express(1.0a, 1.0, 1.1対応) x4(レーン)な4Gbps * 2 Fibre Channelカード。2005年頃の製品らしい。
こいつをCentOS6.x(x64)LinuxBoxに付けてFC-Target(scst)にさせてみた。
下図のようにFC-Target(右)を作って、FC-Initiator(左)をファイバーケーブルで繋げる。
2012y12m21d_014141099.png
高速なHDDがリモートに存在している感じ。

(旧)QLA2340

dmesg

カードを装着後のdmesgは下記のように表示される

QLogic Fibre Channel HBA Driver: 8.03.07.05.06.2-k
qla2xxx 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
qla2xxx 0000:01:00.0: Found an ISP2432, irq 16, iobase 0xffffc900057bc000
 alloc irq_desc for 27 on node -1
 alloc kstat_irqs on node -1
qla2xxx 0000:01:00.0: irq 27 for MSI/MSI-X
qla2xxx 0000:01:00.0: Configuring PCI space...
qla2xxx 0000:01:00.0: setting latency timer to 64
qla2xxx 0000:01:00.0: Configure NVRAM parameters...
qla2xxx 0000:01:00.0: Verifying loaded RISC code...
qla2xxx 0000:01:00.0: firmware: requesting ql2400_fw.bin
qla2xxx 0000:01:00.0: FW: Loading via request-firmware...
qla2xxx 0000:01:00.0: Allocated (64 KB) for EFT...
qla2xxx 0000:01:00.0: Allocated (1285 KB) for firmware dump...
qla2xxx 0000:01:00.0:
QLogic Fibre Channel HBA Driver: 8.03.07.05.06.2-k
 QLogic QLE2462 - QLogic 4GB FC Dual-Port PCI-E HBA for IBM System x
 ISP2432: PCIe (2.5GT/s x4) @ 0000:01:00.0 hdma+, host#=6, fw=5.06.02 (9496)
 alloc irq_desc for 17 on node -1
 alloc kstat_irqs on node -1
qla2xxx 0000:01:00.1: PCI INT B -> GSI 17 (level, low) -> IRQ 17

PCIe第一世代は1レーンあたりデータ転送速度2.5Gbpsで、8b/10bエンコードなので250MB/sとなる。
っでそれが x4レーン だから 2.5Gbps x4 = 10Gbps(1000MB/s)。4GbpsFCが2ポートなので帯域的には十分なのかな。

QConvergeConsole CLI

Qlogicさんから提供されている管理ツール。単に中古品の状態を確認したいが故にインストール。
2012y06m09d_184939003.png
ダウンロード画面で「qle2462 Linux Red Hat 64-bit」にて検索して、QConvergeConsoleCLI(x64)を取得します。
ダウンロード時はVersion: 1.0.1 build 32であった(QConvergeConsoleCLI-1.0.01-32.x86_64.rpm.gz)
*「FC-FCoE DD-Kit for RHEL」はOSインストール時に使用する追加ドライバー
*「FC-FCoE Driver for RHEL」はカーネル再構築の時に使えるドライバー(.koファイル)
*「Multi-boot image for 4Gb Adapters」は最新のBIOS, FCode, EFI, Firmwareらの詰め合わせセット

これを解凍してインストール
  gzip -d QConvergeConsoleCLI-1.0.01-32.x86_64.rpm.gz
  rpm -qlp ./QConvergeConsoleCLI-1.0.01-32.x86_64.rpm *中身の確認
  rpm -Uvh QConvergeConsoleCLI-1.0.01-32.x86_64.rpm
っで、状態確認
  /opt/QLogic_Corporation/QConvergeConsoleCLI/scli -i

BIOS Version                   : 1.28
Running Firmware Version       : 5.06.02 (9496)
Flash BIOS Version             : 1.28
Flash FCode Version            : 1.24
Flash EFI Version              : 1.08
Flash Firmware Version         : 4.00.26

な状態であった。最新のBIOS詰め合わせセット(Multi-boot image for 4Gb Adapters Version: 1.94)らを確認すると
BIOS 3.00、FCode 3.15、EFI 2.21、Firmware 5.04.01であった。いずれ更新予定
加え、PCIeとの接続状況は

PCIe Max Bus Width             : x4
PCIe Negotiated Width          : x4
PCIe Max Bus Speed             : 2.5 Gbps
PCIe Negotiated Speed          : 2.5 Gbps

と一応x4で接続しているようだ。

SCST

Generic SCSI Target Subsystem for Linuxと言うそうな。以下その中の記事を参考にしました。
    http://scst.sourceforge.net/qla2x00t-howto.html

firmware

CentOSでは既にyumで/lib/firmwareにql2400_fw.binが ql2400-firmware.noarch でインストールされていた。
ftp://ftp.qlogic.com/outgoing/linux/firmwareに最新版があるようだが、このままで。

開発環境

既に yum groupinstall "Development tools" で必要な環境はそろっているが、追加で以下のものが必要らしい。
  yum install gcc ncurses-devel kernel-devel lsscsi patch subversion
このうち実際には lsscsiとncurses-devel がインストール。

ソース取得

subversion を使って
  cd /root
  svn co https://scst.svn.sourceforge.net/svnroot/scst/trunk scst
で最新ソースを取得した。scst、scstadmin、qla2x00tらが混在している。
  *sourceforgeさんから個別にも得られるが、makeの際ヘッダーファイルが足りないなどでエラーがでる。
  どうもsubversion で取得したソース向けにMakefileが書かれているのみたい。個別ファイルの取得、フォルダ名の修正らを行えば
  コンパイルできそうだが、、、

qla2xxxカーネルモジュールの除去

OS側でFCカードが認識しているなら、qla2xxxモジュールは既にロードされている。このモジュールを外して、
ブート時に読み込ませないようにブラックリスト /etc/modprobe.d/blacklist.conf に加えておく。
  echo blacklist qla2xxx >> /etc/modprobe.d/blacklist.conf
*バックアップとして /etc/modprobe.d/blacklist.con_ などファイルを残すと modprobe の際「WARNING」が発生します

*これからが分かれ目みたい
もし、

  • SCSI pass-through
  • the iSCSI zero-copy optimization

らを使うならカーネル再構築(scstのパッチ込)が必要で、使わないのなら取得したscstのコンパイルで作成されるカーネルモジュールの
組み込みだけで完了みたい。[SCSI pass-through]がどんなもので、何の時に必要なのか。[the iSCSI zero-copy optimization]も
同様にいつ必要なのか中身を良く知らないので判断つかない。
まぁー取敢えず「使う」を前提に進める。「使わない」のならここをスキップ

kernel再構築 with scst-patch

CentOS6.xのカーネルは 2.6.32 である。netatalkのappke.koを作ったようにSRPMからの再構築でもいいのだろうが、その辺には暗いので却下。
*20120620のscstにkernel3.4向けのpatchがあったので、この時点の最新版3.4.3にて再構築
  cd /usr/src
  wget ftp://ftp.riken.jp/Linux/kernel.org/linux/kernel/v3.x/linux-3.4.3.tar.bz2
  bzip2 -cd linux-3.4.3.tar.bz2 | tar xf -
  cd linux-3.4.3
  patch -p1 < /root/scst/scst/kernel/scst_exec_req_fifo-3.4.patch *多少ずれるが適用成功
  cp ../kernels/`uname -r`/.config . *2.6.32-220.23.1.el6.x86_64 の.configを拝借
  make oldconfig *linux-2.6.32の.configの設定内容を踏襲。新規部分は既定値としたいので問われたらリターン
  make menuconfig *微調整
    [General setup]->[Enable deprecated sysfs features to support old userspace tools]を選択
    [Processor type and features]->[Processor family]->[Core 2/newer Xeon]を選択
  vi Makefile
    EXTRAVERSION =-scst *目印として
  time (make clean; make bzImage; make modules; make modules_install; make install) 2>&1 | tee kernel.out *紅茶タイム開始
終わったら再起動を実施して、このカーネルで起動させます。
/boot/grub/grub.conf を調整して再起動さも構いません。

*スキップ区間終了

scstカーネルモジュール

subversion で取得したソースのコンパイルモードを「release」にします。デバックモードが標準らしい。
  cd /root/scst
  make 2release
その後にscstのフォルダに移り、scstのカーネルモジュールを作成します。
  cd scst/src
    前項目「kernel再構築 with scst-patch」をスキップしたなら、追加で
    下記コンパイル作業の前に一部ソースの修正が必須です
    内容:dev_handlers/scst_vdisk.cの622と623行をコメントアウト
        //if (virt_dev->wt_flag && !virt_dev->nv_cache)
        //    open_flags |= O_DSYNC;
    ここまで
  make all
  make install
これで/lib/modules/`uname -r`/extraにscst.ko、/lib/modules/`uname -r`/extra/dev_handlersに
各種関連scstモジュール(.koファイル)がインストールされます。

  • scst.ko - SCST itself.
  • scst_disk.ko - device handler for disks (type 0).
  • scst_tape.ko - device handler for tapes (type 1).
  • scst_processor.ko - device handler for processors (type 3).
  • scst_cdrom.ko - device handler for CDROMs (type 5).
  • scst_modisk.ko - device handler for MO disks (type 7).
  • scst_changer.ko - device handler for medium changers (type 8).
  • scst_raid.ko - device handler for storage array controller (e.g. raid) (type C).
  • scst_vdisk.ko - device handler for virtual disks (file, device or ISO CD image)..
  • scst_user.ko - user space device handler.

次に、同じくカーネルモジュールのQLogic target driverを作成します
  cd /root/scst
  BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y \
    make -s -C qla2x00t/qla2x00-target install
*実態は make BUILD_2X_MODULE=y CONFIG_SCSI_QLA2XXX_TARGET=y \
  SUBDIRS=/root/scst/qla2x00t/qla2x00-target/.. -C /root/scst/qla2x00t/qla2x00-target/.. all
っで、つまりは make BUILD_2X_MODULE=y CONFIG_SCSI_QLA2XXX_TARGET=y \
  SUBDIRS=/root/scst/qla2x00t -C /root/scst/qla2x00t allと同義であって、
それで、引き続きmake -C /lib/modules/3.2.0-scst01/build SUBDIRS=/root/scst/qla2x00t BUILD_INI=mを実行している
ちなみに/lib/modules/3.2.0-scst01/build/usr/src/linux-3.2である。

/lib/modules/3.2.0-scst01/build -> /usr/src/linux-3.2

これで/lib/modules/`uname -r`/extraに qla2x00tgt.ko と qla2xxx_scst.ko がインストールされます。
*くどくど書いてるが、ここでコンパイルエラーが発生して原因が全く分からない時期があったので、メモとして。

scst関連プログラムのインストール

  cd /root/scst/scstadmin
  make; make install
/usr/local/sbinに scstadmin が作られます。
加えて/etc/init.d/scstも作られます。自動起動もできそう。

scstカーネルモジュールの組み込み

事前に
  lsmod | grep "qla\|scst"
にて、既にロードされているかを確認して、されていなければ
modprobeコマンドを使って
  modprobe scst
  modprobe scst_disk
  modprobe scst_vdisk
  modprobe scst_user
  modprobe qla2x00tgt
  modprobe qla2xxx_scst
にて行う。
  *取り外しは rmmod scst とか。

ブート用RAMdiskの作成

blacklist.confとqla2xxx_scstが入ったimgを作成します。
  mv /boot/initramfs-`uname -r`.img /boot/initramfs-`uname -r`.im_.bk
  mkinitrd -f /boot/initramfs-$(uname -r).img $(uname -r)
もしくは
  /sbin/dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
こっちのdracutの方がinitramfsファイルのサイズは小さく作れます。

*zcat /boot/initramfs-3.2.19.img | cpio -i -c にて何がimgに入っているかを確認できます。
ここで再起動して、qla2xxxxが抜けてqla2xxx_scstに代わったことを確認します

SCST設定

iSCSIのtgtに似ています。まず定義ファイルのテンプレートを確認
  scstadmin -write_config /etc/scst.conf
*scst関連のモジュールが入っていないとエラーになります。
/etc/scst.confの中身:

# Automatically generated by SCST Configurator v3.0.0-pre1.
TARGET_DRIVER qla2x00t {
       TARGET 21:00:00:1b:32:81:49:f7 {
               HW_TARGET
               cpu_mask ff
               enabled 0
       }
       TARGET 21:01:00:1b:32:a1:49:f7 {
               HW_TARGET
               cpu_mask ff
               enabled 0
       }
}

scstadminでFCとして供するディスクやファイルを定義するとこのファイルに設定内容が書かれる。
っで、FCのデバイスは、
  ファイル(dd if=/dev/zero of=/mnt/fc/disk01.img bs=1024k count=512) *大体500MB

  パーティション(/dev/sdb1)
の2つを設定してみます。

まずはデバイスを定義します
ファイル:
 scstadmin -open_dev disk01 -handler vdisk_fileio -attributes filename=/mnt/fc/hdd.img
    Collecting current configuration: done.
    -> Making requested changes.
     -> Opening device 'DISK01' using handler 'vdisk_fileio': done.
     -> Done.
    All done.

パーティション:
 scstadmin -open_dev disk02 -handler vdisk_blockio -attributes filename=/dev/sdb1
    Collecting current configuration: done.
    -> Making requested changes.
     -> Opening device 'disk02' using handler 'vdisk_blockio': done.
     -> Done.
    All done.

使えるhandlerは、scstadmin -list_handlerにて一覧が取得できます。

[root@c ~]# scstadmin -list_handler
Collecting current configuration: done.
       Handler
       -------------
       scst_user
       dev_disk_perf
       vcdrom
       dev_disk
       vdisk_fileio
       vdisk_blockio
       vdisk_nullio
All done.
[root@c ~]#

加え、各handlerで使用可能な属性attributesは、scstadmin -list_hnd_attr <handler>で取得可能です

[root@c7 ~]# scstadmin -list_hnd_attr vdisk_blockio
Collecting current configuration: done.
 Attribute &#160; &#160; Value &#160; &#160; Writable &#160; &#160; &#160;KEY
 -----------------------------------------
 (none)
 Device CREATE attributes available
 ----------------------------------
 blocksize
 write_through
 rotational
 nv_cache
 thin_provisioned
 filename
 removable
 read_only
All done.
[root@c7 ~]#

複数の属性値を持たせたい場合は「-attributes filename=/dev/sdb1,blocksize=1024,nv_cache=1,removable=0」とで指定します。
作ったデバイスを削除するには
  scstadmin -close_dev disk01 -handler vdisk_fileio
  scstadmin -close_dev disk02 -handler vdisk_blockio
とします。

作ったこの2つのデバイスを1つのターゲットにぶら下げます。
ファイル:
 scstadmin -add_lun 0 -driver qla2x00t -target 21:00:00:1b:32:81:49:f7 -device disk01
    Collecting current configuration: done.
    -> Making requested changes.
     -> Adding device 'disk01' at LUN 0 to driver/target 'qla2x00t/21:00:00:1b:32:81:49:f7': done.
     -> Issuing LIP on fibre channel driver/target 'qla2x00t/21:00:00:1b:32:81:49:f7' (host6): done.
     -> Done.
    All done.

パーティション:
 scstadmin -add_lun 1 -driver qla2x00t -target 21:00:00:1b:32:81:49:f7 -device disk02
    Collecting current configuration: done.
    -> Making requested changes.
     -> Adding device 'disk02' at LUN 1 to driver/target 'qla2x00t/21:00:00:1b:32:81:49:f7': done.
     -> Issuing LIP on fibre channel driver/target 'qla2x00t/21:00:00:1b:32:81:49:f7' (host6): done.
     -> Done.
    All done.

連携を解除するには
scstadmin -add_lun 0 -driver qla2x00t -target 21:00:00:1b:32:81:49:f7 -device disk01
scstadmin -add_lun 1 -driver qla2x00t -target 21:00:00:1b:32:81:49:f7 -device disk02
とする。

他(デバイス/ターゲット)のグループを作成するなどがあるみたいだが、どのような状況でそれが必要になるのか
分からないので未着手。マルチパスI/Oという言葉が闊歩するお話なのかな?

っで、デバイスとターゲットを繋げたので、ここで公開。
 scstadmin -enable_target 21:00:00:1b:32:81:49:f7 -driver qla2x00t
    Collecting current configuration: done.
    -> Making requested changes.
     -> Enabling driver/target 'qla2x00t/21:00:00:1b:32:81:49:f7': done.
     -> Done.
    All done.
簡単に
echo "1" > /sys/kernel/scst_tgt/targets/qla2x00t/21:00:00:1b:32:81:49:f7/enabled
でもいいらしい。

停止するには
scstadmin -disable_target 21:00:00:1b:32:81:49:f7 -driver qla2x00t

っで、再度ここで/etc/scst.confを書き出して、/etc/init.d/scstを有効にすれば、再起動時に
自動的にFC-Targetが運用されることになる。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2012-12-21 (金) 01:42:10 (1702d)