12.5. Base RDMA サブシステムの設定

rdma サービスは自動で開始されます。InfiniBand でも iWARP でも RoCE/IBoE でも、RDMA 対応ハードウェアが検出されると、udevsystemdrdma サービスを開始するよう指示します。
~]# systemctl status rdma
● rdma.service - Initialize the iWARP/InfiniBand/RDMA stack in the kernel
   Loaded: loaded (/usr/lib/systemd/system/rdma.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: file:/etc/rdma/rdma.conf
ユーザーが rdma サービスを有効にする必要はありませんが、常時有効にしたい場合は、そうすることができます。これを行うには、root で以下のコマンドを入力します。
~]# systemctl enable rdma

12.5.1. rdma.conf ファイルの設定

rdma サービスは /etc/rdma/rdma.conf を読み込んで、管理者がデフォルトで読み込みたいカーネルレベルとユーザーレベルの RDMA プロトコルを判別します。このファイルを編集すると、様々なドライバーを有効、無効にできます。
以下のドライバーが有効、無効にできます。
  • IPoIB: IP ネットワークエミュレーション層で、InfiniBand ネットワークでの IP アプリケーションの実行を可能にします。
  • SRP: SCSI 要求プロトコルです。マシン上の SRP プロトコル経由でエクスポートされたリモートドライブまたはドライブアレイをまるでローカルのハードディスク上にあるかのようにマシンにマウントできるようになります。
  • SRPT: SRP プロトコルのターゲットモードもしくはサーバーモードです。これは、他のマシンにドライブもしくはドライブアレイをエクスポートするために必要なカーネルサポートを読み込みます。その他のマシンは、これらをまるでローカル上にあるかのようにマウントします。デバイスが実際にエクスポートされる前に、ターゲットモードのサポートの設定が必要になります。詳細は、targetd および targetcli パッケージの資料を参照してください。
  • ISER: Linux カーネルの iSCSI 層全般用の低レベルのドライバーで、iSCSI デバイスに InfiniBand ネットワークでのトランスポートを提供します。
  • RDS: Linux カーネル内の Reliable Datagram Service です。Red Hat Enterprise Linux 7 カーネル内では有効にされないため、読み込むことができません。

12.5.2. 70-persistent-ipoib.rules の使用

rdma パッケージは、/etc/udev.d/rules.d/70-persistent-ipoib.rules ファイルを提供します。この udev rules ファイルは、IPoIB デバイスを (ib0ib1 などの) デフォルト名からより記述的な名前に変更するために使用されます。デバイス名を変更するには、このファイルの編集が必要になります。まず、名前を変更する デバイスの GUID アドレスを見つけます。
~]$ ip link show ib0
8: ib0: >BROADCAST,MULTICAST,UP,LOWER_UP< mtu 65520 qdisc pfifo_fast state UP mode DEFAULT qlen 256
    link/infiniband 80:00:02:00:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a1 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
link/infiniband の直後には、IPoIB インターフェースの 20 バイトのハードウェアアドレスがあります。新規の名前作成に必要なのは、上記で太字表示となっている最後の 8 バイトのみです。ユーザーは好みに合わせて自由に命名スキームを作成できます。たとえば、mlx4 デバイスが ib0 サブネットファブリックに接続されている場合、mlx4_ib0 のような device_fabric 命名規則を使用します。唯一推奨されないのは、ib0ib1 といった標準名を使用することです。これらの名前は、カーネルが割り当てる自動的な名前と競合する場合があるからです。次に、rules ファイルにエントリーを追加します。既存の例を rules ファイルからコピーして、ATTR{address} エントリー内の 8 バイトを名前を変更するデバイスからの強調表示された 8 バイトで置き換えます。また、新規の名前を NAME フィールドに記入します。

12.5.3. ユーザーのメモリーロック制限解除

RDMA 通信では、コンピューター内の物理的メモリーを固定 (つまり、コンピューター全体で利用可能なメモリーが不足した場合に、カーネルはそのメモリーをページングファイルにスワップすることができない) する必要があります。メモリーの固定は通常、非常に限られた権限が必要となる操作です。root 以外のユーザーによる 大型 RDMA アプリケーションの実行を可能にするには、非 root ユーザーがシステムで固定を許されるメモリー量を増やす必要があります。これを行うには、/etc/security/limits.d/ ディレクトリー内に以下のようなコンテンツのファイルを追加します。
~]$ more /etc/security/limits.d/rdma.conf
# configuration for rdma tuning
*       soft    memlock         unlimited
*       hard    memlock         unlimited
# rdma tuning end

