FreeBSD で iSCSI を利用する (クライアント/イニシエーター編)

FreeBSD

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

今回は FreeBSD での iSCSI によるディスクの提供について纏めてみたいと思います.
ターゲットのお話および iSCSI とは? については「FreeBSD で iSCSI を利用する (サーバー/ターゲット編)」に纏めていますので合わせてみて頂ければと思います.

FreeBSD でイニシエーターを設定する

前回設定した iSCSI ターゲットをクライアント側(イニシエーター)より利用する為の設定を行います.
イメージ図は前回同様で,iSCSI 用のネットワークが存在する形となります.

FreeBSD での iSCSI イニシエーター機能は iscsid と iscsictl の二つのプログラムによって行われます.
イニシエーター側としてもどのデバイスを利用するのかなどの設定を用意する必要がありますので,以下に例を記載します.

# cat /etc/iscsi.conf
iscsi_target0 {
  targetaddress = 172.16.255.254;
  targetname = iqn.2023-12.iscsi.org.seichan:target0;
  authmethod = chap;
  chapiname = "iscsi-user1";
  chapsecret = "Password-user1";
  tgtchapname = "mutual-user";
  tgtchapsecret = "Password-mutual";
}

iscsi_target1 {
  targetaddress = 172.16.255.254;
  targetname = iqn.2023-12.iscsi.org.seichan:target1;
  authmethod = chap;
  chapiname = "iscsi-user2";
  chapsecret = "Password-user2";
}

iscsi_target2 {
  targetaddress = 172.16.255.254;
  targetname = iqn.2023-12.iscsi.org.seichan:target2;
  authmethod = none;
}

設定ファイルの解説

