13.5. iSCSI ベースのストレージプール

このセクションでは、ゲスト仮想マシンを格納するために iSCSI ベースのデバイスを作成する方法について説明します。これにより、ブロックストレージデバイスとして iSCSI を使用するなどのさらに柔軟なストレージオプションが許可されます。iSCSI デバイスは、Linux のマルチプロトコル SCSI ターゲットである LIO ターゲットを使用します。iSCSI のほかにも、LIO はファイバーチャネルおよびファイバーチャネルオーバーイーサネット (FCoE: Fibre Channel over Ethernet) もサポートします。
iSCSI (Internet Small Computer System Interface) とは、ストレージデバイスを共有するためのネットワークプロトコルです。iSCSI では、IP 層全体での SCSI の指示を使用してイニシエーター (ストレージクライアント) をターゲット (ストレージサーバー) に接続します。

13.5.1. ソフトウェア iSCSI ターゲットの設定

Red Hat Enterprise Linux 7 で導入された iSCSI ターゲットは、targetcli パッケージで作成されます。これにより、ソフトウェアベースの iSCSI ターゲットを作成するためのコマンドセットが提供されます。

手順13.4 iSCSI ターゲットの作成

  1. 必須パッケージをインストールします。

    targetcli パッケージとすべての依存関係をインストールします。
    # yum install targetcli
  2. targetcli を起動します。

    targetcli コマンドセットを起動します。
    # targetcli
  3. ストレージオブジェクトを作成します。

    「LVM ベースのストレージプール」で作成されたデバイスを使用して、以下のように 3 つのストレージオブジェクトを作成します。
    1. /backstores/block ディレクトリーに変更してから以下のコマンドを実行して、ブロックストレージオブジェクトを作成します。
      # create [block-name][filepath]
      例:
       # create block1 dev=/dev/vdb1
    2. fileio ディレクトリーに変更してから以下のコマンドを実行して、fileio オブジェクトを作成します。
      # create [fileioname] [imagename] [image-size]
      例:
      # create fileio1 /foo.img 50M
    3. ramdisk ディレクトリーに変更してから以下のコマンドを実行して、ramdisk オブジェクトを作成します。
      # create [ramdiskname] [size]
      例:
      # create ramdisk1 1M
    4. このステップで作成したディスクの名前は後で必要になるため、忘れないようにしてください。
  4. /iscsi ディレクトリーに移動します。

    iscsi ディレクトリーに変更します。
    #cd /iscsi
  5. iSCSI ターゲットを作成します。

    iSCSI ターゲットを以下の 2 つの方法で作成します。
    1. 追加パラメーターが指定されていない create は、IQN を自動生成します。
    2. create iqn.2010-05.com.example.server1:iscsirhel7guest は、指定されるサーバーに特定の IQN を作成します。
  6. ターゲットポータルグループ (TPG) を定義します。

    各 iSCSI ターゲットでは、ターゲットポータルグループ (TPG) を定義する必要があります。この例では、デフォルトの tpg1 が使用されますが、さらに多くの tpg を追加することもできます。これは最も一般的な設定であるため、この例では tpg1 を設定します。これを実行するには、/iscsi ディレクトリーにいることを確認してから、/tpg1 ディレクトリーに変更します。
    # /iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest/tpg1
  7. ポータル IP アドレスを定義します。

    iSCSI 上でブロックストレージをエクスポートするには、ポータル、LUN および ACL をすべて最初に設定する必要があります。
    ポータルには、ターゲットがリッスンし、イニシエーターが接続する IP アドレスおよび TCP ポートが含まれます。iSCSI は、デフォルトで設定されるポートのポート 3260 を使用します。このポートに接続するには、/tpg ディレクトリーから以下のコマンドを実行します。
    # portals/ create
    このコマンドには、このポートをリッスンするすべての利用可能な IP アドレスが含まれます。単一の IP アドレスのみがポートでリッスンするように指定するには、portals/ create [ipaddress] を実行します。指定される IP アドレスはポート 3260 をリッスンするように設定されます。
  8. LUN を設定し、ストレージオブジェクトをファブリックに割り当てます。

    このステップでは、手順13.4「iSCSI ターゲットの作成」で作成されるストレージデバイスを使用します。ステップ 6 で作成した TPG の luns ディレクトリーに、またはたとえば iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest となるように必ず変更を加えてください。
    1. 最初の LUN を以下のように ramdisk に割り当てます。
      # create /backstores/ramdisk/ramdisk1
    2. 2 番目の LUN を以下のようにブロックディスクに割り当てます。
      # create /backstores/block/block1
    3. 3 番目の LUN を以下のように fileio ディスクに割り当てます。
      # create /backstores/fileio/file1
    4. 結果として生じる LUN の一覧表示はこの画面の出力のようになります。
      /iscsi/iqn.20...csirhel7guest/tpg1 ls
      
      o- tgp1 ............................................................................[enabled, auth]
         o- acls..................................................................................[0 ACL]
         o- luns.................................................................................[3 LUNs]
         | o- lun0.....................................................................[ramdisk/ramdisk1]
         | o- lun1..............................................................[block/block1 (dev/vdb1)]
         | o- lun2...............................................................[fileio/file1 (foo.img)]
         o- portals............................................................................[1 Portal]
           o- IP-ADDRESS:3260........................................................................[OK]
  9. 各イニシエーターに ACL を作成します。

    このステップでは、イニシエーターが接続する際に認証の作成を許可します。さらに、指定された LUN の指定されたイニシエーターへの制限を許可します。ターゲットとイニシエーターの両方には、固有の名前があります。iSCSI イニシエーターは IQN を使用します。
    1. iSCSI イニシエーターの IQN を検索するには、イニシエーターの名前を置き換え、以下のコマンドを実行します。
      # cat /etc/iscsi/initiatorname.iscsi
      この IQN を使用して ACL を作成します。
    2. acls ディレクトリーに切り替えます。
    3. コマンド create [iqn] を実行するか、または特定の ACL を作成します。以下の例を参照してください。
      # create iqn.2010-05.com.example.foo:888
      または、すべてのイニシエーターの単一ユーザー ID およびパスワードを使用するようにカーネルターゲットを設定し、そのユーザー ID およびパスワードですべてのイニシエーターがログインできるようにするには、以下のコマンドを使用します (userid および password を置き換えます)。
      # set auth userid=redhat
      # set auth password=password123
      # set attribute authentication=1
      # set attribute generate_node_acls=1
  10. saveconfig コマンドを使って設定を永続化します。これにより、直前の起動設定を上書きします。または、targetcli から exit を実行すると、デフォルトでターゲット設定が保存されます。
  11. systemctl enable target.service でサービスを有効にし、次回の起動時に保存された設定を適用します。

