iSCSI は Internet Small Computer System Interface の略です。
これは TCP/IP レイヤーで機能し、SCSI コマンドをローカル エリア ネットワーク (LAN) 経由で送信できるようにします。
ブロックレベルのデータ転送を使用して、TCP/IP 経由でネットワーク上のストレージにアクセスするために使用されます。
NFS と iSCSI はよく比較されます。主な違いは、NFS はファイル レベルの実装であるのに対し、iSCSI はブロック レベルの実装であることです。
iSCSI やファイバー チャネルなどのブロック レベルの実装では、ストレージ アレイがブロックのコレクションをクライアントに提供し、クライアントは使用することを決定した任意のファイル システムで未加工のストレージをフォーマットします。
iSCSI 経由でストレージにアクセスするには、次のコンポーネントが必要です:
このチュートリアルでは、iSCSI 構成をサポートする独自のストレージ ノードをセットアップし、Centos 6 マシン上の iSCSI クライアントからストレージにアクセスする方法について説明します。
RHEL 6 (CentOS 6) バージョンでも同じ手順が機能するはずです。 CentOS 7 の場合、別の記事で説明する targetcli を使用する手順が少し異なります。
1. SCSI ターゲット ユーティリティをインストールし、tgtd を開始
最初に、yum コマンドを使用して、ストレージ ノードに scsi-target-utils をインストールします。これは、iSCSI の構成に必要です。
yum install scsi-target-utils
システムに Perl がまだインストールされていない場合、上記のコマンドは perl と他のいくつかの依存関係 (例:sg3_utils) を自動的にインストールします。
これにより、以下に示すように tgtadm コマンドがインストールされます。
# which tgtadm /usr/sbin/tgtadm
以下に示すように、SCSI ターゲット デーモンにスターを付けます。
# service tgtd start Starting SCSI target daemon: [ OK ]
chkconfig コマンドを使用して、システムの起動時に自動的に起動することを確認してください。
chkconfig tgtd on
2. tgtadm を使用して新しい iSCSI ターゲットを追加
tgtadm コマンドを使用して、次の構文を使用して新しい iSCSI ターゲットをストレージ ノードに追加します:
tgtadm --lld --mode target --op new --tid --targetname
次の例では、以下の iqn でターゲット ID 1 のターゲットを作成します。
tgtadm --lld iscsi --op new --mode target --tid 1 \ -T iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com
上記のコマンドで:
- tgtadm コマンドは Linux SCSI ターゲット管理ユーティリティです
- –lld iscsi は、iscsi ドライバーを使用していることを指定します (–lld の代わりに -L を使用することもできます)
- –op new は操作を指定します。この場合、新しいターゲットを作成しています (–op の代わりに -o を使用することもできます)
- –mode target は、ターゲットを作成していることを示します。その他の可能なモードは、logicalunit、account、portal、conn、sys です。 (–mode の代わりに -m を使用することもできます)
- –tid 1 はターゲット ID を指定します。この例では 1 です (–tid の代わりに -t を使用することもできます)
- -T はターゲット名を指定します (-T の代わりに –targetname を使用することもできます)
3. iSCSI ターゲット構成を表示する
ターゲットが作成されると、以下に示すように「表示」操作を使用して詳細を表示できます。これにより、システム情報と、システムで利用可能なすべてのターゲットの LUN 情報が提供されます。
次の出力からわかるように、1 つの LUN (LUN 0) を持つ iSCSI ドライバーである 1 つのターゲット (ターゲット 1) しかありません。
# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB, Block size: 1 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: null Backing store path: None Backing store flags: Account information: ACL information:
注:上記の出力では、物理ストレージ パスをこの iSCSI にまだ関連付けていないため、「バッキング ストア パス」は現在 [なし] になっています。
4. LUN を iSCSI ターゲットに追加
次の例では、ストレージ ノードにマウントされ、使用可能な既存の LUN /storage/lun01 を、作成した iSCSI ターゲットに追加します。
既存の LUN (/storage/lun01) については、以下に示すように SELinux コンテキストも適切に設定する必要があります。
semanage fcontext -a -t tgtd_var_lib_t /storage/lun01 restorecon -Rv /storage/lun01
「無効なリクエスト」が表示される場合は、一時的なテスト目的で、SELinux を許容モードに設定して SELinux を無効にして、問題が解決するかどうかを確認し、問題を SELinux パーミッションに絞り込むことができます。
ここで、tgtadm コマンドを使用して、以前に作成した iSCSI ターゲットに /storage/lun01 を追加します。
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \ --lun 1 --backing-store /storage/lun01
上記のコマンドで:
- ほとんどのオプションは、上記の tgtadm コマンドで説明したものと同じです。
- –モードの論理ユニット。以前はモードに「ターゲット」を使用していましたが、ここではモードに論理ユニットを使用していることに注意してください。
- –lun は LUN ID を示します。この例では 1 です (–lun の代わりに -l を使用することもできます)
- –backing-store は、ストレージ サーバー上の物理ストレージ パスを示します。この例では、/storage/lun01 です (–backing-store オプションの代わりに -b を使用することもできます)
- –tid 1 は、この特定の LUN を、以前に作成した既存のターゲット ID 1 に接続することを示します。
ここで、システム上の iSCSI の詳細を再度表示します。
ただし、今回は、LUN 1 では、次の出力の「バッキング ストア パス」は、この iSCSI に関連付けたストレージ パスを指します。この例では、/storage/lun01 です。
# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 5369 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No Backing store type: rdwr Backing store path: /storage/lun01 Backing store flags: Account information: ACL information:
何らかの理由で、上記のコマンドを間違えて、上記で作成した LUN1 の関連付けを削除したい場合は、次のコマンドを使用してください。
tgtadm --lld iscsi --mode logicalunit --op delete --tid 1 --lun 1
上記のコマンドで:
- 前のコマンドとすべて同じです
- しかし、ここでは -op (操作) は削除です。
- これにより、iSCSI tid 1 (ターゲット 1) から lun1 が削除されます
5. iSCSI の ACL 制限の設定
次に、この scsi ターゲットにアクセスできるイニシエーターを許可するように ACL をセットアップする必要があります。
tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
上記のコマンドで:
- ほとんどのオプションは、以前のコマンドとほとんど同じです
- -I ALL オプションは、ターゲットがすべてのイニシエーターを受け入れることを許可していることを示します (-I の代わりに –initiator-address を使用することもできます)
「show」操作を使用して iSCSI の詳細を表示すると、以下に示すように、出力の最後に ACL 情報が表示されます。
# tgtadm --lld iscsi --op show --mode target .. .. Backing store path: /storage/lun01 Backing store flags: Account information: ACL information: ALL
ストレージにアクセスする必要があるクライアントのみを制限する場合は、次のコマンドを使用して特定の IP アドレスを指定できます。
tgtadm --lld iscsi --mode target --op bind --tid 1 192.168.2.109
特定のサブネットへのアクセスを制限したい場合は、以下に示すように、IP アドレスの代わりにサブネットを指定できます。
tgtadm --lld iscsi --mode target --op bind --tid 1 192.168.2.0/24
6.ポート 3260 へのアクセスを許可
ip-tables を実行している場合は、ip-tables ルールを追加し、以下に示すようにポート 3260 を許可します。
iptables -I INPUT -p tcp -m tcp --dport 3260 -j ACCEPT
以下に示すように、netstat コマンドを使用して、ポート 3260 が開いていることを確認します。
# netstat -tunlp | grep 3260 tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 1248/tgtd tcp 0 0 :::3260 :::* LISTEN 1248/tgtd
注:この時点まで、上記のコマンドはすべてストレージ サーバー ノードで実行されていました。これ以降、次のセクションのすべてのコマンドは、ストレージ サーバーに接続する必要があるクライアント マシンで実行されます。
7.クライアント上:iSCSI の検出
クライアントでは、iSCSI を検出するまで、新しい iSCSI ディスクは表示されません。たとえば、次の出力では何も表示されません。
fdisk -l /dev/sdb
これですべてのターゲット側の構成が完了し、クライアントから iscsi 経由で LUN にアクセスできるようになりました。以下の手順は、ストレージにアクセスするようにクライアント側を構成する方法を示しています。
クライアント サーバーに、以下に示すように iscsi-initiator-utils パッケージをインストールします。
yum install iscsi-initiator-utils
次に、以下に示すように iscsiadm コマンドを使用して iSCSI ターゲットを検出します。
[root@client ~]# iscsiadm --mode discovery --type sendtargets \ --portal 192.168.2.166
上記のコマンドは、次の出力を表示します:
192.168.2.166:3260,1 iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com
上記のコマンドで:
- iscsiadm コマンドは open-iscsi 管理ユーティリティです
- –mode discover は、ここで iSCSI サーバーを検出していることを示します。その他の可能なモードは、discoverydb、node、fw、host iface、または session です。 (–mode の代わりに -m を使用することもできます)
- – 特定の sendtargets をここに入力します。その他の有効な値は、sendtargets、fw、および iSNS です。 sendtargets の代わりに st 省略形を使用することもできます。 (–type の代わりに -t を使用することもできます)
- –portal は、以前にセットアップした iSCSI ストレージ ノードの IP アドレスを指定します (–portal の代わりに -p を使用することもできます)。
- ip-address については、デフォルト以外のポート (3260 以外) で iSCSI を実行している場合は、ip-address の後に指定します。たとえば、192.168.2.166:3261
注:「ホストへのルートがありません」というエラーが表示される場合は、ターゲットまたはクライアントの iptables が正しく構成されていません。
8.クライアント:iSCSI ターゲット セッションにログイン
検出プロセスが正常に完了したら、次のコマンドを使用して iSCSI ターゲット セッションにログインする必要があります:
[root@client ~]# iscsiadm --mode node --targetname iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com \ --portal 192.168.2.166 --login
上記のコマンドは、次の出力を表示します:
Logging in to [iface: default, target: iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com, portal: 192.168.2.166,3260] (multiple) Login to [iface: default, target: iqn.2016-03.com.thegeekstuff:storage.lun01.thegeekstuff.com, portal: 192.168.2.166,3260] successful.
上記のコマンドで:
- ほとんどのオプションは前のコマンドと似ています。
- モードについては、ここでは (検出ではなく) ノードを使用しています
- -targetname は、ターゲット名を指定します。これは、iSCSI を作成したときにストレージ ノードで指定したターゲット名です (–targetname の代わりに -T を使用することもできます)
- –login オプションは、検出されたすべてのターゲットにログインします。この場合、–portal オプションで指定されたストレージ iSCSI サーバーにログインします。
これで、fdisk の出力に新しい iscsi デバイスが表示されるはずです。フォーマットして、lvm に追加し、必要に応じて使用できます。
fdisk コマンドの出力にデバイスが表示されます。
[root@client ~]# fdisk -l /dev/sdb Disk /dev/sdb: 5368 MB, 5368709120 bytes 166 heads, 62 sectors/track, 1018 cylinders Units = cylinders of 10292 * 512 = 5269504 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
注:上記のディスクはクライアント マシンからのものではなく、iSCSI としてストレージ サーバーからのものです。