13.7. SCSI デバイスでの NPIV 仮想アダプター (vHBA) の使用

NPIV (N_Port ID Virtualization) とは、単一の物理的なファイバーチャンネルホストバスアダプター (HBA) の共有を可能にするソフトウェア技術です。
これにより、複数のゲストから複数物理ホストの同一ストレージを確認することが可能になり、ストレージの移行パスが容易になります。このため、適切なストレージパスが指定されていれば、移行でストレージを作成したりコピーしたりする必要がありません。
仮想化では、仮想ホストバスアダプター (vHBA) が仮想マシンの LUN を制御します。ホストが複数 KVM ゲスト間で 1 つのファイバーチャネルを共有するには、各仮想マシンに vHBA が作成される必要があります。単一の vHBA を複数の KVM ゲストで使用することはできません。
NPIV の各 vHBA は、その親 HBA および独自の World Wide Node Name (WWNN) と World Wide Port Name (WWPN) で識別されます。ストレージへのパスは、WWNN と WWPN の値で決定されます。親 HBA は、scsi_host# または WWNN/WWPN ペアで定義することができます。

注記

親 HBA を scsi_host# で定義しハードウェアがホストマシンに追加されると、scsi_host# の割り付けが変更される場合があります。したがって、親 HBA は WWNN/WWPN ペアを使って定義することが推奨されます。
このセクションでは、vHBA を仮想マシンに永続的に設定する方法について説明します。

注記

vHBA を作成する前に、ホスト LUN のストレージアレイ (SAN) 側のゾーン機能を設定してゲスト間を分離し、データが損傷する可能性を防ぐことをお勧めします。

13.7.1. vHBA の作成

手順13.9 vHBA の作成

  1. ホストシステム上で HBA を見つけます。

    ホストシステム上で HBA を見つけるには、virsh nodedev-list --cap vports コマンドを使用します。
    たとえば、以下の出力は、vHBA をサポートする 2 つの HBA を持つホストを示しています。
    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
  2. HBA の詳細を確認します。

    virsh nodedev-dumpxml HBA_device コマンドを使って HBA の詳細を確認します。
    virsh nodedev-dumpxml コマンドからの XML 出力は、<name><wwnn>、および <wwpn> フィールドを一覧表示します。これらのフィールドは vHBA を作成するために使用されます。<max_vports> 値は、サポートされる vHBA の最大数を示します。
     # virsh nodedev-dumpxml scsi_host3
    <device>
      <name>scsi_host3</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
      <parent>pci_0000_10_00_0</parent>
      <capability type='scsi_host'>
        <host>3</host>
        <unique_id>0</unique_id>
        <capability type='fc_host'>
          <wwnn>20000000c9848140</wwnn>
          <wwpn>10000000c9848140</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
        <capability type='vport_ops'>
          <max_vports>127</max_vports>
          <vports>0</vports>
        </capability>
      </capability>
    </device>   
    この例では、<max_vports> 値は HBA 設定で使用できる 127 の仮想ポートがあることを示しています。<vports> 値は、現在使用中の仮想ポートの数を示します。これらの値は、vHBA 作成後に更新されます。
  3. vHBA ホストデバイスを作成します。

    vHBA ホスト用に以下のどちらかのような XML ファイルを作成します (この例では、ファイル名は vhba_host3.xml です)。
    この例では、親 vHBA を定義するのに scsi_host# が使われています。
    # cat vhba_host3.xml
       <device>
         <parent>scsi_host3</parent>
         <capability type='scsi_host'>
           <capability type='fc_host'>
           </capability>
         </capability>
       </device>   
    この例では、親 vHBA を定義するのに WWNN/WWPN ペアが使われています。
    # cat vhba_host3.xml
      <device>
        <name>vhba</name>
        <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
          <capability type='scsi_host'>
            <capability type='fc_host'>
            </capability>
          </capability>
        </device>   

    注記

    WWNN と WWPN の値は、ステップ 2 で確認した HBA 詳細の値と一致している必要があります。
    <parent> フィールドでは、この vHBA デバイスに関連付ける HBA デバイスを指定します。<device> タグ内の詳細は、ホスト用に新規の vHBA デバイスを作成するために次のステップで使用します。nodedev XML 形式についての詳細は、libvirt アップストリームページ を参照してください。
  4. vHBA ホストデバイス上で新規 vHBA を作成します。

    vhba_host3 上で vHBA を作成するには、virsh nodedev-create コマンドを使用します。
    # virsh nodedev-create vhba_host3.xml
    Node device scsi_host5 created from vhba_host3.xml
  5. vHBA を確認します。

    新規 vHBA (scsi_host5) の詳細を virsh nodedev-dumpxml コマンドで確認します。
    # virsh nodedev-dumpxml scsi_host5
    <device>
      <name>scsi_host5</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <host>5</host>
        <unique_id>2</unique_id>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>  

13.7.2. vHBA を使用したストレージプールの作成