12.5.4. Mellanox カードのイーサネット用の設定

Mellanox の特定のハードウェアは、InfiniBand モードまたは Ethernet モードで実行できます。このようなカードのデフォルトは通常 InfiniBand です。カードを Ethernet モードに設定できます。モードの設定は、現在、ConnectX ファミリーハードウェア (mlx5 ドライバーまたは mlx4 ドライバーのいずれかを使用) でのみサポートされます。
Mellanox mlx5 カードを設定するには、mstflint パッケージの mstconfig プログラムを使用します。詳細は、Red Hat カスタマーポータルでナレッジベースの記事「Configuring Mellanox mlx5 cards in Red Hat Enterprise Linux 7」を参照してください。
Mellanox mlx4 カードを設定するには、「Configuring Mellanox mlx5 cards in Red Hat Enterprise Linux 7」で説明されているように、mstconfig を使用して、そのカードにポートの種類を設定します。mstconfig がお使いのカードをサポートしない場合は、/etc/rdma/mlx4.conf ファイルを編集し、そのファイルの手順に従って、RoCE/IBoE の使用に適したポートの種類を設定します。この場合も、initramfs を再構築して、更新したポート設定が initramfs にコピーされるようにする必要があります。
ポートタイプが設定されたら、1 つまたは両方の設定をイーサーネットに設定し、ポートタイプに設定するために mstconfig を使用しなかった場合は、ログに以下のようなメッセージが表示される場合があります。
mlx4_core 0000:05:00.0: Requested port type for port 1 is not supported on this HCA
これは正常なことで、操作に影響は出ません。ポートタイプを設定するスクリプトには、ドライバーがいつポート 2 を内部で要求されたタイプに切り替えたかを知るすべがありません。このため、スクリプトがポート 2 の切り替えを要求してから切り替え操作が完了するまでの間は、ポート 1 を異なるタイプに設定しようとしても拒否されます。スクリプトはコマンドが成功するか、ポートの切り替えが完了されないことを示すタイムアウトになるまで設定しようとします。

12.5.5. リモートの Linux SRP ターゲットへの接続

SCSI RDMA Protocol (SRP) は、システムが、別のシステムに接続されている SCSI デバイスにアクセスするために RDMA を使用できるようにするネットワークプロトコルです。SRP イニシエーターが、SRP ターゲット側で SRP ターゲットに接続するようにするには、そのイニシエーターで使用するホストチャンネルアダプター (HCA) ポートに、アクセスコントロールリスト (ACL) エントリーを追加する必要があります。
HCA ポートの ACL ID は固有ではありません。ACL IDは、HCA の GID 形式により異なります。同じドライバー (たとえば ib_qib) を使用する HCA では、GID の形式が同じである必要はありません。また、ACL ID は、接続要求を開始する方法により異なります。

リモートの Linux SRP ターゲットへの接続: 概要

  1. ターゲット側の準備:
    1. ストレージのバックエンドを作成します。たとえば、/dev/sdc1 パーティションを取得します。
      /> /backstores/block は vol1 /dev/sdc1 を作成します。
    2. SRP ターゲットを作成します。
      /> /srpt create 0xfe80000000000000001175000077dd7e
    3. ステップ A で作成したバックエンドに基づいた LUN を作成します。
      /> /srpt/ib.fe80000000000000001175000077dd7e/luns create /backstores/block/vol1
    4. リモートの SRP クライアントに Node ACL を作成します。
      /> /srpt/ib.fe80000000000000001175000077dd7e/acls create 0x7edd770000751100001175000077d708
      Node ACL は、srp_daemonibsrpdm で異なります。
  2. クライアントで、srp_daemon または ibsrpdm を使用して、SRP 接続を開始します。
    [root@initiator]# srp_daemon -e -n -i qib0 -p 1 -R 60 &
    [root@initiator]# ibsrpdm -c -d /dev/infiniband/umad0 > /sys/class/infiniband_srp/srp-qib0-1/add_target
  3. 任意です。lsscsidmesg などの複数のツールで、SRP 接続を検証することが推奨されます。

