CentOS 5.3 で iSCSI ターゲットを構築する

SERVER


iSCSI ターゲット

iSCSI とは、TCP/IP の技術を使用して SCSI プロトコルを転送することで、ネットワーク上の別のシステムに搭載されているハードディスクを接続するための仕組みです。

ハードディスクを提供する側を iSCSI ターゲット、それを利用する側を iSCSI イニシエーターと呼びます。

iSCSI は共有フォルダとは違いますので、設定したターゲットディスクは、イニシエーターがマウントすると、まるで物理ドライブが増設されたかのように、初期化等の設定を行うことになるのも面白いところです。

その後のフォーマットやアクセス権限の設定等は、マウントした OS 側で設定を行うので、何かの制約を受けることなくその環境に適した制御を普段通りに行えるのも、利点の一つではないでしょうか。

 

今回は CentOS 5.3 上に iSCSI ターゲットを構築して、他の PC から接続できるようにしてみようと思います。

 

iSCSI Enterprise Target をインストールする

CentOS 5.3 で iSCSI ターゲットを構築するためには、そのためのソフトウェアを追加でインストールする必要があります。

iSCSI ターゲットを構築するためのソフトウェアに iSCSI Enterprise Target というものがありますので、今回はそれをインストールしてみることにします。

このソフトウェアを利用するには Linux Kernel 2.6.14 以上である必要があるとのことですが、CentOS 5.3 は Kernel 2.6.18 なので、その辺りは大丈夫のようです。

 

今回はこのソースパッケージを RPM に変換してから、インストールを行ってみようと思います。

RPM パッケージを作成する環境の準備については EZ-NET レポート: CentOS 5.3 で PRM パッケージを作成できるようにする の方で記してあります。

 

平成 21 年 10 月 17 日時点では、Version 1.4.18 が最新のようですので、まずは次のようにして、最新のパッケージファイルを "/usr/src/redhat/SOURCES" ディレクトリにダウンロードしておきました。

cd /usr/src/redhat/SOURCES

wget http://sourceforge.net/projects/iscsitarget/files/iscsitarget/1.4.18/iscsitarget-1.4.18.tar.gz/download

"iscsitarget-1.4.18.tar.gz" をダウンロードしたら、まずは次のようにして RPM パッケージの作成を行います。

rpmbuild -ta iscsitarget-1.4.18.tar.gz

このとき、自分の環境では "openssl-devel は iscsitarget-1.4.18-1.x86-64 に必要とされています" というメッセージが表示されてしまいました。"yum list installed" で確認してみると確かにないようでしたので、"yum install openssl-devel" として、openssl-devel をインストールしておきました。

依存関係の問題もなく RPM の作成処理が始まったら、後はしばらく待っていると処理が完了して、次のファイルが生成されました。

  • /usr/src/redhat/SRPMS/iscsitarget-1.4.18-1.src.rpm
  • /usr/src/redhat/RPMS/x86_64/iscsitarget-1.4.18-1.x86_64.rpm
  • /usr/src/redhat/RPMS/x86_64/kmod-iscsitarget-1.4.18-1_2.6.18_164.el5.x86_64.rpm

 

後は、次のようにして RPM パッケージをインストールします。

cd /usr/src/redhat/RPMS/x86_64

 

rpm -ivh kmod-iscsitarget-1.4.18-1_2.6.18_164.el5.x86_64.rpm

rpm -ivh iscsitarget-1.4.18-1.x86_64.rpm

インストールが完了したら、次のようにして iSCSI Enterprise Target を起動することができます。

service iscsi-target start

なお、iSCSI Enterprise Target の設定ファイルは "/etc/iet/ietd.conf" に格納されていました。

 

iSCSI Enterprise Target を設定する

iSCSI Enterprise Target のインストールが完了したら、公開するハードディスクの設定を行います。

ブロックデバイスで指定する

設定ファイルは "/etc/iet/ietd.conf" に用意されていますので、それを編集します。例えば、次のような感じです。

Target iqn.2001-03.jp.ez-net.iscsi:storage.backup.disk1

Lun 0 Path=/dev/sde,Type=blockio

MaxConnections 1

IncomingUser username password0123

 

Target iqn.2001-03.jp.ez-net.iscsi:storage.backup.disk2

Lun 0 Path=/dev/sdf,Type=blockio

MaxConnections 1

Target に設定する文字列は "iqn.[ドメイン取得年]-[ドメイン取得月].[ドメイン名 (逆順)]:[任意の識別子]" という形式で指定する必要があるとのことです。

それと iSCSI の性質上、ひとつのターゲットに複数のイニシエーターが同時接続すると不都合が生じる可能性が考えられるため、MaxConnections を 1 に設定してあります。

なお、ここで指定している "/dev/sde" といったブロックデバイスは、初期化やマウントをしておく必要はありません。

また、Target 毎にパスワードによるアクセス制御を行うこともできるようになっていて、パスワードを設定する場合は "IncomingUser" という値を設定して、ここで "アカウント名" と "12 文字のパスワード" とを指定します。

 

設定を行ったら、次のようにして iSCSI Enterprise Target を再起動すれば、設定が反映されます。

service iscsi-target restart

 

イメージファイルで指定する