前回設定したターゲットに合わせた設定ファイルを用意しました.内容について以下に解説します.

  • iscsi_target0 {
    iscsictl コマンドで指定する際の名前(ニックネーム)です.
  • targetaddress
    iSCSI ターゲットの IP アドレスもしくは FQDN を記載します.
  • targetname
    iSCSI ターゲット側で設定しているターゲット名を記載します.
  • authmethod
    iSCSI ターゲットへの接続時に認証を行うのかを指定します.none または chap が指定可能です.
  • chapiname
    認証を行う場合のユーザー名(ログイン名)を記載します.
  • chapsecret
    認証を行う場合のシークレット文字列(パスワード)を記載します.
  • tgtchapname
    相互 CHAP 認証を行う場合のユーザー名(ログイン名)を記載します.
  • tgtchapsecret
    相互 CHAP 認証を行う場合のシークレット文字列(パスワード)を記載します.

なお,/etc/iscsi.conf は認証情報が記載される為,パーミッションを 600 にしましょう.

# chmod 600 /etc/iscsi.conf

サービスの起動

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

# cat /etc/rc.conf
iscsid_enable="YES"
iscsictl_enable="YES"

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

# /etc/rc.d/iscsid start
Starting iscsid.

# /etc/rc.d/iscsictl start
Starting iscsictl.

/etc/iscsi.conf の設定が間違っている場合,iscsictl 起動時にエラーが出力されます.その場合はメッセージに出力される内容をもとに修正してください.

iscsictl を起動すると設定ファイルに従って iSCSI ターゲットへのアクセス,成功したらデバイスファイルが作成されます.
状態を確認するには iscsictl コマンドで行う事が可能です

# iscsictl -L
Target name                          Target portal    State
iqn.2023-12.iscsi.org.seichan:target0 172.16.255.254   Connected: da3 da4
iqn.2023-12.iscsi.org.seichan:target1 172.16.255.254   Connected: da2
iqn.2023-12.iscsi.org.seichan:target2 172.16.255.254   Connected: da1

この場合,(自分が期待する順番と違いましたが…) target0 では二つのボリューム,target1, 2 からはそれぞれ一つのボリュームが見えており,daX として接続されています.
実際にデバイスファイルが存在する事も確認しましょう.

# ls /dev/da*
/dev/da0        /dev/da0p2      /dev/da1        /dev/da3
/dev/da0p1      /dev/da0p3      /dev/da2        /dev/da4

da0 がローカルディスクで OS 領域となります.da1~da4 まで作成されていますので iSCSI の接続は正しく行えています.

では,これをフォーマットし,マウントを行ってみます.また,再起動時もマウントされるように fstab も記載します.
(今回は da1 のみ行います.)

# newfs /dev/da1
/dev/da1: 10240.0MB (20971520 sectors) block size 32768, fragment size 4096
        using 17 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360

# mkdir -p /iscsi/da1

# mount /dev/da1 /iscsi/da1

# df
Filesystem 1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2  19279260 3140972 14595948    18%    /
devfs              1       1        0   100%    /dev
/dev/da1    10144028       8  9332500     0%    /iscsi/da1

# cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0p2      /               ufs     rw      1       1
/dev/da0p3      none            swap    sw      0       0
/dev/da1        /iscsi/da1      ufs     rw      1       1

では再起動を行ったうえで再度確認を行います.

マウントができずに起動途中で停止します.この理由は fstab の書き方に問題があるためとなります.
iSCSI イニシエーターのサービスが起動する前にマウントを試みておりそこで終了するという状態です.
/etc/rc.d 以下のスクリプト群において,ファイルシステムおよび iscsi に関連するものの順番は次のとおりです.

# rcorder /etc/rc.d/* | grep -E "mount|iscsi|fsck"
/etc/rc.d/fsck
/etc/rc.d/mountcritlocal
/etc/rc.d/autounmountd
/etc/rc.d/iscsid
/etc/rc.d/iscsictl
/etc/rc.d/mountcritremote
/etc/rc.d/automountd
/etc/rc.d/automount
/etc/rc.d/mountlate
/etc/rc.d/mountd
/etc/rc.d/bgfsck

mountcritlocal ここでマウントを行おうとしているためにエラーとなります.
また,Pass が 1 の場合,fsck によるファイルシステムチェック対象となり,これもまた mountcritlocal の前の実行になるためにエラーとなります.
そのため,これらを解消できるような /etc/fstab に修正します.

# cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0p2      /               ufs     rw      1       1
/dev/da0p3      none            swap    sw      0       0
/dev/da1        /iscsi/da1      ufs     rw,late 1       0

また,状況によっては iscsictl が起動後接続に至らない可能性があります.これも合わせて対処する場合は /etc/rc.conf に次の一行を追加します.
デフォルトが -Aa で -w 5 を追加し,5秒のウェイトを持たせています.ここは実施可否およびウェイトの時間については実際の環境に応じて実施してください.

iscsictl_flags="-Aa -w 5"

改めて再起動を行ってみます.

このように無事起動が完了しました.マウントの状態としては次のとおりです.

# df
Filesystem 1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2  19279260 3141104 14595816    18%    /
devfs              1       1        0   100%    /dev
/dev/da1    10144028       8  9332500     0%    /iscsi/da1

これで FreeBSD としてマウントまできれいに完了できる状態となりました.

iscsictl コマンドを使って色々とやってみる

iscsictl コマンドで設定ファイルを用いない接続であったり,今接続中のセッションの切断を行ったりなどができます.
さらっと以下に使い方を纏めてみます.

現在の状態を確認する

現在の状態を確認する場合は -L オプションを付けて実行します.
以下の場合は3つのセッションがあり,すべて接続となっており,かつ da1-4 の4つのディスクをつないでいるという状況です.

# iscsictl -L
Target name                          Target portal    State
iqn.2023-12.iscsi.org.seichan:target0 172.16.255.254   Connected: da3 da4
iqn.2023-12.iscsi.org.seichan:target1 172.16.255.254   Connected: da2
iqn.2023-12.iscsi.org.seichan:target2 172.16.255.254   Connected: da1

セッションを無効化する

メンテナンスなどの何らかの理由で一時的に特定のセッションを無効化したい場合は -M オプションを用います.
引数としてセッション ID が必要なので,まずはセッション ID の確認を行う必要があります.これには -L オプションの verbose ありで実施します.

# iscsictl -L -v
Session ID:               1
Initiator name:           iqn.1994-09.org.freebsd:bsd13-1.seichan.local
Initiator portal:
Initiator alias:
Target name:              iqn.2023-12.iscsi.org.seichan:target0
Target portal:            172.16.255.254
Target alias:             target0
User:                     iscsi-user1
Secret:                   Password-user1
Mutual user:              mutual-user
Mutual secret:            Password-mutual
Session type:             Normal
Enable:                   Yes
Session state:            Connected
Failure reason:
Header digest:            None
Data digest:              None
MaxRecvDataSegmentLength: 262144
MaxSendDataSegmentLength: 262144
MaxBurstLen:              1048576
FirstBurstLen:            1048576
ImmediateData:            Yes
iSER (RDMA):              No
Offload driver:           None
Device nodes:             da3 da4

一つのセッションのみ貼り付けていますが「Session ID」が指定するセッションIDになります.
このセッション (ID:1) を切断するとした場合は次のように実行します.

# iscsictl -M -i 1 -e off

# iscsictl -L
Target name                          Target portal    State
iqn.2023-12.iscsi.org.seichan:target0 172.16.255.254   Disabled
iqn.2023-12.iscsi.org.seichan:target1 172.16.255.254   Connected: da2
iqn.2023-12.iscsi.org.seichan:target2 172.16.255.254   Connected: da1

このように,セッション1 (da3, da4) が Disabled となります.
なお,ファイルシステムのアンマウントは先に行ってください.マウント状況にかかわらずセッションは無効化されますので,マウントしているパスへのアクセスが入った瞬間に刺さります.

セッションを再開する

無効化したセッションを再開させる場合は次のように実行します.

# iscsictl -M -i 1 -e on

# iscsictl -L
Target name                          Target portal    State
iqn.2023-12.iscsi.org.seichan:target0 172.16.255.254   Connected: da3 da4
iqn.2023-12.iscsi.org.seichan:target1 172.16.255.254   Connected: da2
iqn.2023-12.iscsi.org.seichan:target2 172.16.255.254   Connected: da1

セッションが再開され,Connected となり,da3, da4 が復活します.

設定ファイルを用いずに接続・切断なども実施できるのですが,ここでは扱いません.
詳しく把握したい方はマニュアル「iscsictl」を参照ください.

以上で iSCSI のターゲットとイニシエーターについての解説を一旦終わります.
一旦というのは,次は GEOM も合わせてのお話で引き続き iSCSI 環境を用いてやっていく予定で考えているからとなります.




seichan

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

seichanをフォローする
FreeBSD

seichanをフォローする




コメント

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