13.5. Base RDMA サブシステムの設定
rdma
サービスの起動は自動的に実行されます。 InfiniBand か iWARP か RoCE/IBoE かに関係なく、RDMA 対応ハードウェアが検出されると、udev は systemd
に rdma
サービスを開始するように指示します。
~]# 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
13.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 カーネル内では有効にされないため、読み込むことができません。
13.5.2. 70-persistent-ipoib.rules の使用
rdma パッケージは、
/etc/udev.d/rules.d/70-persistent-ipoib.rules
ファイルを提供します。この udev ルールファイルは、IPoIB デバイスの名前をデフォルト名( ib0
や ib1
など)からよりわかりやすい名前に変更するために使用されます。デバイス名を変更するには、このファイルの編集が必要になります。まず、名前を変更する デバイスの 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
リンク/
インフニバンドの直後に、IPoIB インターフェイスの 20 バイトのハードウェアアドレスになります。新規の名前作成に必要なのは、上記で太字表示となっている最後の 8 バイトのみです。ユーザーは好みに合わせて自由に命名スキームを作成できます。たとえば、mlx4 デバイスが ib0
サブネットファブリックに接続されている場合は、mlx4
_ib0
などの device_fabric 命名規則を使用します。推奨されない唯一の方法は、ib0
や ib1
などの標準名を使用することです。これらは、カーネルに割り当てられた自動名と競合する可能性があるためです。次に、ルールファイルにエントリーを追加します。ルールファイルの既存の例をコピーし、ATTR{address} エントリーの 8 バイトを、名前を変更するデバイスから強調表示した 8 バイトに置き換え、NAME
フィールドで使用する新しい名前を入力します。
13.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
13.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 カードを設定するには、ナレッジベースの記事 で説明されているように、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 を異なるタイプに設定しようとしても拒否されます。スクリプトはコマンドが成功するか、ポートの切り替えが完了されないことを示すタイムアウトになるまで設定しようとします。
13.5.5. リモートの Linux SRP ターゲットへの接続
SCSI RDMA Protocol (SRP) は、システムが、別のシステムに接続されている SCSI デバイスにアクセスするために RDMA を使用できるようにするネットワークプロトコルです。SRP イニシエーターが、SRP ターゲット側で SRP ターゲットに接続するようにするには、そのイニシエーターで使用するホストチャンネルアダプター (HCA) ポートに、アクセスコントロールリスト (ACL) エントリーを追加する必要があります。
HCA ポートの ACL ID は固有ではありません。ACL ID は、HCA の GID 形式により異なります。同じドライバーを使用する HCA (
ib_qib
など)は異なる形式の GID を持つことができます。また、ACL ID は、接続要求を開始する方法により異なります。
リモートの Linux SRP ターゲットへの接続: 概要
- ターゲット側の準備:
- ストレージのバックエンドを作成します。たとえば、/dev/sdc1 パーティションを取得します。
/> /backstores/block create vol1 /dev/sdc1
- SRP ターゲットを作成します。
/> /srpt create 0xfe80000000000000001175000077dd7e
- ステップ A で作成したバックエンドに基づいた LUN を作成します。
/> /srpt/ib.fe80000000000000001175000077dd7e/luns create /backstores/block/vol1
- リモートの SRP クライアントに Node ACL を作成します。
/> /srpt/ib.fe80000000000000001175000077dd7e/acls create 0x7edd770000751100001175000077d708
ノード ACL はsrp_daemon
とibsrpdm
では異なることに注意してください。
- クライアント側で
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
- オプション:
lsscsi
やdmesg
など、さまざまなツールとの SRP 接続を検証することが推奨されます。
手順13.3 srp_daemon または ibsrpdm を使用して、リモートの Linux SRP ターゲットへの接続
- ターゲットで ibstat コマンドを使用して、
State
およびPort GUID
の値を確認します。HCA はActive
状態である必要があります。ACL ID は、Port 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 - 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
targetcli
ツールを使用してブロックデバイスに LUN vol1 を作成し、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)] />- イニシエーターで 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 - 以下のコマンドを使用して、リモートの 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 - SRP 接続を確認するには、lsscsi コマンドを使用して SCSI デバイスを一覧表示し、イニシエーターがターゲットに接続する前後に lsscsi 出力を比較します。
[root@initiator]# lsscsi [0:0:10:0] disk IBM-ESXS ST9146803SS B53C /dev/sda
- イニシエーターポートに有効な 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
- 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, reason0x00010006
[ 1230.073792] scsi host5: ib_srp: Connection 0/2 failed [ 1230.078848] scsi host5: ib_srp: Sending CM DREQ failed - LOGIN が失敗したため、lsscsi コマンドの出力は前の手順の出力と同じです。
[root@initiator]# lsscsi [0:0:10:0] disk IBM-ESXS ST9146803SS B53C /dev/sda
- ターゲット側で dmesg (
ib_srpt.ko
)を使用すると、LOGIN が失敗した理由について説明しています。また、出力には、srp_daemon
:0x7edd770000751100001175000077d708
が提供する有効な ACL ID が含まれます。[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.
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.- SRP LOGIN 操作を確認します。
srp_daemon
がログインを再試行できるように 60 秒待機します。[root@initiator]# sleep 60
- 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
- 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