FreeBSD で iSCSI を利用する (サーバー/ターゲット編)

FreeBSD

FreeBSD 10.0 より,別途パッケージを導入する必要が無く,標準で iSCSI が利用できるようになりました.
iSCSI は RFC 7143 で規定されている標準的なプロトコルになりますので FreeBSD に限らず様々なシステムが利用する事ができます.(GEOM GATE と違って)

今回は FreeBSD での iSCSI によるディスクの提供について纏めてみたいと思います.

そもそも iSCSI とは

iSCSI は Internet Small Computer System Interface の略称で RFC 7143 で規定されています.
SCSI はハードディスクやテープドライブなどのデバイスを接続する為のインターフェイス規格で,これを IP 化したものが iSCSI となります.

メリットは何といっても IP ネットワークがあれば利用可能な点です.SCSI であれば SCSI カード (SCSI HBA),SAS であれば SAS カード (SAS HBA),FC であれば FC カード (FC HBA) が必要です.
HBA はホストバスアダプター (Host Bus Adapter) の略称です.

iSCSI はイーサネットカード/ネットワークアダプターさえあれば利用が可能ですので,導入の敷居がとても低いです.

デメリットは,SCSI/SAS/FC のような専用のシステムに比べてパフォーマンスに劣る点になります.iSCSI の処理をソフトウェア処理 (CPU) が行う場合はその分のオーバーヘッドが発生します.
もっとも,最近の CPU は高性能ですのでそこまで気にする必要はないと思います.
ですが,ストレージメーカーの資料でも FC と iSCSI の比較の場合は明確に iSCSI のパフォーマンスが低く提示されていますので,パフォーマンスを最大限に求める場合には向かないです.

ネットワークアダプターがあれば利用できる.がメリットでありデメリットにもなり得ます.一つのネットワークアダプターに通常のトラフィックと iSCSI トラフィックを同居させるとその分パフォーマンスに影響が生じます.
ですので,多くの場合は (特に企業で導入する場合) iSCSI 専用のネットワークを用意します.
イメージとしてはこのような形です.

このように,iSCSI 専用のネットワークを用いる事でストレージアクセス時のパフォーマンスを担保する構成が一般的です.

iSCSI で出てくる用語

iSCSI で出てくる用語について以下解説します.

  • ターゲット
    iSCSI でデバイスを提供する側を指します.iSCSI ストレージ側 (iSCSI サーバー側) です.
    専用のストレージの場合もあれば,今回解説するような OS の機能での提供もあります.
  • イニシエーター
    iSCSI でデバイスを利用する側を指します.iSCSI 処理をオフロードできる NIC (iSCSI HBA) もありますし,今回のような OS/アプリが提供するソフトウェア処理による方法もあります.
  • EUI
    iSCSI のターゲット,イニシエーターの命名規則の一つで IEEE が規定している規則です.
    イーサネットの MAC アドレスに近く,64bit で表すため EUI-64 というのが正式な名称のようです.
    先頭の 24bit が Company ID で IEEE Registration Authority が指定しています.イーサネット MAC アドレスのベンダー ID と同等です.
    残りの 40bit が各社が自由に設定できるフィールドになります.
    MAC アドレスもそうですが,人が見て分かりづらい表記になります.
  • IQN
    iSCSI Qualified Name の略称で,直訳で iSCSI の修飾名です.
    命名規則はiqn.yyyy-mm.naming-authority:unique-name となります.例えば iqn.2023-12.org.seichan.iscsi.volume01 というような名前になります.
    • yyyy-mm
      命名機関が設立された年月になります.
    • naming-authority
      命名機関のドメイン名を逆順に並べたものになります.
    • unique-name
      任意の一意な名前です.

EUI と IQN 両方ともターゲットの指定で利用できますが,ほぼほぼ IQN の利用が多いです.

FreeBSD でターゲットを設定する

本題の,FreeBSD で iSCSI Target を設定し,そのほかのデバイスへディスク領域を提供してみます.
FreeBSD でターゲットを構築するという事なので,イメージはこのようになります.

FreeBSD での iSCSI ターゲット機能は ctld というプログラムによって行われます.
まずは,ターゲット (サーバー) 側でデバイスを提供する設定を用意する必要がありますので,以下に例を記載します.

# cat /etc/ctl.conf
auth-group ag0 {
  chap-mutual "iscsi-user1" "Password-user1" "mutual-user" "Password-mutual"
  initiator-portal 172.16.255.0/24
}

auth-group ag1 {
  chap "iscsi-user2" "Password"
  initiator-portal 172.16.255.1/24
}

auth-group ag2 {
  auth-type none
  initiator-portal 172.16.255.1/24
}


portal-group pg0 {
  discovery-auth-group no-authentication
  listen 172.16.255.254:3260
}

target iqn.2023-12.iscsi.org.seichan:target0 {
  alias "target0"
  auth-group ag0
  portal-group pg0
  lun 0 {
    path /dev/da1
    option vendor "FreeBSD"
  }
  lun 1 {
    path /mnt/lun1.img
    option vendor "FreeBSD"
    blocksize 4096
    size 10G
  }
}

target iqn.2023-12.iscsi.org.seichan:target1 {
  alias "target1"
  auth-group ag1
  portal-group pg0
  lun 2 {
    path /mnt/lun2.img
    option vendor "FreeBSD"
    blocksize 4096
    size 10G
  }
}

target iqn.2023-12.iscsi.org.seichan:target2 {
  alias "target2"
  auth-group ag2
  portal-group pg0
  lun 3 {
    path /mnt/lun3.img
    option vendor "FreeBSD"
    blocksize 4096
    size 10G
  }
}