vHBA 設定を保持するには、vHBA に基づく libvirt ストレージプールを定義することが推奨されます。
ストレージプールを使用することには 2 つの主な利点があります。
  • libvirt コードにより、virsh コマンド出力から LUN のパスを簡単に特定できます。
  • 仮想マシンの移行には、ターゲットマシン上に同じ vHBA 名を持つストレージプールを定義し、起動することのみが必要になります。これを実行するには、vHBA LUN、libvirt ストレージプールおよびボリューム名を仮想マシンの XML 設定に指定する必要があります。例については、「仮想マシンが vHBA LUN を使用するよう設定する」を参照してください。
  1. SCSI ストレージプールを作成します。

    vHBA の永続的な設定を作成するには、まず以下の形式を使用して libvirt 'scsi' ストレージプール XML ファイルを作成します。同一の物理 HBA 上のストレージプールを使用する単一の vHBA を作成する場合は、システム上の /dev/disk/by-{path|id|uuid|label} の場所のいずれかにするなど、<path> 値の安定した場所を使用することをお勧めします。
    同一の物理 HBA 上のストレージプールを使用する複数の vHBA を使用する場合、<path> フィールドの値は /dev/ にしなければなりません。そうでないと、ストレージプールボリュームは vHBA のいずれかのみに表示され、ホストのデバイスを NPIV 設定で複数ゲストに表示することができなくなります。
    <path> の詳細および <target> 内の要素については、http://libvirt.org/formatstorage.html を参照してください。

    例13.3 サンプル SCSI ストレージプール SML 構文

    以下の例では、'scsi' ストレージプールの名前は vhbapool_host3.xml となっています。
      <pool type='scsi'>
          <name>vhbapool_host3</name>
          <source>
            <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
          </source>
          <target>
            <path>/dev/disk/by-path</path>
            <permissions>
              <mode>0700</mode>
              <owner>0</owner>
              <group>0</group>
            </permissions>
          </target>
        </pool> 
    または、vhbapool_host3.xml が単一 HBA 上にある複数の vHBA の 1 つである場合に以下の構文が使用されます。
      <pool type='scsi'>
          <name>vhbapool_host3</name>
          <source>
            <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
          </source>
          <target>
            <path>/dev/</path>
            <permissions>
              <mode>0700</mode>
              <owner>0</owner>
              <group>0</group>
            </permissions>
          </target>
        </pool> 

    重要

    どちらの場合も、プールには type='scsi' を使用し、ソースアダプタータイプは 'fc_host' にする必要があります。ホストの再起動時に使用する永続的な設定の場合、wwnn および wwpn 属性は、libvirt により vHBA に割り当てられる値である必要があります (この例では scsi_host5)。
    オプションで 'parent' 属性は、親 scsi_host デバイスを vHBA として特定するために <adapter> フィールドで使用できます。ここで、値は virsh nodedev-create で作成される vHBA の scsi_host ではなく、その vHBA の親になることに注意してください。
    'parent' 属性を指定することは、プール定義の重複の有無をを確認する際にも役立ちます。これは、'fc_host' および 'scsi_host' ソースアダプタープールの両方が使用されている場合により重要になります。これにより、新規の定義が別の既存ストレージプールの同一の scsi_host を使用して重複していないことを確認できます。
    以下の例は、ストレージプール設定の <adapter> フィールドで使用されるオプションの 'parent' 属性を示しています。
    <adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  2. プールを定義します。

    ストレージプール (この例では vhbapool_host3 という名前) を永続的に定義するには、virsh pool-define コマンドを使用します。
    # virsh pool-define vhbapool_host3.xml
    Pool vhbapool_host3 defined from vhbapool_host3.xml
  3. プールを起動します。

    以下のコマンドでストレージプールを起動します。
    # virsh pool-start vhbapool_host3
    Pool vhbapool_host3 started

    注記

    プールを起動する際に、libvirt は同じ wwpn:wwnn 識別子を持つ vHBA がすでに存在するかどうかを検査します。存在しない場合は、指定した wwpn:wwnn の新規 vHBA が作成されます。同様に、プールを破棄する際には、libvirt は同じ wwpn:wwnn の値を使用する vHBA も破棄します。
  4. autostart を有効にします。

    最後に、この後のホストの再起動で仮想マシンで使用される vHBA が自動的に定義されるようにするために、ストレージプールの autostart 機能を設定します (この例では、プールの名前は vhbapool_host3)。
    # virsh pool-autostart vhbapool_host3

13.7.3. 仮想マシンが vHBA LUN を使用するよう設定する

vHBA のストレージプールを作成したら、仮想マシンの XML に仮想マシンのディスクボリュームを作成することにより、vHBA LUN を仮想マシンの設定に追加します。たとえば、以下の例のようにストレージの pool および volume<source> パラメーターに指定します。
   <disk type='volume' device='disk'>
     <driver name='qemu' type='raw'/>
     <source pool='vhbapool_host3' volume='unit:0:4:0'/>
     <target dev='hda' bus='ide'/>
   </disk>    
disk ではなく lun デバイスを指定するには、以下の例を参照してください。
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:4:0' mode='host'/>
      <target dev='sda' bus='scsi'/>
      <shareable />
    </disk>
SCSI LUN ベースのストレージをゲストに追加する際の XML 設定のサンプルについては、「SCSI LUN ベースのストレージのゲストへの追加」を参照してください。
ハードウェア故障の際に LUN への再接続を確実にするには、fast_io_fail_tmo および dev_loss_tmo オプションを編集することが推奨されます。詳細については、「ハードウェア故障後に公開されている LUN に再接続」を参照してください。

13.7.4. vHBA ストレージプールの破棄

ストレージプールで作成された vHBA は、virsh pool-destroy コマンドで破棄することができます。
# virsh pool-destroy vhbapool_host3
virsh pool-destroy コマンドを実行すると、「vHBA の作成」で作成された vHBA が削除されることに注意してください。
プールと vHBA が破棄されたことを確認するには、以下のコマンドを実行します。
# virsh nodedev-list --cap scsi_host
scsi_host5 はリストに表示されなくなります。