***Qlogic QLE2462 [#p91f5cc5] 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(左)をファイバーケーブルで繋げる。 &ref(2012y12m21d_013347795.png,nolink,noborder); &ref(2012y12m21d_014141099.png,nolink,noborder); 高速なHDDがリモートに存在している感じ。 [[(旧)QLA2340>FC/QLA2340]] ***dmesg [#od4908b0] カードを装着後の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 [#ha0860ae] [[Qlogic>http://www.qlogic.com/Pages/default.aspx]]さんから提供されている管理ツール。単に中古品の状態を確認したいが故にインストール。 &ref(2012y06m09d_184939003.png); ダウンロード画面で「&color(green){''qle2462 Linux Red Hat 64-bit''};」にて検索して、QConvergeConsoleCLI(x64)を取得します。 ダウンロード時はVersion: 1.0.1 build 32であった(QConvergeConsoleCLI-1.0.01-32.x86_64.rpm.gz) &color(red){*};「FC-FCoE DD-Kit for RHEL」はOSインストール時に使用する追加ドライバー &color(red){*};「FC-FCoE Driver for RHEL」はカーネル再構築の時に使えるドライバー(.koファイル) &color(red){*};「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 &color(green){*中身の確認}; 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 [#f264390e] [[Generic SCSI Target Subsystem for Linux>http://scst.sourceforge.net]]と言うそうな。以下その中の記事を参考にしました。 http://scst.sourceforge.net/qla2x00t-howto.html ***firmware [#t27c3fd1] CentOSでは既にyumで/lib/firmwareに''ql2400_fw.bin''が ql2400-firmware.noarch でインストールされていた。 ftp://ftp.qlogic.com/outgoing/linux/firmwareに最新版があるようだが、このままで。 ***開発環境 [#i5ec7d09] 既に yum groupinstall "Development tools" で必要な環境はそろっているが、追加で以下のものが必要らしい。 yum install gcc ncurses-devel kernel-devel lsscsi patch subversion このうち実際には lsscsiとncurses-devel がインストール。 ***ソース取得 [#udf59261] subversion を使って cd /root svn co https://scst.svn.sourceforge.net/svnroot/scst/trunk scst で最新ソースを取得した。scst、scstadmin、qla2x00tらが混在している。 &color(green){*};[[sourceforgeさん>http://sourceforge.net/projects/scst/files/scst/]]から個別にも得られるが、makeの際ヘッダーファイルが足りないなどでエラーがでる。 どうもsubversion で取得したソース向けにMakefileが書かれているのみたい。個別ファイルの取得、フォルダ名の修正らを行えば コンパイルできそうだが、、、 ***qla2xxxカーネルモジュールの除去 [#ma843d68] OS側でFCカードが認識しているなら、qla2xxxモジュールは既にロードされている。このモジュールを外して、 ブート時に読み込ませないようにブラックリスト /etc/modprobe.d/blacklist.conf に加えておく。 echo blacklist qla2xxx >> /etc/modprobe.d/blacklist.conf &color(red){*};バックアップとして /etc/modprobe.d/blacklist.con_ などファイルを残すと modprobe の際「WARNING」が発生します &color(white,red){*これからが分かれ目みたい}; もし、 -SCSI pass-through -the iSCSI zero-copy optimization らを使うならカーネル再構築(scstのパッチ込)が必要で、使わないのなら取得したscstのコンパイルで作成されるカーネルモジュールの 組み込みだけで完了みたい。[SCSI pass-through]がどんなもので、何の時に必要なのか。[the iSCSI zero-copy optimization]も 同様にいつ必要なのか中身を良く知らないので判断つかない。 まぁー取敢えず「使う」を前提に進める。「使わない」のならここをスキップ ***kernel再構築 with scst-patch [#v6056e9b] CentOS6.xのカーネルは 2.6.32 である。netatalkのappke.koを作ったようにSRPMからの再構築でもいいのだろうが、その辺には暗いので却下。 &color(green){*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 &color(green){*多少ずれるが適用成功}; cp ../kernels/`uname -r`/.config . &color(green){*2.6.32-220.23.1.el6.x86_64 の.configを拝借}; make oldconfig &color(green){*linux-2.6.32の.configの設定内容を踏襲。新規部分は既定値としたいので問われたらリターン}; make menuconfig &color(green){*微調整}; &color(white,blue){[General setup]->[Enable deprecated sysfs features to support old userspace tools]};を選択 &color(white,blue){[Processor type and features]->[Processor family]->[Core 2/newer Xeon]};を選択 vi Makefile &color(white,blue){EXTRAVERSION =-scst}; &color(green){*目印として}; time (make clean; make bzImage; make modules; make modules_install; make install) 2>&1 | tee kernel.out &color(green){*紅茶タイム開始}; 終わったら&color(white,red){再起動};を実施して、このカーネルで起動させます。 /boot/grub/grub.conf を調整して再起動さも構いません。 &color(white,red){*スキップ区間終了}; ***scstカーネルモジュール [#fc9084f2] subversion で取得したソースのコンパイルモードを「release」にします。デバックモードが標準らしい。 cd /root/scst make 2release その後にscstのフォルダに移り、scstのカーネルモジュールを作成します。 cd scst/src &color(white,green){前項目「kernel再構築 with scst-patch」をスキップしたなら、追加で}; &color(green){下記コンパイル作業の前に一部ソースの修正が必須です}; &color(green){内容:dev_handlers/scst_vdisk.cの622と623行をコメントアウト}; //if (virt_dev->wt_flag && !virt_dev->nv_cache) // open_flags |= O_DSYNC; &color(white,green){ここまで}; 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 &color(green){*実態は make BUILD_2X_MODULE=y CONFIG_SCSI_QLA2XXX_TARGET=y \}; &color(green){SUBDIRS=/root/scst/qla2x00t/qla2x00-target/.. -C /root/scst/qla2x00t/qla2x00-target/.. all}; っで、つまりは&color(green){ make BUILD_2X_MODULE=y CONFIG_SCSI_QLA2XXX_TARGET=y \}; &color(green){SUBDIRS=/root/scst/qla2x00t -C /root/scst/qla2x00t all};と同義であって、 それで、引き続き&color(green){make -C /lib/modules/3.2.0-scst01/build SUBDIRS=/root/scst/qla2x00t BUILD_INI=m};を実行している ちなみに&color(green){/lib/modules/3.2.0-scst01/build};は&color(green){/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 がインストールされます。 &color(red){*};くどくど書いてるが、ここでコンパイルエラーが発生して原因が全く分からない時期があったので、メモとして。 ***scst関連プログラムのインストール [#ee2a1810] cd /root/scst/scstadmin make; make install /usr/local/sbinに scstadmin が作られます。 加えて/etc/init.d/scstも作られます。自動起動もできそう。 ***scstカーネルモジュールの組み込み [#hd68d0e8] 事前に lsmod | grep "qla\|scst" にて、既にロードされているかを確認して、されていなければ modprobeコマンドを使って modprobe scst modprobe scst_disk modprobe scst_vdisk modprobe scst_user modprobe qla2x00tgt modprobe qla2xxx_scst にて行う。 &color(red){*};取り外しは rmmod scst とか。 ***ブート用RAMdiskの作成 [#e3defc7b] 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ファイルのサイズは小さく作れます。 &color(red){*};zcat /boot/initramfs-3.2.19.img | cpio -i -c にて何がimgに入っているかを確認できます。 &color(green){ここで再起動して、qla2xxxxが抜けてqla2xxx_scstに代わったことを確認します}; **SCST設定 [#e21aa1b4] iSCSIのtgtに似ています。まず定義ファイルのテンプレートを確認 scstadmin -write_config /etc/scst.conf &color(red){*};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) &color(green){*大体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が運用されることになる。