Linux上のiSCSIイニシエータ(iscsi-initiator-utils)からiSCSIターゲット(targetcli)に接続する方法

こんにちは、Aireです。

今回はLinux環境でイニシエータからターゲットにiSCSI接続する方法を記載します。その際、iSCSIターゲットにアタッチしたブロックデバイスをiSCSIイニシエータに提供するようにします。

(2023/07/10追記)マルチパスソフト(Device Mapper Multipath)の設定を追加した記事を公開しましたので、そちらも参照ください。

目次

構成情報

iSCSIイニシエータ

OS(cat /etc/redhat-release)Red Hat Enterprise Linux release 8.4 (Ootpa)
Linux Kernel(uname -r)4.18.0-305.el8.x86_64
NIC:IPアドレスNIC1:172.31.36.105
使用ソフトウェアパッケージiscsi-initiator-utils

iSCSIターゲット

OS(cat /etc/redhat-release)Red Hat Enterprise Linux release 8.4 (Ootpa)
Linux Kernel(uname -r)4.18.0-305.el8.x86_64
NIC:IPアドレスNIC1:172.31.46.175
使用ソフトウェアパッケージtargetcli, firewalld
ブロックデバイス:サイズ/dev/xvdf:125G
/dev/xvdg:125G

ソフトウェアパッケージのインストール

iSCSIイニシエータ

iscsi-initiator-utilsのインストール、有効化

iscsi-initiator-utilsパッケージがインストールされているか確認し、インストールされていない場合は、dnf installコマンドを使用してインストールします。

サービスの起動と自動起動の有効化を行います。

以下のコマンドでイニシエータ名を確認できます。

iSCSIターゲット

targetcliのインストール、有効化

targetcliパッケージがインストールされているか確認し、インストールされていない場合は、dnf installコマンドを使用してインストールします。

サービスの起動と自動起動の有効化を行います。

firewalldのインストール、有効化

firewalldパッケージがインストールされているか確認し、インストールされていない場合は、dnf installコマンドを使用してインストールします。

サービスの起動と自動起動の有効化を行います。

iSCSI通信用に3260番ポートを開放します。

ファイアウォールの設定を確認します。

iSCSIターゲットの設定

iSCSIターゲット側でtargetcliを実行し、対話モードでiSCSIターゲットの設定を行います。iSCSIターゲットの初期構成は以下のようになっています。

iSCSIバックストアの作成

バックストアディレクトリでブロックストレージオブジェクトを作成します。以下の実行例のデバイス情報は実際の環境に合わせて変更してください。

/dev/sdb/dev/xvdfなどのデバイス番号は可変であり、OS再起動後のデバイス検出順序によって変わる可能性があります。そのため以下の実行例では、udev機能を用いて確認したデバイス情報(/dev/disk/by-path/xxxxxなど)を指定しています。

iSCSIターゲットの作成

iSCSIディレクトリでiSCSIターゲットを作成します。
createコマンドの引数として、iSCISターゲット名(IQN値)となる任意の文字列を入力すると、入力した名前のiSCSIターゲットが作成されます。引数を省略すると、iSCSIターゲット名が自動で作成されます。

iSCSI LUNの作成

ストレージオブジェクトのLUNを作成します。バックストアに作成したブロックデバイスがLUNとしてマッピングされます。

ACLの設定(ACLへの登録またはACLの無効化)

ACLへの登録

ACL(アクセス制御リスト)は、ターゲットにアクセス可能なイニシエータを指定する機能です。

後述の「iSCSIターゲットへのログイン」を行う場合、デフォルトのACL設定(generate_node_acls=0)では、ACLに登録されたイニシエータしかログインすることができません。登録されていないイニシエータからログインを試みると、以下のようなメッセージが表示されます。

ACLに登録するためには、ACLディレクトリでcreateコマンドを実行します。

ALCの無効化

ACLによる厳密なアクセス制御が不要である場合は、以下のようにACL設定を無効化(generate_node_acls=1)することで、イニシエータの登録をせずにターゲットへのログインを可能にできます。

iSCSIポータルの設定(任意)

iSCSIターゲットを作成すると、デフォルトのiSCSIポータルも作成されます。デフォルトでは、iSCSIターゲットがiSCSIポート3260番の全てのIPアドレスをリッスンするようになっています。デフォルト設定が望ましくない場合、以下のようにデフォルトのポータルを削除し、リッスンするIPアドレスとポートを指定してポータルを再作成することも可能です。