手順13.5 オプションのステップ

  1. LVM ボリュームを作成します。

    LVM ボリュームは、iSCSI のバッキングイメージに役に立ちます。LVM のスナップショットやサイズ変更は、ゲスト仮想マシンに使える便利な機能です。この例では、iSCSI でゲスト仮想マシンをホストするために RAID5 アレイ上の virtstore という名前の新規ボリュームグループ上に virtimage1 という名前の LVM イメージを作成しています。
    1. RAID アレイを作成します。

      ソフトウェア RAID5 アレイの作成については、Red Hat Enterprise Linux 7 ストレージ管理ガイドで説明されています。
    2. LVM ボリュームグループを作成します。

      vgcreate コマンドを使用して virtstore という名前の論理ボリュームグループを作成します。
      # vgcreate virtstore /dev/md1
    3. LVM 論理ボリュームを作成します。

      lvcreate コマンドを使用して、virtimage1 という名前の論理ボリュームグループ (サイズは 20GB) を virtstore ボリュームグループ上に作成します。
      # lvcreate **size 20G -n virtimage1 virtstore
      これで新規論理ボリュームのvirtimage1 を iSCSI に使用する準備が整いました。

      重要

      カーネルのターゲットバックストアの LVM ボリュームを使用すると、イニシエーターが LVM を使ってエクスポートされたボリュームのパーティション設定を行う場合に問題が発生する可能性があります。これは、global_filter = ["r|^/dev/vg0|"]/etc/lvm/lvm.conf に追加することによって解決できます。
  2. オプション: 検出テスト

    新規の iSCSI デバイスが検出可能かどうかを検証します。
    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    127.0.0.1:3260,1 iqn.2010-05.com.example.server1:iscsirhel7guest
  3. オプション: デバイス接続テスト

    新規デバイス (iqn.2010-05.com.example.server1:iscsirhel7guest) を割り当て、デバイスが割り当て可能であるかどうかを判別します。
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 10.0.0.1,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 10.0.0.1,3260] successful.
  4. デバイスの割り当てを解除します。
    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 10.0.0.1,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 10.0.0.1,3260] successful.
