ページ

2016年3月17日木曜日

SRP でストレージに接続する (SRP Initiator)

前回の SRP のストレージを作る (SRP Target) で構築したストレージに接続する側 (SRP Initiator) のセットアップを行います。
こちらも CentOS 7 で、HCA として Mellanox ConnectX-2 VPI (Single Port) を使用します。

Infiniband のセットアップ

Infiniband のドライバやユーティリティ等には以下のような選択肢がありますが、今回は Mellanox OFED (Rev 3.0-2.0.1) をインストールすることにします。
  1. rpm パッケージ
  2. OFED (Open Fabrics Enterprise Distribution)
  3. Mellanox OFED (Mellanox 版の OFED)
Rev 3.0-2.0.1 は CentOS 7 及び 7.1 をサポートしているのですが、kernel バージョンはデフォルトの 3.10.0-229.el7 が対象になっています。そのため、yum 等で kernel をアップデートしてからインストールした場合、kernel のバージョン不一致により、一部 kernel にビルトインの Infiniband モジュールの方が有効となり不整合が起きてしまいます。
Mellanox OFED には、現在の kernel バージョンに合わせて Mellanox OFED をビルドするスクリプト mlnx_add_kernel_support.sh が用意されていますので、これでアップデート後の kernel バージョンに適合するように再ビルドする必要があります。

まずは必要なパッケージのインストールです。
$ sudo yum install perl pciutils python gcc-gfortran libxml2-python tcsh
$ sudo yum install libnl.i686 libnl expat glib2 tcl libstdc++ bc tk gtk2 atk cairo numactl pkgconfig
$ sudo yum install kernel-devel python-devel redhat-rpm-config rpm-build
mlnx_add_kernel_support.sh でビルドします。
kernel は 3.10.0-229.11.1.el7 にアップデート済みです。
デフォルトでは /tmp にログとともに出力されますが、ここでは $HOME に出力することにします。
$ sudo ./mlnx_add_kernel_support.sh -m /home/user01/MLNX_OFED_LINUX-3.0-2.0.1-rhel7.1-x86_64 -t /home/user01
Note: This program will create MLNX_OFED_LINUX TGZ for rhel7.1 under /home/user01 directory.
      All Mellanox, OEM, OFED, or Distribution IB packages will be removed.
Do you want to continue?[y/N]:y
See log file /home/user01/mlnx_ofed_iso.12896.log

Building OFED RPMs. Please wait...
Created /home/user01/MLNX_OFED_LINUX-3.0-2.0.1-rhel7.1-x86_64-ext.tgz
作成された MLNX_OFED_LINUX-3.0-2.0.1-rhel7.1-x86_64-ext.tgz を展開して、現在の kernerl バージョン (3.10.0-229.11.1.el7) に対応していることを確認します。
$ tar zxf MLNX_OFED_LINUX-3.0-2.0.1-rhel7.1-x86_64-ext.tgz
$ cd MLNX_OFED_LINUX-3.0-2.0.1-rhel7.1-x86_64-ext/
$ ls
added_kernels  firmware                    mlnx_fw_updater.pl  RPM-GPG-KEY-Mellanox  supported_kernels
distro         mlnx_add_kernel_support.sh  mlnxofedinstall     RPMS                  uninstall.sh
docs           mlnx_create_yum_repo.sh     repodata            src                   utils

$ cat added_kernels
3.10.0-229.11.1.el7.x86_64
インストールします。
一緒に Firmware のアップデートも試行されますが、今回使用した HCA は Mellanox 純正ではなく、OEM のため失敗します。これは無視してかまいません。
$ sudo ./mlnxofedinstall
Logs dir: /tmp/MLNX_OFED_LINUX-3.0-2.0.1.9042.logs
This program will install the MLNX_OFED_LINUX package on your machine.
Note that all other Mellanox, OEM, OFED, or Distribution IB packages will be removed.
Do you want to continue?[y/N]:y


Starting MLNX_OFED_LINUX-3.0-2.0.1 installation ...

...
...

Installation finished successfully.

Attempting to perform Firmware update...
//(以下省略)
//HCA が OEM の場合は、ここで Firmware のアップデートはできない。
インストールが完了したら、テストユーティリティで HCA をチェックしてみましょう。
$ sudo hca_self_test.ofed

---- Performing Adapter Device Self Test ----
Number of CAs Detected ................. 1
PCI Device Check ....................... PASS
Kernel Arch ............................ x86_64
Host Driver Version .................... MLNX_OFED_LINUX-3.0-2.0.1 (OFED-3.0-2.0.0): modules
Host Driver RPM Check .................. PASS
Firmware on CA #0 HCA .................. v2.9.1000
Firmware Check on CA #0 (HCA) .......... NA
    REASON: NO required fw version
