お金をかけずにサーバーの勉強をしよう

Ubuntuで iSCSIディスクを使う

2022年11月18日

メニューへ戻る

FreeNASで作った iSCSIディスクを Ubuntu 22.04.1で使ってみます。

こんにちは。

ソフトウェアiSCSIデバイス(FreeNAS)(前編)
ソフトウェアiSCSIデバイス(FreeNAS)(中編)
ソフトウェアiSCSIデバイス(FreeNAS)(後編)
で、Windowsで iSCSIディスクを使う話を書きましたが、これを Linuxでもやってみようと思います。

環境は Ubuntu Server 22.04.1で、対象の FreeNASで作った iSCSIディスク側は中編で作ったものの応用です。

構成はこんな感じです。
構成図 1

Windowsでマウントした時には、セキュリティを考慮しない形でやりましたが、こちらでは設定に以下を追加してみます。

CHAP認証とは「Callenge-Handshake Authentication Protocol」の略で、iSCSIではいわゆる「ユーザー/パスワード認証」と考えれば良いかと思います。


ところで iSCSIを使っていると、長ったらしい名前が出てきますが、アレについて調べました。

どういう名前体系になっているか調べてみると、RFC3721に規定されていました。
「1.1. Constructing iSCSI names using the iqn. format」がその箇所です。
RFC3721 - Internet Small Computer Systems Interface (iSCSI) Naming and Discovery

この名前が出てくるのはイニシエーターとターゲットの両方で、今回の構成だと以下となっています。

イニシエータiqn.2022-11.ubuntuserver2204:subro.initiator
ターゲットiqn.2005-10.org.freenas.ctl:subro.device

この長ったらしい名前の内訳はこんな感じ。

iqn固定
.区切り
yyyy-mm西暦-月
.区切り
組織ドメインを逆に並べたようなもの
:区切り
サブグループ任意のもの

名前はこのようにしないと動かないということは無いようですが、この命名規則に沿うのが良いようです。
イニシエータは私が作った名前で、ターゲットは FreeNASの設定から自動的に生成されたものです。

構成図ではこんな感じになります。
構成図 1


これからターゲット(FreeNAS)にセキュリティ用の設定を加えていきますが、チョイ横に逸れて FreeNASのWeb画面を日本語化しましょう。

FreeNASにログインしましたら、メニューから[システム]-[全般]と選択し、以下の箇所を日本語設定にします。
(すいません、絵はもう日本語化しちゃった後のものです)
FreeNAS日本語化

これで気持ちよく作業できるようになりました。


ではターゲットの設定を。
メニューから[共有]-[BLOCK共有(iSCSI)]を選択して、各タブの設定を見ていきます。


Target Global Congigurationタブ

そのままで。
ここに上の命名規則に沿った名前が自動で設定されています。
FreeNASターゲット設定 1


Initiatorsタブ

ここの設定でアクセス元になるイニシエータを制限するセットを作成します。

右にある追加を押します。
FreeNASターゲット設定 4

デフォルトでは全てのイニシエータを許可するようになっているので、このチェックは外します。
FreeNASターゲット設定 5

[Authorized Initiators(IQN)]に Ubuntu Serverにあるイニシエータの名前(まだ作ってないけど上に書いた名前にします)を入れてを押します。
FreeNASターゲット設定 6
この名前のイニシエータだけよ!って設定になります。

[Ahthorized Networks]にイニシエータのある Ubuntu ServerのIPアドレスを入れてを押します。
ネットワークを表す「192.168.1.0/24」なんてのでも良いようです。
FreeNASターゲット設定 7
このIP/ネットワークだけよ!って設定になります。

保存を押します。
FreeNASターゲット設定 8

このような行ができました。
FreeNASターゲット設定 9
ここの[Group ID]が「Initiator Group ID」で、後で使いますので覚えておいて下さい。


Authorized Accessタブ

CHAP認証で使うユーザーとパスワードの組み合わせの設定です。

追加を押します。
FreeNASターゲット設定 10

[Group ID]は下のユーザー/パスワード(Secret)のセットに付ける IDで、
[ユーザー]はユーザー名(任意)で、
[Secret][Secret(Confirm)]がパスワード(12文字以上)です。
FreeNASターゲット設定 11

[Peer〜]というのは、双方向認証というのを使う時に指定します。

双方向認証は、イニシエータががターゲットに認証してもらうのに加えて、ターゲットがイニシエータに認証してもらうものです。

後述するイニシエータの設定で、ここと同じようにユーザーとパスワードを設定する箇所があり、そこに設定されたものを[Peer〜]に書いておきます。

ここでは単方向認証にしているので、[Peer〜]は使いません。

保存を押します。
FreeNASターゲット設定 8

このような行ができました。
FreeNASターゲット設定 12
ここの[Group ID]が「Authentication Group Number」で、後で使いますので覚えておいて下さい。


Targetsタブ