これで iSCSI デバイスを仮想化に使用する準備が整いました。

13.5.2. virt-manager での iSCSI ストレージプールの作成

以下の手順では、virt-manager で iSCSI ターゲットを持つストレージプールを作成します。

手順13.6 iSCSI デバイスの virt-manager への追加

  1. ホストマシンのストレージ詳細を開きます。

    1. virt-manager で、編集 をクリックしてから、ドロップダウンメニューより 接続の詳細 を選択します。
    2. ストレージ タブをクリックします。
      ストレージメニュー

      図13.15 ストレージメニュー

  2. 新規プールを追加します (ステップ 1/2)。

    + ボタン (プールの追加ボタン) を押します。新規ストレージプールを追加 ウィザードが表示されます。
    iSCSI ストレージプールの名前とタイプを追加します。

    図13.16 iSCSI ストレージプールの名前とタイプを追加します。

    ストレージプールの名前を選択して、タイプを iSCSI に変更してから 進む を押して次に進みます。
  3. 新規プールを追加します (ステップ 2/2)。

    このメニューのフィールドへの入力を完了するには、「iSCSI ベースのストレージプール」で使用した情報が必要になります。
    1. iSCSI ソースおよびターゲットを入力します。フォーマットはゲスト仮想マシンが処理するため、フォーマット オプションは選択できません。さらに、ターゲットパス を編集することは推奨されていません。デフォルトのターゲットパスの値 /dev/disk/by-path/ は、ドライブパスをそのディレクトリーに追加します。ターゲットパスは、移行のためにすべてのホスト物理マシン上で同一である必要があります。
    2. iSCSI ターゲットのホスト名または IP アドレスを入力します。この例では、host1.example.com を使用します。
    3. ソース IQN フィールドには、iSCSI ターゲット IQN を入力します。「iSCSI ベースのストレージプール」を参照すると、これは /etc/tgt/targets.conf file に追加した情報であることが分かります。この例では、iqn.2010-05.com.test_example.server1:iscsirhel7guest を使用しています。
    4. (オプション) イニシエーターの IQN チェックボックスにチェックマークを付けて、イニシエーターの IQN を入力します。この例では、iqn.2010-05.com.example.host1:iscsirhel7 を使用しています。
    5. 完了 をクリックすると、新規のストレージプールが作成されます。
    iSCSI ストレージプールの作成

    図13.17 iSCSI ストレージプールの作成

13.5.3. virt-manager を使用したストレージプールの削除

以下の手順では、ストレージプールを削除する方法を説明します。
  1. 同じプールを使用する他のゲスト仮想マシンに関連した問題を避けるには、ストレージプールを停止し、そのストレージプールで使用中のリソースをすべて解放するのが最良の方法です。これを実行するには、停止するストレージプールを選択して、 をクリックします。
    ストレージプールの削除

    図13.18 ストレージプールの削除

  2. ストレージプールを削除するには、 をクリックします。このアイコンが使用できるのは、ストレージプールが停止している場合のみです。

