Show Table of Contents
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 rules ファイルは、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
link/infiniband
の直後には、IPoIB インターフェースの 20 バイトのハードウェアアドレスがあります。新規の名前作成に必要なのは、上記で太字表示となっている最後の 8 バイトのみです。ユーザーは好みに合わせて自由に命名スキームを作成できます。たとえば、mlx4
デバイスが ib0
サブネットファブリックに接続されている場合、mlx4_ib0
のような device_fabric 命名規則を使用します。唯一推奨されないのは、ib0
や ib1
といった標準名を使用することです。これらの名前は、カーネルが割り当てる自動的な名前と競合する場合があるからです。次に、rules ファイルにエントリーを追加します。既存の例を rules ファイルからコピーして、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 カードを設定するには、「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 を異なるタイプに設定しようとしても拒否されます。スクリプトはコマンドが成功するか、ポートの切り替えが完了されないことを示すタイムアウトになるまで設定しようとします。
13.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 ターゲットへの接続: 概要
- ターゲット側の準備:
- ストレージのバックエンドを作成します。たとえば、/dev/sdc1 パーティションを取得します。
/> /backstores/block は 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
Node 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 は、ポート 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 - ブロックデバイスで 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)] /> - イニシエーターで
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 fromfe80: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 - ターゲット (
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.
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 create0x7edd770000751100001175000077d708
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