7 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ターゲットはネットワークで接続された専用のストレージ・デバイスですが、汎用コンピュータを使用することもできます。

図7-1に、iSCSIターゲットにアタッチされた共有ストレージに複数のiSCSIイニシエータがアクセスする単純なネットワークを示します。

図7-1 IPベース・ネットワーク経由で接続されたiSCSIイニシエータとiSCSIターゲット


この図は、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)マニュアル・ページを参照してください。

  1. targetcli対話型シェルを実行します。

    sudo targetcli
    targetcli shell version 2.1.53
    Copyright 2011-2013 by Datera, Inc and others.
    For help on commands, type 'help'.
  2. (オプション) 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]
  3. 次のように、/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インスタンスのディスク構成によって異なります。

  4. /iscsiディレクトリに移動し、iSCSIターゲットを作成します。

    cd /iscsi
    /iscsi> create
    Created target iqn.2013-01.com.mydom.host01.x8664:sn.ef8e14f87344.
    Created TPG 1.
  5. (オプション): 最初は空のターゲット・ポータル・グループ(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]
  6. 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.
  7. 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
  8. ポートを追加するか、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
  9. ここで、構成されたブロック・ストレージ・オブジェクトと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]
  10. イニシエータがログインするためのアクセス権を構成します。

    たとえば、認証を必要としないデモ・モードを構成するには、次の例に示すように、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を参照してください。

  11. root (/)ディレクトリに変更し、構成を保存します。

    このステップにより、システムの再起動後も変更が保持されます。このステップを省略すると、空の構成になる可能性があります。

    /iscsi/iqn.20...14f87344/tpg1> cd /
    /> saveconfig
    Last 10 configs saved in /etc/target/backup.
    Configuration saved to /etc/target/saveconfig.json
  12. ターゲット・サービスを有効にします。

    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イニシエータの構成

  1. iscsi-initiator-utilsパッケージをインストールします。

    sudo dnf install iscsi-initiator-utils
  2. 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トラフィックが許可されていることを確認します。

  3. 検出データベースに現在格納されているターゲットに関する情報を表示します。

    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
  4. セッションを確立し、特定のターゲットにログインします。

    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.
  5. セッションがアクティブであることを検証し、使用可能な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)マニュアル・ページを参照してください。