ここでターゲットに
・アクセスできるイニシエーター(Initiator Group ID)
・CHAP認証使用の設定
・CHAP認証に使うユーザー/パスワード(Authentication Group Number)
を紐付けます。

ターゲットは既に1つありますんで、右の点々のアイコンをクリックして出てくるメニューから[Edit]を選択します。
FreeNASターゲット設定 13

この3項目で、それぞれ選択します。
FreeNASターゲット設定 14

保存を押します。
FreeNASターゲット設定 15


Portalsタブ

ここにポータルを探索(Discovery)する際の、CHAP認証の設定をします。
ポータルは既に1つありますんで、右の点々のアイコンをクリックすると出るメニューから[Edit]を選択します。
FreeNASターゲット設定 2

出てきた画面で、[Discovery Auth Method]に[CHAP]を選択します。
[Discovery Auth Group]には、Authorized Accessタブで作った Authentication Group Numberを選びました。
FreeNASターゲット設定 3

以上で、FreeNAS側(ターゲット側)の設定は 完了です。


次は、イニシエータの設定です。

Linux用の iSCSIイニシエータには open-iscsi というパッケージがあるんですが、Ubuntu Server 22.04.1ではデフォルトでインストールされていたようです。
(このパッケージで iSCSIのターゲットにもなれます)

パッケージのアップデートを繰り返した上で、2022年11月18日時点で、open-iscsi は 2.1.5 でした。


iSCSIイニシエータ側ですることをシンプルに書くとこんな風になります。

  1. ポータルを探索(Discovery)する
  2. ターゲットにログインする
  3. ブロックデバイスを好きに使う
  4. 使い終わったらターゲットからログアウトする

では、順々にやっていきましょう。

最初にイニシエーターの名前を設定をします。

initiatorname.iscsi ファイルに書いておくのですが、このファイルのパーミッションを見て下さい。

subro@UbuntuServer2204:~$ ls -l /etc/iscsi/initiatorname.iscsi
-rw------- 1 root root 356 11月 17 10:06 /etc/iscsi/initiatorname.iscsi

rootでしか読めません。
つまり秘匿されているということです。

FreeNASでアクセス元のイニシエーター名を制限する項目がありましたが、イニシエーター名自体が秘匿情報なので、制限するのに使える訳です。
セキュリティとしては弱いガードですけど、やらないよりマシって感じですね。

このファイルで生きている(コメント行以外)のはこの1行のみです。
分かりやすいようにデフォルトから変えています。

InitiatorName=iqn.2022-11.ubuntuserver2204:subro.initiator


CHEP認証に必要な情報を設定します。
/etc/iscsi/iscsid.conf ファイルが対象で、以下の箇所を書き換えました。

CHAP認証を使用
#node.session.auth.authmethod = CHAP
 ↓ (コメントアウト)
node.session.auth.authmethod = CHAP

ターゲットにログインするときのユーザーとパスワード
#node.session.auth.username = username
#node.session.auth.password = password
 ↓ (コメントアウト)
node.session.auth.username = subro  ← FreeNASの設定で、Targetsタブで紐付けた Authentication Group Number に属しているユーザー名
node.session.auth.password = 123456789abc  ← FreeNASの設定で、Targetsタブで紐付けた Authentication Group Number に属しているSecret

ポータルを探索(Discovery)するときのユーザーとパスワード
#discovery.sendtargets.auth.username = username
#discovery.sendtargets.auth.password = password
 ↓ (コメントアウト)
discovery.sendtargets.auth.username = subro  ← FreeNASの設定で、Portalsタブで紐付けた Authentication Group Number に属しているユーザー名
discovery.sendtargets.auth.password = 123456789abc  ← FreeNASの設定で、Portalsタブで紐付けた Authentication Group Number に属しているSecret

設定変更したので、iscsidを再起動します。

subro@UbuntuServer2204:~$ sudo systemctl restart iscsid

これからターゲットのディスクを使うようにするので、現在のディスクの状態を取っておきました。

subro@UbuntuServer2204:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 114.9M  1 loop /snap/core/13741
loop1                       7:1    0   115M  1 loop /snap/core/13886
loop2                       7:2    0  55.6M  1 loop /snap/core18/2620
loop3                       7:3    0  63.2M  1 loop /snap/core20/1634
loop4                       7:4    0  63.2M  1 loop /snap/core20/1695
loop5                       7:5    0  79.9M  1 loop /snap/lxd/22923
loop6                       7:6    0   103M  1 loop /snap/lxd/23541
loop7                       7:7    0 254.5M  1 loop /snap/dotnet-sdk/186
loop8                       7:8    0    48M  1 loop /snap/snapd/17336
loop9                       7:9    0  49.6M  1 loop /snap/snapd/17576
loop10                      7:10   0   4.2M  1 loop /snap/tree/18
sda                         8:0    0    30G  0 disk
├─sda1                      8:1    0     1M  0 part
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0    28G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0    28G  0 lvm  /
sr0                        11:0    1   1.4G  0 rom