Host Driver Initialization ............. PASS
Number of CA Ports Active .............. 0
Port State of Port #1 on CA #0 (HCA)..... DOWN (InfiniBand)
Error Counter Check on CA #0 (HCA)...... PASS
Kernel Syslog Check .................... PASS
Node GUID on CA #0 (HCA) ............... 00:02:c9:03:00:0f:81:e0
------------------ DONE ---------------------

Infiniband 関連のモジュールを有効にするためには、openibd サービスを起動します。
事前に openib.conf を変更して、SRP モジュールも有効にしておきます。
$ sudo vi /etc/infiniband/openib.conf

# Load SRP module
SRP_LOAD=yes
openibd サービスは既に有効化されているので、systemctl または OS リブートで起動します。
$ sudo systemctl start openibd
Infiniband ファブリックには Subnet Manager が 1つは存在している必要がありますが、今回は ストレージ側で Subnet Manager を稼働させていますので、Subnet Manager (opensmd) は起動させません。
Mellanox OFED の opensmd は、systemd に対応していないので、systemctl ではなく従来の chkconfig で設定を行います。(chkconfig opensmd off で無効化する)

これで Infiniband のセットアップが終わりました。
QSFP ケーブルを接続して、Link 状態を確認してみます。
$ ibstatus
Infiniband device 'mlx4_0' port 1 status:
        default gid:     fe80:0000:0000:0000:0002:c903:000f:81e1
        base lid:        0x2
        sm lid:          0x1
        state:           4: ACTIVE
        phys state:      5: LinkUp
        rate:            40 Gb/sec (4X QDR)
        link_layer:      InfiniBand
QDR 40Gb/s で Link Up しました。

SRP Initiator

次は SRP でストレージ (SRP Target) にアクセスします。
SRP Target への接続には、Mellanox OFED の srp_daemon を使います。
srp_daemon は Inifiniband ファブリックで定期的に SRP Target を探索し、見つかったら接続します。

テストのため、デーモンとしてではなく 1度のみ実行するには、-o を付けます。
//-i = Infinibandデバイス名  -p = HCAポート番号 
$ sudo srp_daemon -o -e -i mlx4_0 -p 1
Mellanox OFED の srpd サービスを有効にすると、OS 起動時に srp_daemon をデーモンとして起動し、SRP Target に自動的に接続します。以後は定期的 (デフォルトでは 60秒ごと) に SRP Target を探索します。

srpd サービスは、systemd ではなく chkconfig で設定となり、起動スクリプトは /etc/rc.d/init.d/srpd です。
このスクリプトで /usr/sbin/srp_daemon.sh が実行され、そこから srp_daemon が実行されます。
(ステータスは systemctl で参照可能)
$ sudo systemctl status srpd.service
srpd.service - LSB: Starts and stops the InfiniBand SRP client service
   Loaded: loaded (/etc/rc.d/init.d/srpd)
   Active: active (running) since Sun 2015-10-18 20:09:59 JST; 1s ago
  Process: 3113 ExecStop=/etc/rc.d/init.d/srpd stop (code=exited, status=0/SUCCESS)
  Process: 3309 ExecStart=/etc/rc.d/init.d/srpd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/srpd.service
           ├─3313 /bin/bash /usr/sbin/srp_daemon.sh
           └─3316 /usr/sbin/srp_daemon -e -c -n -i mlx4_0 -p 1 -R 60
上記を見ると、srp_daemon が -n を付けて実行されているのがわかります。
-n は SRP Initiator から SRP Target へ接続する時に、拡張オプション (initiator_ext) を使用することを示します。(Mellanox OFED での推奨)
これは、認証要求 SRP_LOGIN_REQ に使われる PortID のフォーマットを、
"接続先 SRP Target の Port GUID を Byte 単位で逆に並べた値 (8byte)" + "SRP Initiator 側の Port GUID (8byte)"
の形にします。
今回のシステムでは、
  • 接続先 SRP Target の Port GUID ... 0x0002c903000f826d
  • 接続元 SRP Initiator の Port GUID ... 0x0002c903000f81e1
ですから、"6d820f0003c90200" + "0002c903000f81e1" ということになります。
SRP Target 側の ACL では、このことを考慮した設定が必要です。

SRP Target に接続すると、Target 側で割り当てた LUN が、SCSI デバイスとして認識されます。
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: ADATA SP600      Rev: 5.8                   //ローカルのSSD
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi6 Channel: 00 Id: 00 Lun: 00
  Vendor: LIO-ORG  Model: BSBLK01          Rev: 4.0                   //LIOで割り当てたLUN
  Type:   Direct-Access                    ANSI  SCSI revision: 05
これで普通のローカルデバイスと同様に利用できるようになりました。
後はこのブロックデバイスに parted 等でパーティションを作成し、ファイルシステムにマウントします。

0 件のコメント:

コメントを投稿