設定ファイルの解説

ちょっと長い設定ファイルを用意してしまいましたが,内容について以下に解説します.

  • auth-group
    iSCSI の利用には認証の有無を選択できます.「相互 CHAP」「CHAP」「認証無し」のいずれかを利用可能です.(強固な順番で記載しました.)
    • chap-mutual
      相互 CHAP を利用した認証を行う方式となり,ターゲットとイニシエーター両方で認証を行います.これが一番強固なものとなります.
      製品,ソフトウェアによってはこれが利用できないものがあるようです.
    • chap
      CHAP を利用した認証を行う方式となり,イニシエーターからターゲットへ認証を行います.
      通常認証有りで構成する場合に用いられる方式です
    • none
      認証をしない方式です.initiator-portal に許可されている接続元アドレスからの要求は受け付ける形となります.
      本来は望ましくないと考えているのですが,iSCSI 専用のネットワークを用意して導入する事が多いのですが,よくこの設定で導入,納品する事があります.
    • initiator-portal
      接続元の許可/拒否を判定させるものとなります.サブネット単位,ホスト単位のいずれも指定が可能です.
      今回の場合,相互 CHAP はサブネット単位,CHAP と認証無しはホスト単位として設定を用意しました.
  • portal-group
    iSCSI のターゲットポータルを用意する設定です.イニシエーターからの iSCSI 探索要求や接続要求にどのアドレス (インターフェイス) から受け付けるのか.や,探索時も認証を要求するのかの設定を行います.
    • discovery-auth-group
      探索時の認証の有無を指定します.先に設定してある ag (auth-group) の値を用いた認証が必要な状態もしくは,今回のように認証を求めない.という設定が可能です.
    • listen
      iSCSI ターゲットとしてどのインターフェイスを用いるかを指定しています.
      今回は iSCSI 専用のインターフェイスを持っている想定で IPアドレスを指定している形としています.
      全てのインターフェイスにバインドさせる場合は 0.0.0.0:3260 というような記載も可能です.
  • target
    提供するデバイスの詳細を記載する設定項目です.今回は幾つも例を用いる為に3つのターゲット設定を用意しています.
    • target iqn.xxx
      上で説明した IQN となります.:から先がターゲット名としてイニシエーターから見えるようになります.
    • alias
      ターゲット名を人間が判別しやすいように別名を用いる事が可能です.今回だと特段必要はないと思いますが一応付けています.
    • auth-group
      先に定義してある,auth-group のどれを利用するか.の指定になります.
    • portal-group
      先に定義してある,portal-group のどれを利用するか.の指定になります.
    • lun
      iSCSI の論理ユニット番号になります.lun に付与できる ID は 0-255 となります.
  • lun の中身について
    iSCSI として領域を提供する方法として,デバイス全体もしくはファイルをディスク領域として提供する事が可能です.
    • path /dev/da1
      このようにデバイスファイルを指定した場合はそのデバイス全体を iSCSI として提供する事になります.
    • path /mnt/lun1.img
      このようにファイルを指定した場合は,iSCSI として提供するディスクの実態をファイルとすることが可能です.
      付随して,提供するボリュームサイズ (ファイルサイズ) を指定します.

設定ファイルの確認

作成した設定ファイルに問題がないか,確認する事が可能です.(稼働後の設定追加の場合は反映前に必須です)

# ctld -t
ctld: secret for user "iscsi-user2", auth-group "ag1", is too short; it should be at least 12 characters long
ctld: /etc/ctl.conf is world-readable

まず「it should be at least 12 characters long」と怒られました.CHAP のパスワード (シークレット) の文字数は12文字以上にしなさいとの事です.
そして一番大事な所ですが「/etc/ctl.conf is world-readable」と怒られています.これは作成したファイルのパーミッションが 644 である為,other が読める状態 (パスワードが見れる状態) である為です.

こういった指摘を修正しましょう.
iscsi-user2 のパスワードを iscsi-user1 同様に修正しています.
world-readable は以下のとおり修正します.そうするとそこの警告は消えました.

# ctld -t
#

サービスの起動

/etc/rc.conf に次の文字を追加します

# cat /etc/rc.conf | grep ctld
ctld_enable="YES"

では,サービスを実行してみましょう

# /etc/rc.d/ctld start
Starting ctld.
ctld: LUN creation warning: error opening /mnt/lun1.img: 2
ctld: LUN creation warning: error opening /mnt/lun2.img: 2
ctld: LUN creation warning: error opening /mnt/lun3.img: 2

「LUN creation warning: error opening /mnt/lun1.img」などと怒られました.
これは事前にファイルを作っていないからとなります.
touch で空の構いませんので作成をしておきます.また,このサービス以外で読める必要もありませんのでパーミッションを落としておきます.

# touch /mnt/lun1.img
# touch /mnt/lun2.img
# touch /mnt/lun3.img

# chmod 600 /mnt/lun1.img
# chmod 600 /mnt/lun2.img
# chmod 600 /mnt/lun3.img

改めてサービスを再起動してみましょう.

# /etc/rc.d/ctld restart
Stopping ctld.
Waiting for PIDS: 944.
Starting ctld.

今度はエラーや警告もなくサービスが起動しました.
これでターゲット側の準備は完了となります.次はクライアント側の設定になります.




seichan

ご連絡は X (twitter) の DM へお願いします.

seichanをフォローする
FreeBSD

seichanをフォローする




コメント

タイトルとURLをコピーしました