手順12.3 srp_daemon または ibsrpdm を使用して、リモートの Linux SRP ターゲットへの接続

  1. ターゲットで ibstat コマンドを実行して、State および Port GUID の値を確認します。HCA は Active ステータスになります。ACL ID は、ポート GUID に基づいています。
    [root@target]# ibstat
    CA 'qib0'
    	CA type: InfiniPath_QLE7342
    	Number of ports: 1
    	Firmware version:
    	Hardware version: 2
    	Node GUID: 0x001175000077dd7e
    	System image GUID: 0x001175000077dd7e
    	Port 1:
    		State: Active
    		Physical state: LinkUp
    		Rate: 40
    		Base lid: 1
    		LMC: 0
    		SM lid: 1
    		Capability mask: 0x0769086a
    		Port GUID: 0x001175000077dd7e
    		Link layer: InfiniBand
  2. SRP ターゲット ID を取得します。この ID は、HCA ポートの GUID に基づきます。SRP ターゲットのバックエンドとして、専用のディスクパーティションが必要です (/dev/sdc1 など)。次のコマンドは、デフォルトのプレフィックスを fe80 に置き換え、コロンを削除し、その残りの文字列に、新しいプレフィックスを追加します。
    [root@target]# ibstatus | grep '<default-gid>' | sed -e 's/<default-gid>://' -e 's/://g' | grep 001175000077dd7e
    fe80000000000000001175000077dd7e
  3. ブロックデバイスで LUN vol1 を作成する targetcli ツールを使用して、SRP ターゲットを作成し、LUN をエクスポートします。
    [root@target]# targetcli
    
    
    /> /backstores/block create vol1 /dev/sdc1
    Created block storage object vol1 using /dev/sdc1.
    /> /srpt create 0xfe80000000000000001175000077dd7e
    Created target ib.fe80000000000000001175000077dd7e.
    /> /srpt/ib.fe80000000000000001175000077dd7e/luns create /backstores/block/vol1
    Created LUN 0.
    /> ls /
    o- / ............................................................................. [...]
      o- backstores .................................................................. [...]
      | o- block ...................................................... [Storage Objects: 1]
      | | o- vol1 ............................... [/dev/sdc1 (77.8GiB) write-thru activated]
      | o- fileio ..................................................... [Storage Objects: 0]
      | o- pscsi ...................................................... [Storage Objects: 0]
      | o- ramdisk .................................................... [Storage Objects: 0]
      o- iscsi ................................................................ [Targets: 0]
      o- loopback ............................................................. [Targets: 0]
      o- srpt ................................................................. [Targets: 1]
        o- ib.fe80000000000000001175000077dd7e ............................... [no-gen-acls]
          o- acls ................................................................ [ACLs: 0]
          o- luns ................................................................ [LUNs: 1]
            o- lun0 ............................................... [block/vol1 (/dev/sdc1)]
    />
  4. イニシエーターで ibstat コマンドを実行して、ステータスが Active かどうかを確認して、ポートの GUID を決定します。
    [root@initiator]# ibstat
    CA 'qib0'
    	CA type: InfiniPath_QLE7342
    	Number of ports: 1
    	Firmware version:
    	Hardware version: 2
    	Node GUID: 0x001175000077d708
    	System image GUID: 0x001175000077d708
    	Port 1:
    		State: Active
    		Physical state: LinkUp
    		Rate: 40
    		Base lid: 2
    		LMC: 0
    		SM lid: 1
    		Capability mask: 0x07690868
    		Port GUID: 0x001175000077d708
    		Link layer: InfiniBand
  5. 以下のコマンドを使用して、リモートの SRP ターゲットに接続せずにスキャンします。ターゲットの GUID は、イニシエーターがリモートターゲットを検出したことを示します。ID 文字列は、リモートターゲットが Linux ソフトウェアターゲット (ib_srpt.ko) であることを示しています。
    [root@initiator]# srp_daemon -a -o
    IO Unit Info:
        port LID:        0001
        port GID:        fe80000000000000001175000077dd7e
        change ID:       0001
        max controllers: 0x10
    
        controller[  1]
            GUID:      001175000077dd7e
            vendor ID: 000011
            device ID: 007322
            IO class : 0100
            ID:        Linux SRP target
            service entries: 1
                service[  0]: 001175000077dd7e / SRP.T10:001175000077dd7e
  6. SRP 接続を確認するには、lsscsi コマンドを実行して SCSI デバイスの一覧を表示して、イニシエーターがターゲットに接続する前後の lsscsi 出力結果を比較します。
    [root@initiator]# lsscsi
    [0:0:10:0]   disk    IBM-ESXS ST9146803SS      B53C  /dev/sda
  7. イニシエーターポートに有効な ACL を設定せずに (これは失敗することが予想されます) リモートターゲットを接続するには、srp_daemon または ibsrpdm に以下のコマンドを使用します。
    [root@initiator]# srp_daemon -e -n -i qib0 -p 1 -R 60 &
    [1] 4184
    [root@initiator]# ibsrpdm -c -d /dev/infiniband/umad0 > /sys/class/infiniband_srp/srp-qib0-1/add_target
  8. dmesg の出力結果には、SRP 接続操作に失敗した理由が示されます。後続の手順で、ターゲットの dmesg コマンドを使用して、状況を明確にします。
    [root@initiator]# dmesg -c
    [ 1230.059652] scsi host5: ib_srp: REJ received
    [ 1230.059659] scsi host5: ib_srp: SRP LOGIN from fe80:0000:0000:0000:0011:7500:0077:d708 to fe80:0000:0000:0000:0011:7500:0077:dd7e REJECTED, reason 0x00010006
    [ 1230.073792] scsi host5: ib_srp: Connection 0/2 failed
    [ 1230.078848] scsi host5: ib_srp: Sending CM DREQ failed
  9. LOGIN に失敗したため、lsscsi コマンドの出力は前述のステップと同じになります。
    [root@initiator]# lsscsi
    [0:0:10:0]   disk    IBM-ESXS ST9146803SS      B53C  /dev/sda
  10. ターゲット (ib_srpt.ko) で dmesg を使用すると、LOGIN に失敗した理由を確認できます。また、出力結果には、srp_daemon が提供した、有効な ACL ID (0x7edd770000751100001175000077d708) が含まれます。
    [root@target]# dmesg
    [ 1200.303001] ib_srpt Received SRP_LOGIN_REQ with i_port_id 0x7edd770000751100:0x1175000077d708, t_port_id 0x1175000077dd7e:0x1175000077dd7e and it_iu_len 260 on port 1 (guid=0xfe80000000000000:0x1175000077dd7e)
    [ 1200.322207] ib_srpt Rejected login because no ACL has been configured yet for initiator 0x7edd770000751100001175000077d708.
  11. targetcli ツールを使用して、有効な ACL を追加します。
    [root@target]# targetcli
    targetcli shell version 2.1.fb41
    Copyright 2011-2013 by Datera, Inc and others.
    For help on commands, type 'help'.
    
    /> /srpt/ib.fe80000000000000001175000077dd7e/acls create 0x7edd770000751100001175000077d708
    Created Node ACL for ib.7edd770000751100001175000077d708
    Created mapped LUN 0.
  12. SRP LOGIN 操作を確認します。
    1. srp_daemon がログインを再試行できるようにするには 60 秒待ちます。
      [root@initiator]# sleep 60
    2. SRP LOGIN 操作を確認します。
      [root@initiator]# lsscsi
      [0:0:10:0]   disk    IBM-ESXS ST9146803SS      B53C  /dev/sda
      [7:0:0:0] disk LIO-ORG vol1 4.0 /dev/sdb
    3. SRP ターゲット検出のカーネルログに、以下を使用します。
      [root@initiator]# dmesg -c
      [ 1354.182072] scsi host7: SRP.T10:001175000077DD7E
      [ 1354.187258] scsi 7:0:0:0: Direct-Access     LIO-ORG  vol1             4.0  PQ: 0 ANSI: 5
      [ 1354.208688] scsi 7:0:0:0: alua: supports implicit and explicit TPGS
      [ 1354.215698] scsi 7:0:0:0: alua: port group 00 rel port 01
      [ 1354.221409] scsi 7:0:0:0: alua: port group 00 state A non-preferred supports TOlUSNA
      [ 1354.229147] scsi 7:0:0:0: alua: Attached
      [ 1354.233402] sd 7:0:0:0: Attached scsi generic sg1 type 0
      [ 1354.233694] sd 7:0:0:0: [sdb] 163258368 512-byte logical blocks: (83.5 GB/77.8 GiB)
      [ 1354.235127] sd 7:0:0:0: [sdb] Write Protect is off
      [ 1354.235128] sd 7:0:0:0: [sdb] Mode Sense: 43 00 00 08
      [ 1354.235550] sd 7:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
      [ 1354.255491] sd 7:0:0:0: [sdb] Attached SCSI disk
      [ 1354.265233] scsi host7: ib_srp: new target: id_ext 001175000077dd7e ioc_guid 001175000077dd7e pkey ffff service_id 001175000077dd7e sgid fe80:0000:0000:0000:0011:7500:0077:d708 dgid fe80:0000:0000:0000:0011:7500:0077:dd7e
      xyx