今あるディスクは sda だけです。


ポータルの探索(Discovery)をします。

subro@UbuntuServer2204:~$ sudo iscsiadm -m discovery -t st -p FreeNAS
192.168.1.109:3260,1 iqn.2005-10.org.freenas.ctl:subro.device

iscsiamdコマンド(open-iscsi administration utility)のオプションは以下の通りです。

-m モードdiscovery
探索します
-t タイプst
sendtargetsの略でターゲットを相手にするということです
-p IPアドレス/マシン名ポータルのIP
ポート指定もできます

コマンド実行の結果、ターゲットの名前が取れていますので、探索は上手く行ったようですね。
探索時のCHAP認証も OKの様子。

ターゲットにログインします。

subro@UbuntuServer2204:~$ sudo iscsiadm -m node -p FreeNAS -T iqn.2005-10.org.freenas.ctl:subro.device -l
Logging in to [iface: default, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260]
Login to [iface: default, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260] successful.
-m モードnode
探索で得られたノードを相手にします
-T ターゲット名指定したターゲットを対象とします
-lログインします

successfulとありますので、ログインに成功しています。

ディスクの状態です。

subro@UbuntuServer2204:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 114.9M  1 loop /snap/core/13741
loop1                       7:1    0   115M  1 loop /snap/core/13886
loop2                       7:2    0  55.6M  1 loop /snap/core18/2620
loop3                       7:3    0  63.2M  1 loop /snap/core20/1634
loop4                       7:4    0  63.2M  1 loop /snap/core20/1695
loop5                       7:5    0  79.9M  1 loop /snap/lxd/22923
loop6                       7:6    0   103M  1 loop /snap/lxd/23541
loop7                       7:7    0 254.5M  1 loop /snap/dotnet-sdk/186
loop8                       7:8    0    48M  1 loop /snap/snapd/17336
loop9                       7:9    0  49.6M  1 loop /snap/snapd/17576
loop10                      7:10   0   4.2M  1 loop /snap/tree/18
sda                         8:0    0    30G  0 disk
├─sda1                      8:1    0     1M  0 part
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0    28G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0    28G  0 lvm  /
sdb                         8:16   0    10G  0 disk
sr0                        11:0    1   1.4G  0 rom

sdbが増えました。\(^o^)/

こうなるとローカルディスクの増設と同じですので、後はいかようにも使えば良いと。

ローカルディスクを増設してファイルシステムとして使う話は「Ubuntuのディスク増設」に書いていますので、ご参考に。


iSCSIディスクを使い終わった後の取り外しは以下の通りです。

ターゲットからログアウトします。

subro@UbuntuServer2204:~$ sudo iscsiadm -m node -p FreeNAS -T iqn.2005-10.org.freenas.ctl:subro.device -u
Logging out of session [sid: 2, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260]
Logout of [sid: 2, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260] successful.
-uログアウトします

successfulとありますので、ログアウトに成功しています。

ここまでやるかは、状況で分かりますが、探索(Discovery)で見つけたターゲットをイニシエータの登録情報から削除する方法です。

subro@UbuntuServer2204:~$ sudo iscsiadm -m node -o delete -T iqn.2005-10.org.freenas.ctl:subro.device
Logging out of session [sid: 1, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260]
Logout of [sid: 1, target: iqn.2005-10.org.freenas.ctl:subro.device, portal: 192.168.1.109,3260] successful.
-o データベース操作delete
探索データベースから削除します


これだけ実行すると、探索データベースの内容を取れます。

subro@UbuntuServer2204:~$ sudo iscsiadm -m node
iscsiadm: No records found

何も取れてないので、削除できています。


以上で終わりです。


Windowsの時は GUIでチョイチョイだったんですが、Linuxは全部コマンドでやりました。
でもこちらの方が iSCSIのお作法の勉強では役に立ちましたね。

FreeNASの iSCSIディスクのターゲットやポータルの設定も open-iscsiのイニシエータの設定も、もっと奥が深いところがあるのでとても抑えきれませんが、ここまでやればいざ本物の iSCSIストレージハードウェアにあたっても、応用が効くと思います。


元々このネタは、Kubernetesに複数展開した NGINXの podで共通の永続ストレージを使いたいからとやり始めたのですが、よく考えてみると iSCSIの場合はブロックデバイスでの提供となるので、ちょっとその用途には使えないと途中で気づきました。

VMWareのクラスタに共有ストレージとして提供し、VMFS(Virtual Machine File System)を複数の ESXiノードに使わせる…なんてパターンが適切なんだろうって思います。


何かととっつき難い iSCSI、何でかと考えました。
node・portal・targetが入り混じっているような感じですし、initiator/target も分かり辛い。
CHAPの双方向認証も最初は「?」で、peerって何よ?とか用語的にも特殊で混乱する要素が多い気もしますね。

何かこう大きな紙に図を書き出して、用語の対比を書き込んでみたら分かるようになるのではないでしょうか。