6 Linux I-Oストレージの操作
Oracle Linuxでは、Linux-IO Target (LIO)を使用して、FCoE、iSCSIおよびMellanox InfiniBand (iSERおよびSRP)のブロック・ストレージSCSIターゲットが提供されます。LIOはtargetcli
パッケージで提供されるtargetcliシェルを使用して管理します。Mellanox InfiniBandはUEKでのみサポートされています。 targetcli
パッケージは、次を実行してインストールできます:
sudo dnf install -y targetcli
Fibre Channel over Ethernet (FCoE)は、ファイバ・チャネル・パケットをイーサネット・フレームにカプセル化し、イーサネット・ネットワーク上で送信できるようにします。FCoEストレージを構成するには、fcoemon
サービスおよびfcoeadmコマンドの両方を含むfcoe-utils
パッケージをインストールする必要があります。fcoe-utils
パッケージは、次を実行してインストールできます:
sudo dnf install -y fcoe-utils
iSCSIデバイスについて
インターネット・スモール・コンピュータ・システム・インタフェース (iSCSI)は、ストレージ・デバイスを接続するためのIPベースの標準です。iSCSIはSCSIコマンドをIPネットワーク・パケットにカプセル化し、長距離でのデータ転送とクライアント・システム別のストレージの共有をサポートします。iSCSIは既存のIPインフラストラクチャを使用し、ファイバ・チャネル(FC)ストレージ・エリア・ネットワークを実装するために必要な光ファイバ配線およびインタフェース・アダプタの購入と設置が必要ありません。
クライアント・システム(iSCSIイニシエータ)は、IPネットワークを介してストレージ・サーバー(iSCSIターゲット)にアクセスします。iSCSIイニシエータには、ストレージがローカルにアタッチされているように見えます。
通常、iSCSIターゲットはネットワークで接続された専用のストレージ・デバイスですが、汎用コンピュータを使用することもできます。
図6-1に、iSCSIターゲットにアタッチされた共有ストレージに複数のiSCSIイニシエータがアクセスできる単純なネットワークを示します。
図6-1 IPベース・ネットワーク経由で接続されたiSCSIイニシエータとiSCSIターゲット
ハードウェアベースのiSCSIイニシエータは専用のiSCSI HBAを使用します。Oracle Linuxでは、iSCSIイニシエータ機能をソフトウェアでサポートしています。カーネルに常駐するデバイス・ドライバで既存のネットワーク・インタフェース・カード(NIC)およびネットワーク・スタックを使用して、ハードウェアiSCSIイニシエータをエミュレートします。iSCSIイニシエータ機能は、システムBIOSのレベルでは使用できません。したがって、iSCSIストレージからOracle Linuxシステムをブートすることはできません。
パフォーマンスを向上するために、ネットワーク・カードの中にはハードウェアでiSCSIのTCPフレームを作成できるTCP/IPオフロード・エンジン(TOE)を実装しているものがあります。Oracle LinuxではTOEをサポートしていませんが、一部のカード・ベンダーから適切なドライバを直接入手できます。
LIOの詳細は、http://linux-iscsi.org/wiki/Main_Pageを参照してください。
iSCSIターゲットの構成
次の手順では、ブロック・ストレージ・バックエンドを使用してOracle Linuxシステムで基本的なiSCSIターゲットを設定する方法について説明します。他のストレージ・バックエンド・タイプを使用して、iSCSIターゲットを設定できます。
この例では、targetcliコマンドは現在の構成を/etc/target/saveconfig.json
に保存します。詳細は、targetcli(8)
マニュアル・ページを参照してください。
-
targetcli対話型シェルを実行します。
sudo targetcli
targetcli shell version 2.1.53 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'.
-
(オプション) lsコマンドを使用して、オブジェクト階層(最初は空)をリストします。
ls
o- / ..................................................................... [...] o- backstores .......................................................... [...] | o- block .............................................. [Storage Objects: 0] | o- fileio ............................................. [Storage Objects: 0] | o- pscsi .............................................. [Storage Objects: 0] | o- ramdisk ............................................ [Storage Objects: 0] o- iscsi ........................................................ [Targets: 0] o- loopback ..................................................... [Targets: 0]
-
次のように、
/backstores/block
ディレクトリに移動し、LUNとして提供するディスク・パーティションにブロック・ストレージ・オブジェクトを作成します。cd /backstores/block /backstores/block> create name=LUN_0 dev=/dev/sdb Created block storage object LUN_0 using /dev/sdb. /backstores/block> create name=LUN_1 dev=/dev/sdc Created block storage object LUN_1 using /dev/sdc.
ストレージ・オブジェクトに割り当てる名前は任意です。
ノート:
デバイス・パスは、Oracle Linuxインスタンスのディスク構成によって異なります。
-
/iscsi
ディレクトリに移動し、iSCSIターゲットを作成します。cd /iscsi /iscsi> create Created target iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344. Created TPG 1.
-
(オプション): 最初は空のターゲット・ポータル・グループ(TPG)階層をリストします。
/iscsi> ls
o- iscsi .......................................................... [Targets: 1] o- iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344 .............. [TPGs: 1] o- tpg1 ............................................. [no-gen-acls, no-auth] o- acls ........................................................ [ACLs: 0] o- luns ........................................................ [LUNs: 0] o- portals .................................................. [Portals: 0]
-
TPGディレクトリ階層の
luns
サブディレクトリに移動し、LUNをターゲット・ポータル・グループに追加します。/iscsi> cd iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344/tpg1/luns /iscsi/iqn.20...344/tpg1/luns> create /backstores/block/LUN_0 Created LUN 0. /iscsi/iqn.20...344/tpg1/luns> create /backstores/block/LUN_1 Created LUN 1.
-
TPGディレクトリ階層の
portals
サブディレクトリに移動し、iSCSIエンドポイントのIPアドレスとTCPポートを指定します。/iscsi/iqn.20...344/tpg1/luns> cd ../portals /iscsi/iqn.20.../tpg1/portals> create 10.150.30.72 3260 Using default IP port 3260 Created network portal 10.150.30.72:3260.
デフォルトのTCPポート番号は
3260
です。ノート:
既存のデフォルト・ポータルではポータルの作成が失敗し、次のようなメッセージが生成されます。Could not create NetworkPortal in configFS
問題を解決するには、デフォルトのポータルを削除してから、新しいポータルをもう一度作成します。次に例を示します。
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260
-
ポートを追加するか、iSCSIターゲットを追加して、TCPポート3260を有効にします。
-
ポートを追加します。
sudo firewall-cmd --permanent --add-port=3260/tcp
-
ターゲットを追加します。
sudo firewall-cmd --permanent --add-service \ iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344
-
-
ここで、構成されたブロック・ストレージ・オブジェクトとTPGを示すオブジェクト階層をリストします。
/iscsi/iqn.20.../tpg1/portals> ls /
o- / ..................................................................... [...] o- backstores .......................................................... [...] | o- block .............................................. [Storage Objects: 1] | | o- LUN_0 ....................... [/dev/sdb (10.0GiB) write-thru activated] | | o- LUN_1 ....................... [/dev/sdc (10.0GiB) write-thru activated] | o- fileio ............................................. [Storage Objects: 0] | o- pscsi .............................................. [Storage Objects: 0] | o- ramdisk ............................................ [Storage Objects: 0] o- iscsi ........................................................ [Targets: 1] | o- iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344 ............ [TPGs: 1] | o- tpg1 ........................................... [no-gen-acls, no-auth] | o- acls ...................................................... [ACLs: 0] | o- luns ...................................................... [LUNs: 1] | | o- lun0 ..................................... [block/LUN_0 (/dev/sdb)] | | o- lun1 ..................................... [block/LUN_1 (/dev/sdc)] | o- portals ................................................ [Portals: 1] | o- 10.150.30.72:3260 ............................................ [OK] o- loopback ..................................................... [Targets: 0]
-
イニシエータがログインするためのアクセス権を構成します。
たとえば、認証を必要としないデモ・モードを構成するには、次の例に示すように、TGPディレクトリに移動し、属性を設定します。
/iscsi/iqn.20.../tpg1/portals> cd .. /iscsi/iqn.20...14f87344/tpg1> set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1 Parameter authentication is now '0'. Parameter demo_mode_write_protect is now '0'. Parameter generate_node_acls is now '1'. Parameter cache_dynamic_acls is now '1'.
注意:
デモ・モードは本質的に安全ではありません。安全な認証モード構成の詳細は、http://linux-iscsi.org/wiki/ISCSI#Define_access_rightsを参照してください。
-
root
(/
)ディレクトリに変更し、構成を保存します。このステップにより、システムの再起動後も変更が保持されます。このステップを省略すると、空の構成になる可能性があります。
/iscsi/iqn.20...14f87344/tpg1> cd / /> saveconfig Last 10 configs saved in /etc/target/backup. Configuration saved to /etc/target/saveconfig.json
-
ターゲット・サービスを有効にします。
sudo systemctl enable target.service
iSCSIターゲットの保存済構成のリストア
iSCSIターゲットの保存済構成をリストアするには、targetcli対話型シェルを起動し、次のコマンドを実行します。
sudo targetcli
targetcli shell version 2.1.fb46 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> restoreconfig /etc/target/saveconfig.json
/etc/target/saveconfig.json
ファイルには、最後に保存された構成が格納されます。
もう1つの方法として、次のコマンドを実行して、保存済構成を前のバージョンからリストアします。
/> restoreconfig /etc/target/backup/saveconfig-20180516-18:53:29.json
iSCSIイニシエータの構成
-
iscsi-initiator-utils
パッケージをインストールします。sudo dnf install iscsi-initiator-utils
-
SendTargetsやInternet Storage Name Service (iSNS)などの検出メソッドを使用して、指定したIPアドレスでiSCSIターゲットを検出します。
たとえば、次のようにSendTargetsを使用します。
sudo iscsiadm -m discovery -t sendtargets -p 10.150.30.72
次のような出力結果が表示されます。
10.150.30.72:3260,1 iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344
iscsid
サービスが実行されていない場合は、このコマンドによって起動されます。ノート:
検出プロセスを実行する前に、ファイアウォールがiSCSIターゲットとの通信を受け入れるように構成されており、ICMPトラフィックが許可されていることを確認します。
-
検出データベースに現在格納されているターゲットに関する情報を表示します。
sudo iscsiadm -m discoverydb -t st -p 10.150.30.72
# BEGIN RECORD 6.2.0.873-14 discovery.startup = manual discovery.type = sendtargets discovery.sendtargets.address = 10.150.30.72 discovery.sendtargets.port = 3260 discovery.sendtargets.auth.authmethod = None discovery.sendtargets.auth.username = <empty> discovery.sendtargets.auth.password = <empty> discovery.sendtargets.auth.username_in = <empty> discovery.sendtargets.auth.password_in = <empty> discovery.sendtargets.timeo.login_timeout = 15 discovery.sendtargets.use_discoveryd = No discovery.sendtargets.discoveryd_poll_inval = 30 discovery.sendtargets.reopen_max = 5 discovery.sendtargets.timeo.auth_timeout = 45 discovery.sendtargets.timeo.active_timeout = 30 discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768 # END RECORD
-
セッションを確立し、特定のターゲットにログインします。
sudo iscsiadm -m node -T iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344 \ -p 10.150.30.72:3260 -l
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.localhost.x8664: sn.ef8e14f87344, portal: 10.150.30.72,3260] successful.
-
セッションがアクティブであることを検証し、使用可能なLUNを表示します。
sudo iscsiadm -m session -P 3
次のような出力結果が表示されます。
iSCSI Transport Class version 2.0-870 version 6.2.0.873-14 Target: iqn.2003-01.com.mydom.host01.x8664:sn.ef8e14f87344 (non-flash) Current Portal: 10.0.0.2:3260,1 Persistent Portal: 10.0.0.2:3260,1 ********** Interface: ********** Iface Name: default Iface Transport: tcp Iface Initiatorname: iqn.1994-05.com.mydom:ed7021225d52 Iface IPaddress: 10.0.0.2 Iface HWaddress: <empty> Iface Netdev: <empty> SID: 5 iSCSI Connection State: LOGGED IN iSCSI Session State: LOGGED_IN Internal iscsid Session State: NO CHANGE . . . ************************ Attached SCSI devices: ************************ Host Number: 8 State: running scsi8 Channel 00 Id 0 Lun: 0 Attached scsi disk sdb State: running scsi8 Channel 00 Id 0 Lun: 1 Attached scsi disk sdc State: running
LUNはローカルの/dev
ディレクトリのSCSIブロック・デバイス(sd*
)として表されます。たとえば:
sudo fdisk -l | grep /dev/sd[bc]
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
複数のターゲットLUNを区別するには、次のコマンドを使用して表示される/dev/disk/by-path
の下のパスを調査します。
ls -l /dev/disk/by-path/
lrwxrwxrwx 1 root root 9 May 15 21:05 ip-10.150.30.72:3260-iscsi-iqn.2013-01.com.mydom.host01.x8664: sn.ef8e14f87344-lun-0 -> ../../sdb lrwxrwxrwx 1 root root 9 May 15 21:05 ip-10.150.30.72:3260-iscsi-iqn.2013-01.com.mydom.host01.x8664: sn.ef8e14f87344-lun-1 -> ../../sdc
次のように、/var/log/messages
ファイルのLUNに対する初期化メッセージを表示できます。
grep sdb /var/log/messages
... May 18 14:19:36 localhost kernel: [12079.963376] sd 8:0:0:0: [sdb] Attached SCSI disk ...
LUNは、LVM物理ボリューム、ファイル・システム、スワップ・パーティション、自動ストレージ管理(ASM)ディスク、RAWデバイスなど、その他の物理ストレージ・デバイスと同じ方法で構成および使用します。
/etc/fstab
のiSCSI LUNのマウント・エントリを作成する場合は、_netdev
オプションを指定します。次に例を示します。
UUID=084591f8-6b8b-c857-f002-ecf8a3b387f3 /iscsi_mount_point ext4 _netdev 0 0
このオプションは、ネットワーク・アクセスを必要とするデバイス上にファイル・システムが存在することを意味し、ネットワークが有効になるまで、システムによるファイル・システムのマウントが防止されます。
ノート:
/etc/fstab
にiSCSI LUNエントリを追加する場合は、デバイス・パスではなく、UUID=
UUIDを使用してLUNを参照します。デバイス・パスは、ストレージを再接続したり、システムを再起動した後に変更される場合があります。ブロック・デバイスのUUID
を表示するには、blkidコマンドを使用します。
検出されたLUNは、ターゲットが引き続きそれらのLUNを処理する場合は、再起動後も有効であり、ターゲットからログオフされません。
詳細は、iscsiadm(8)
およびiscsid(8)
の各マニュアル・ページを参照してください。
検出データベースの更新
iSCSIターゲットで使用可能なLUNが変更された場合は、iSCSIイニシエータでiscsiadmコマンドを使用して、その検出データベースのエントリを更新します。次の例では、ターゲットがSendTargets検出メソッドをサポートすることを想定しています
データベースにない新規レコードを追加するには:
sudo iscsiadm --mode discoverydb -type st -p 10.150.30.72 -o new --discover
データベースの既存のレコードを更新するには:
sudo iscsiadm -m discoverydb -t st -p 10.150.30.72 -o update --discover
ターゲットがすでにサポートしていないデータベースからレコードを削除するには:
sudo iscsiadm -m discoverydb -t st -p 10.150.30.72 -o delete --discover
詳細は、iscsiadm(8)
マニュアル・ページを参照してください。