iSCSI で提供するディスク領域は、イメージファイルで指定することも可能です。

Target iqn.2001-03.jp.ez-net.iscsi:storage.backup.disk1

Lun 0 Path=/var/iscsi/disk1.img,Type=fileio

MaxConnections 1

 

Target iqn.2001-03.jp.ez-net.iscsi:storage.backup.disk2

Lun 0 Path=/var/iscsi/disk2.img,Type=fileio

MaxConnections 1

このように Path のところをファイル名で指定して、Type として "fileio" を設定します。

Path で指定したファイルは dd コマンドを使用して作成しておきます。例えば 10GB のイメージファイルを作成する場合には、次のような感じになります。

dd if=/dev/zero of=/var/iscsi/disk1.img bs=1G count = 10

このようにすることで、/dev/zero から /var/iscsi/disk1.img へ 1GB の領域を 10 回コピーする処理が行われます。

bs=10G としても良さそうですが、bs にあまり大きな値を設定すると "メモリーを使い果たしました" というメッセージが表示されて、ファイルを作成することが出来ない場合があるようでした。

 

設定を行ったら、次のようにして iSCSI Enterprise Target を再起動すれば、設定が反映されます。

service iscsi-target restart

 

iSCSI Enterprise Target のアクセス制限を設定する

iSCSI Enterprise Target では、接続可能なイニシエーターを制限することも可能です。

許可するイニシエーターは、以下のようにして "/etc/iet/initiators.allow" ファイルに記載します。

iqn.2001-03.jp.ez-net.iscsi:storage.backup.disk1 192.168.0.0/24

ALL 192.168.1.0/24

最初がターゲット名で、空白を置いて、続いて接続を許可する IP アドレスとなっています。ALL を指定することで、全てのターゲットや全ての IP アドレスを表すことが出来ます。

この設定は iSCSI Enterprise Target を再起動しなくても有効となる感じです。ただ、接続済みのターゲットディスクがアクセス禁止になったとしても、強制的に切断されるということはない様子です。

また、ターゲット名と IP アドレスとの間にタブ文字を指定すると、意図した通りの動作をしてくれないことがあるようでしたので、区切り文字は必ず半角スペースを使用するようにします。

 

なお、"/etc/iet/initiators.allow" ファイル内で明示的に許可されていないイニシエーターは、そのターゲットディスクへのアクセスは禁止される様子でした。

ただ、今回は iSCSI Target 1.4.18 でしたけど、iSCSI Target 0.4.17 では、許可についての設定ファイルは "/etc/initiators.allow" になりますけど、それに記されていないイニシエーターは "/etc/initiators.deny" に設定されている内容によって許可・禁止が左右されるようでした。

どちらにも記載がない場合には、そのイニシエーターはアクセス可能となるようです。

 

iSCSI Enterprise Target の使用するポートを解放する

iSCSI Enterprise Target は、次のポートを使用するようです。

iscsi 860/tcp,udp
iscsi-target 3260/tcp,udp

ただ、実際に試してみたところ、3260/tcp だけを許可すれば通信可能のようでした。

CentOS 5.3 では、標準でファイアーウォールが有効になるので、設定を調整してこれらのポートを解放する必要があります。設定方法については EZ-NET: CentOS 5.3 のファイアーウォールを設定する : Linux の使い方 も参考にしてみて下さい。

 

なお、iSCSI ターゲットで使用するポート番号を変更したい場合には、iSCSI Target プログラム "/usr/sbin/ietd" に "-p" オプションを指定します。

CentOS 5.3 では "/etc/rc.d/init.d/iscsi-target" ファイル内の start 関数内に記されている起動コードを編集します。

daemon /usr/sbin/ietd -p 3260

このようにして iscsi-target サービスを再起動することで、iSCSI Target の待ち受けポート番号を変更することが可能です。

 

ファイアーウォール内に iSCSI ターゲットを置く場合

iSCSI Target をインストールしたサーバーを、ファイアーウォールで保護されたネットワーク内に配置した場合、ファイアーウォールで NAT を設定しても、iSCSI ターゲットに接続できませんでした。

原因を調べてみると、iSCSI ターゲットから、設定されているターゲット一覧を取得するところまではできるのですけど、その情報の中には iSCSI ターゲットの IP アドレスも含まれていて、それがファイアーウォールの内側の IP アドレスだったためでした。

取得したターゲットに改めて接続しようとする際に、その IP アドレスへ接続しようとしてしまうため、iSCSI ターゲットに正しく接続することができない様子です。

 

これを回避するためには、どうしたらいいのでしょうね。

VPN 接続で直接内部に接続するのが、通信の暗号化も兼ねられて良いような気がします。

それ以外の方法としては、何らかの方法で iSCSI 通信内の IP アドレスをファイアーウォールの IP アドレスに書き換えたりとか、NAT の要らないグローバル IP アドレスを割り当ててファイアーウォールの外に出すなど、といった感じでしょうか。

 

iSCSI Enterprise Target を Linux 起動時に自動起動させる

インストールしただけでは、Linux 起動時に iSCSI Enterprise Target は起動されないので、自動起動するように設定します。設定方法については EZ-NET: サービスの起動状態を変更する (CentOS 5.4) を参考にしてください。