13.5.4. virsh を使用した iSCSI ベースのストレージプールの作成

  1. オプション: ストレージプールのセキュリティーを保護します。

    必要な場合は、「iSCSI ストレージプールのセキュリティー保護」にあるステップで認証をセットアップします。
  2. ストレージプールを定義します。

    ストレージプールの定義は、virsh コマンドラインツールで作成できます。virsh でのストレージプール作成は、複数のストレージプールをスクリプトで作成しているシステム管理者にとって便利な方法です。
    virsh pool-define-as コマンドにはパラメーターがいくつかあり、以下の形式で使用します。
    virsh pool-define-as name type source-host source-path source-dev source-name target
    以下でパラメーターについて説明します。
    type
    たとえば、このプールを特定タイプ iSCSI として定義します。
    name
    ストレージプールの名前を設定します。この名前は固有である必要があります。
    source-host と source-path
    ホスト名と iSCSI IQN です。
    source-dev と source-name
    これらのパラメーターは iSCSI ベースのプールでは不要です。- 文字を使用してフィールドをブランクのままにします。
    target
    ホストマシン上で iSCSI デバイスをマウントする場所を定義します。
    以下の例では、上記の virsh pool-define-as の例と同じ iSCSI ベースのストレージプールを作成します。
    # virsh pool-define-as --name iscsirhel7pool --type iscsi \
         --source-host server1.example.com \
         --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest \
         --target /dev/disk/by-path
    Pool iscsirhel7pool defined
  3. ストレージプールが一覧表示されていることを確認します

    ストレージプールのオブジェクトが正しく作成されており、状態が inactive であることを確認します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel7pool       inactive   no
  4. オプション: iSCSI ストレージプールへの直接接続を確立します。

    以下のステップはオプションですが、iSCSI ストレージプールへの直接の接続を確立することができます。デフォルトでこれは有効にされていますが、ホストマシンへの接続 (ネットワークへの直接の接続ではない) が設定されている場合、この例を反映するように仮想マシンのドメイン XML を編集することによって、設定を元に戻すことができます。
       ...
       <disk type='volume' device='disk'>
          <driver name='qemu'/>
          <source pool='iscsi' volume='unit:0:0:1' mode='direct'/>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
       </disk>
          ... 

    図13.19 ディスクタイプ要素 XML の例

    注記

    disk devicedisk または lun として設定することで、同一の iSCSI ストレージプールを LUN またはディスクに使用できます。SCSI LUN ベースのストレージをゲストに追加するためのサンプル XML 設定については、「SCSI LUN ベースのストレージのゲストへの追加」を参照してください。
    さらに、ホストマシンへの接続のために source modemode='host' と指定できます。
    手順13.4「iSCSI ターゲットの作成」に詳しく説明されているように iSCSI サーバーに認証を設定している場合、<disk> サブ要素として使用される以下の XML はディスクの認証資格情報を提供します。「iSCSI ストレージプールのセキュリティー保護」は、libvirt シークレットの設定方法を説明しています。
    <auth type='chap' username='redhat'>
        <secret usage='iscsirhel7secret'/>
    </auth>
  5. ストレージプールを起動します。

    virsh pool-start を使用してディレクトリーストレージプールを有効にします。これにより、ストレージプールをボリュームおよびゲスト仮想マシンに使用することができます。
    # virsh pool-start iscsirhel7pool
    Pool iscsirhel7pool started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel7pool       active     no
  6. autostart をオンにします。

    ストレージプールの autostart をオンにします。Autostart は、libvirtd サービスの起動時にストレージプールを起動するように設定します。
    # virsh pool-autostart iscsirhel7pool
    Pool iscsirhel7pool marked as autostarted
    iscsirhel7pool プールが autostart を有効にしていることを確認します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel7pool       active     yes
  7. ストレージプールの設定を確認します。

    ストレージプールが正しく作成されたこと、サイズが正しく報告されたこと、および状態が running として報告されていることを確認します。
    # virsh pool-info iscsirhel7pool
    Name:           iscsirhel7pool
    UUID:           afcc5367-6770-e151-bcb3-847bc36c5e28
    State:          running
    Persistent:     unknown
    Autostart:      yes
    Capacity:       100.31 GB
    Allocation:     0.00
    Available:      100.31 GB
