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(左)をファイバーケーブルで繋げる。
高速なHDDがリモートに存在している感じ。
カードを装着後の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ポートなので帯域的には十分なのかな。
Qlogicさんから提供されている管理ツール。単に中古品の状態を確認したいが故にインストール。
ダウンロード画面で「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で接続しているようだ。
Generic SCSI Target Subsystem for Linuxと言うそうな。以下その中の記事を参考にしました。
http://scst.sourceforge.net/qla2x00t-howto.html
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が書かれているのみたい。個別ファイルの取得、フォルダ名の修正らを行えば
コンパイルできそうだが、、、
OS側でFCカードが認識しているなら、qla2xxxモジュールは既にロードされている。このモジュールを外して、
ブート時に読み込ませないようにブラックリスト /etc/modprobe.d/blacklist.conf に加えておく。
echo blacklist qla2xxx >> /etc/modprobe.d/blacklist.conf
*バックアップとして /etc/modprobe.d/blacklist.con_ などファイルを残すと modprobe の際「WARNING」が発生します
*これからが分かれ目みたい
もし、
らを使うならカーネル再構築(scstのパッチ込)が必要で、使わないのなら取得したscstのコンパイルで作成されるカーネルモジュールの
組み込みだけで完了みたい。[SCSI pass-through]がどんなもので、何の時に必要なのか。[the iSCSI zero-copy optimization]も
同様にいつ必要なのか中身を良く知らないので判断つかない。
まぁー取敢えず「使う」を前提に進める。「使わない」のならここをスキップ
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 を調整して再起動さも構いません。
*スキップ区間終了
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ファイル)がインストールされます。
次に、同じくカーネルモジュールの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 がインストールされます。
*くどくど書いてるが、ここでコンパイルエラーが発生して原因が全く分からない時期があったので、メモとして。
cd /root/scst/scstadmin
make; make install
/usr/local/sbinに scstadmin が作られます。
加えて/etc/init.d/scstも作られます。自動起動もできそう。
事前に
lsmod | grep "qla\|scst"
にて、既にロードされているかを確認して、されていなければ
modprobeコマンドを使って
modprobe scst
modprobe scst_disk
modprobe scst_vdisk
modprobe scst_user
modprobe qla2x00tgt
modprobe qla2xxx_scst
にて行う。
*取り外しは rmmod scst とか。
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に代わったことを確認します
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     Value     Writable      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が運用されることになる。