FreeNASで作った iSCSIディスクを Ubuntu 22.04.1で使ってみます。
こんにちは。
「ソフトウェアiSCSIデバイス(FreeNAS)(前編)」
「ソフトウェアiSCSIデバイス(FreeNAS)(中編)」
「ソフトウェアiSCSIデバイス(FreeNAS)(後編)」
で、Windowsで iSCSIディスクを使う話を書きましたが、これを Linuxでもやってみようと思います。
環境は Ubuntu Server 22.04.1で、対象の FreeNASで作った iSCSIディスク側は中編で作ったものの応用です。
構成はこんな感じです。
Windowsでマウントした時には、セキュリティを考慮しない形でやりましたが、こちらでは設定に以下を追加してみます。
- アクセス元IPを限定する
- アクセス元イニシエーターを限定する
- ポータルの探索(Discovery)時にCHAP認証を使う
- ターゲットアクセス時にCHAP認証を使う
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の設定から自動的に生成されたものです。
構成図ではこんな感じになります。
これからターゲット(FreeNAS)にセキュリティ用の設定を加えていきますが、チョイ横に逸れて FreeNASのWeb画面を日本語化しましょう。
FreeNASにログインしましたら、メニューから[システム]-[全般]と選択し、以下の箇所を日本語設定にします。
(すいません、絵はもう日本語化しちゃった後のものです)
これで気持ちよく作業できるようになりました。
ではターゲットの設定を。
メニューから[共有]-[BLOCK共有(iSCSI)]を選択して、各タブの設定を見ていきます。
Target Global Congigurationタブ
そのままで。
ここに上の命名規則に沿った名前が自動で設定されています。
Initiatorsタブ
ここの設定でアクセス元になるイニシエータを制限するセットを作成します。
右にある追加を押します。
デフォルトでは全てのイニシエータを許可するようになっているので、このチェックは外します。
[Authorized Initiators(IQN)]に Ubuntu Serverにあるイニシエータの名前(まだ作ってないけど上に書いた名前にします)を入れて+を押します。
この名前のイニシエータだけよ!って設定になります。
[Ahthorized Networks]にイニシエータのある Ubuntu ServerのIPアドレスを入れて+を押します。
ネットワークを表す「192.168.1.0/24」なんてのでも良いようです。
このIP/ネットワークだけよ!って設定になります。
保存を押します。
このような行ができました。
ここの[Group ID]が「Initiator Group ID」で、後で使いますので覚えておいて下さい。
Authorized Accessタブ
CHAP認証で使うユーザーとパスワードの組み合わせの設定です。
追加を押します。
[Group ID]は下のユーザー/パスワード(Secret)のセットに付ける IDで、
[ユーザー]はユーザー名(任意)で、
[Secret][Secret(Confirm)]がパスワード(12文字以上)です。
[Peer〜]というのは、双方向認証というのを使う時に指定します。
双方向認証は、イニシエータががターゲットに認証してもらうのに加えて、ターゲットがイニシエータに認証してもらうものです。
後述するイニシエータの設定で、ここと同じようにユーザーとパスワードを設定する箇所があり、そこに設定されたものを[Peer〜]に書いておきます。
ここでは単方向認証にしているので、[Peer〜]は使いません。
保存を押します。
このような行ができました。
ここの[Group ID]が「Authentication Group Number」で、後で使いますので覚えておいて下さい。
Targetsタブ
ここでターゲットに
・アクセスできるイニシエーター(Initiator Group ID)
・CHAP認証使用の設定
・CHAP認証に使うユーザー/パスワード(Authentication Group Number)
を紐付けます。
ターゲットは既に1つありますんで、右の点々のアイコンをクリックして出てくるメニューから[Edit]を選択します。
この3項目で、それぞれ選択します。
保存を押します。
Portalsタブ
ここにポータルを探索(Discovery)する際の、CHAP認証の設定をします。
ポータルは既に1つありますんで、右の点々のアイコンをクリックすると出るメニューから[Edit]を選択します。
出てきた画面で、[Discovery Auth Method]に[CHAP]を選択します。
[Discovery Auth Group]には、Authorized Accessタブで作った Authentication Group Numberを選びました。
以上で、FreeNAS側(ターゲット側)の設定は 完了です。
次は、イニシエータの設定です。
Linux用の iSCSIイニシエータには open-iscsi というパッケージがあるんですが、Ubuntu Server 22.04.1ではデフォルトでインストールされていたようです。
(このパッケージで iSCSIのターゲットにもなれます)
パッケージのアップデートを繰り返した上で、2022年11月18日時点で、open-iscsi は 2.1.5 でした。
iSCSIイニシエータ側ですることをシンプルに書くとこんな風になります。
- ポータルを探索(Discovery)する
- ターゲットにログインする
- ブロックデバイスを好きに使う
- 使い終わったらターゲットからログアウトする
では、順々にやっていきましょう。
最初にイニシエーターの名前を設定をします。
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って何よ?とか用語的にも特殊で混乱する要素が多い気もしますね。
何かこう大きな紙に図を書き出して、用語の対比を書き込んでみたら分かるようになるのではないでしょうか。