これで iscsirhel7pool という iSCSI ベースのプールが利用可能になります。

13.5.5. iSCSI ストレージプールのセキュリティー保護

virsh を使ってユーザー名およびパスワードパラメーターを設定することにより、iSCSI ストレージプールのセキュリティーを保護することができます。これは、プールを定義する前後に設定できますが、認証設定を有効にするには、プールが起動している必要があります。

手順13.7 virsh を使用したストレージプールの認証設定

  1. libvirt シークレットファイルを作成します。

    以下の例を使って、secret.xml という libvirt シークレット XML ファイルを作成します。
    # cat secret.xml
    <secret ephemeral='no' private='yes'>
        <description>Passphrase for the iSCSI example.com server</description>
        <auth type='chap' username='redhat'/>
        <usage type='iscsi'>
            <target>iscsirhel7secret</target>
        </usage>
    </secret>
  2. シークレットファイルを定義します。

    virsh を使って secret.xml ファイルを定義します。
    # virsh secret-define secret.xml
  3. シークレットファイルの UUID を確認します。

    secret.xml の UUID を確認します。
    # virsh secret-list
    
     UUID                                  Usage
    --------------------------------------------------------------------------------
     2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. シークレットを UUID に割り当てます。

    例のように以下のコマンド構文を使用して、シークレットを該当の UUID に割り当てます。
    # MYSECRET=`printf %s "password123" | base64`
    # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
    これにより、CHAP ユーザー名およびパスワードが libvirt で制御されたシークレット一覧に設定されることを確認できます。
  5. 認証エントリーをストレージプールに追加します。

    virsh edit を使用してストレージプールの XML ファイルの <source> エントリーを変更し、authentication typeusername、および secret usage を指定して <auth> 要素を追加します。
    以下は、認証が設定されたストレージプール XML 定義の例を示しています。
    # cat iscsirhel7pool.xml
      <pool type='iscsi'>
        <name>iscsirhel7pool</name>
          <source>
             <host name='192.168.122.1'/>
             <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
             <auth type='chap' username='redhat'>
                <secret usage='iscsirhel7secret'/>
             </auth>
          </source>
        <target>
          <path>/dev/disk/by-path</path>
        </target>
      </pool>

    注記

    <auth> サブ要素は、ゲスト XML の <pool> および <disk> 要素内の複数の異なる場所に存在します。<pool> の場合、<auth> は、認証が一部のプールソース (iSCSI および RBD) のプロパティーであり、プールソースの検索方法を記述しているため、<source> 要素内に指定されます。ドメインのサブ要素である <disk> の場合、iSCSI または RBD ディスクへの認証はディスクのプロパティーになります。ゲスト XML に設定される <disk> の例については、「virsh を使用した iSCSI ベースのストレージプールの作成」を参照してください。
  6. ストレージプール内の変更をアクティブにします。

    以下の変更をアクティブにするには、ストレージプールを起動している必要があります。
    ストレージプールをまだ起動していない場合は、「virsh を使用した iSCSI ベースのストレージプールの作成」にあるステップに従ってストレージプールを定義し、起動します。
    プールがすでに起動している場合は、以下のコマンドを実行してストレージプールを停止し、再起動します。
    # virsh pool-destroy iscsirhel7pool
    # virsh pool-start iscsirhel7pool

13.5.6. virsh を使用したストレージプールの削除

以下では、virsh を使ってストレージプールを削除する方法を説明します。
  1. 同じプールを使用する他のゲスト仮想マシンとの問題を避けるには、ストレージプールを停止してから使用中のリソースをすべて解放するのが最良の方法です。
    # virsh pool-destroy iscsirhel7pool
  2. ストレージプールの定義を削除します。
    # virsh pool-undefine iscsirhel7pool