デフォルトポータルの削除

ポータルディレクトリでデフォルトポータルを削除します。

ポータルを削除した状態でiSCSIターゲットを検出しようとすると、コネクションが拒否されます。

新規ポータルの作成

ポータルディレクトリで、ターゲットのIPアドレスを指定して新規ポータルを作成します。

CHAP認証(任意)

CHAP認証では、イニシエータとターゲットの両方でユーザ名とパスワードを定義することで、イニシエータとターゲット間で認証に基づいたやり取りが可能になります。

CHAP認証には単方向CHAP認証と双方向CHAP認証の2種類があります。

  • 単方向CHAP認証:ターゲットがイニシエータを認証します。ターゲットは(1)イニシエータから送られてきた暗号化パスワードと(2)ターゲット内で生成した暗号化パスワードを比較して、一致すれば認証を許可します。
  • 双方向CHAP認証:単方向CHAP認証に加えて、イニシエータがターゲットを認証することで、双方向からの認証を実現します。

ターゲット検出時のCHAP認証

ターゲット検出時の認証用にCHAPユーザ名とパスワードを設定することができます。
認証設定が合っていない場合、discoveryコマンドを実行しても、以下のようにターゲットの検出が失敗します。

以下、targetcliによるターゲット側での単方向CHAP認証の設定方法です。

  1. iSCSIディレクトリで検出時の認証を有効にします。
  2. CHAPユーザ名(e.g. userid=initiatoruser)とパスワード(e.g. password=initiatorpassword)を設定します。
  • 双方向CHAP認証の場合、双方向用CHAPユーザ名(e.g. mutual_userid=targetuser)と双方向用パスワード(e.g. mutual_password=targetpassword)を追加で設定します。

次にイニシエータ側ですが、/etc/iscsi/iscsid.confファイルを以下のように編集します。

ターゲットログイン時のCHAP認証

ターゲットログイン時の認証用にCHAPユーザ名とパスワードを設定することができます。
認証設定が合っていない場合、ターゲットへのログインを試みても、以下のようにログインが失敗します。

以下、targetcliによるターゲット側での単方向CHAP認証の設定方法です。

  1. iSCSIディレクトリで検出時の認証を有効にします。
  2. CHAPユーザ名(e.g. userid=initiatoruser)とパスワード(e.g. password=initiatorpassword)を設定します。
  • 双方向CHAP認証の場合、双方向用CHAPユーザ名(e.g. mutual_userid=targetuser)と双方向用パスワード(e.g. mutual_password=targetpassword)を追加で設定します。

イニシエータ側は、/etc/iscsi/iscsid.confファイルを以下のように編集します。

iSCSIイニシエータからiSCSIターゲットに接続

iSCSIターゲットの設定が終わったので、iSCSIイニシエータから接続してみます。

iSCSIターゲットの検出・接続

IPアドレスを指定して、iSCSIターゲットを検出し、接続します。

iSCSIターゲットへのログイン

検出したiSCSIターゲットのIQNを指定して、iSCSIターゲットにログインします。

IQNを指定せず、一括でiSCSIターゲットにログインすることも可能です。

lsblkコマンドを実行すると、iSCSIターゲット経由でブロックデバイスを認識することができます。

iSCSIセッションからのログアウト & iSCSIターゲットの削除

iSCSI接続を終了する場合、iSCSIイニシエータ側でiSCSIセッションからログアウト後、iSCSIターゲットの接続設定を削除します。

iSCSIセッションからのログアウト

iSCSIイニシエータに登録したノード(iSCSIターゲット)からログアウトします。

IQNを指定せず、一括でiSCSIターゲットからログアウトすることも可能です。

アクティブなiSCSIセッションがないことを確認します。

iSCSIターゲットの削除

iSCSIイニシエータに登録したノード(iSCSIターゲット)を削除します。(discoveryコマンドで一括登録した場合は、接続サーバを削除します)

接続サーバを削除します。

おわりに

今回はtargetcliを活用した、Linux環境でのiSCSI接続方法を記載しました。
targetcliを活用することで、リモート環境にあって直接利用することができないストレージデバイスを、Linux経由でイニシエータサーバに提供することができます。低スペックなサーバから始めることができるので、本記事を参考にまずは試して貰えると嬉しいです。それでは。

この記事を書いた人

目次