Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

16.7. GPU デバイスの割り当て

GPU をゲストに割り当てるには、次のいずれかの方法を使用します。
  • GPU PCI デバイスの割り当て - この方法を使用すると、ホストから GPU デバイスを削除し、1 つのゲストに割り当てることができます。
  • NVIDIA vGPU の割り当て - この方法を使用すると、物理 GPU から複数の仲介デバイスを作成し、これらのデバイスを仮想 GPU として複数のゲストに割り当てることができます。これは、選択した NVIDIA GPU でのみ対応しており、1 つのゲストに割り当てることができる仲介デバイスは 1 つだけです。

16.7.1. GPU PCI デバイスの割り当て

Red Hat Enterprise Linux 7 では、以下の PCIe ベースの GPU デバイスから、非 VGA グラフィックデバイスへの PCI デバイスの割り当てに対応しています。
  • NVIDIA Quadro K-Series、M-Series、P-Series、およびそれ以降のアーキテクチャー (モデル 2000 シリーズ以降)
  • NVIDIA Tesla K-Series、M-Series、およびそれ以降のアーキテクチャー
注記
VM に接続できる GPU の数は、割り当てられた PCI デバイスの最大数 (RHEL 7 では現在 32) によって制限されます。ただし、VM に複数の GPU を接続すると、ゲストのメモリーマップド I/O (MMIO) で問題が発生する可能性があり、その結果、GPU が VM で使用できなくなる可能性があります。
これらの問題を回避するには、より大きな 64 ビット MMIO 空間を設定し、vCPU 物理アドレスビットを設定して、拡張された 64 ビット MMIO 空間をアドレス指定可能にします。
ゲスト仮想マシンに GPU を割り当てるには、ホストマシンで I/O メモリー管理ユニット (IOMMU) を有効にし、lspci コマンドを使用して GPU デバイスを識別し、デバイスをホストから切り離して、ゲストに接続します。以下の手順に従って、ゲストで Xorg を設定します。

手順16.13 ホストマシンカーネルで IOMMU サポートを有効にします。

  1. カーネルコマンドラインの編集

    Intel VT-d システムの場合は、intel_iommu=on パラメーターおよび iommu=pt パラメーターをカーネルコマンドラインに追加することで IOMMU がアクティブになります。AMD-Vi システムの場合、必要な選択肢はiommu=pt のみです。この項目を有効にするには、以下のようにGRUB_CMDLINX_LINUX 行を/etc/sysconfig/grub 設定ファイルに追加または修正します。
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
    
    注記
    IOMMU の詳細は、付録E IOMMU グループの使用 を参照してください。
  2. ブートローダー設定の再生成

    カーネルコマンドラインの変更を適用するには、grub2-mkconfig コマンドを使用してブートローダー設定を再生成します。
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  3. ホストを再起動します。

    変更を有効にするには、ホストマシンを再起動します。
    # reboot

手順16.14 GPU デバイスのホスト物理マシンドライバーへのバインディングからの除外

GPU の割り当てでは、デバイスをホストドライバーへのバインドから除外することが推奨されます。このようなドライバーは、デバイスの動的なバインド解除に対応していない場合が多いためです。
  1. PCI バスアドレスの特定

    デバイスの PCI バスアドレスおよび ID を特定するには、以下の lspci コマンドを実行します。この例では、NVIDIA Quadro カードや GRID カードなどの VGA コントローラーを使用します。
    # lspci -Dnn | grep VGA
    0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    
    検索の結果、このデバイスの PCI バスアドレスが 0000:02:00.0 であり、デバイスの PCI ID が 10de:11fa であることが分かります。
  2. ネイティブホストマシンのドライバーが GPU デバイスを使用できないようにします。

    ネイティブホストマシンのドライバーが GPU デバイスを使用しないようにするには、pci-stub ドライバーで PCI ID を使用できます。これには、以下の例のように、PCI ID を値として、/etc/sysconfig/grub 設定ファイルにある GRUB_CMDLINX_LINUX 行に pci-stub.ids オプションを追加します。
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt pci-stub.ids=10de:11fa"
    
    pci-stub に追加の PCI ID を追加する場合は、コンマで区切ります。
  3. ブートローダー設定の再生成

    このgrub2-mkconfigを使用して、ブートローダー設定を再生成し、この項目を追加します。
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  4. ホストマシンを再起動します。

    変更を有効にするには、ホストマシンを再起動します。
    # reboot

手順16.15 オプション: GPU IOMMU 設定の編集

GPU デバイスを接続する前に、その IOMMU 設定を編集して、GPU がゲストで適切に機能するようにする必要があります。
  1. GPU の XML 情報を表示します。

    GPU の設定を XML 形式で表示するには、最初に pci_ を追加し、区切り文字をアンダースコアに変換して、PCI バスアドレスを libvirt 互換形式に変換する必要があります。この例では、0000:02:00.0 バスアドレスで識別される GPU PCI デバイス (以前の手順 で取得したもの) が pci_0000_02_00_0 になります。virsh nodedev-dumpxml でデバイスの libvirt アドレスを使用し、XML 設定を表示します。
    # virsh nodedev-dumpxml pci_0000_02_00_0
    
    <device>
     <name>pci_0000_02_00_0</name>
     <path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path>
     <parent>pci_0000_00_03_0</parent>
     <driver>
      <name>pci-stub</name>
     </driver>
     <capability type='pci'>
      <domain>0</domain>
      <bus>2</bus>
      <slot>0</slot>
      <function>0</function>
      <product id='0x11fa'>GK106GL [Quadro K4000]</product>
      <vendor id='0x10de'>NVIDIA Corporation</vendor>
         <!-- pay attention to the following lines -->
      <iommuGroup number='13'>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      </iommuGroup>
      <pci-express>
       <link validity='cap' port='0' speed='8' width='16'/>
       <link validity='sta' speed='2.5' width='16'/>
      </pci-express>
     </capability>
    </device>
    
    XML の <iommuGroup> 要素に注意してください。iommuGroup は、IOMMU の機能および PCI バストポロジーにより、その他のデバイスから分離されていると見なされるデバイスのセットを示します。iommuGroup 内のすべてのエンドポイントデバイス (PCIe ルートポート、ブリッジ、またはスイッチポートではないデバイス) をゲストに割り当てるには、ネイティブホストドライバーからバインドを解除する必要があります。この例では、グループは GPU デバイス (0000:02:00.0) とコンパニオンオーディオデバイス (0000:02:00.1) で設定されています。詳細は、付録E IOMMU グループの使用 を参照してください。
  2. IOMMU 設定の調整

    この例では、レガシー割り込みサポートのハードウェアの問題により、NVIDIA オーディオ機能の割り当てはサポートされていません。また、GPU オーディオ機能は、通常、GPU 自体がないと役に立ちません。そのため、GPU をゲストに割り当てるには、最初にオーディオ機能をネイティブホストドライバーから切り離す必要があります。これは、以下のいずれかを使用して行います。

手順16.16 GPU のアタッチ

GPU は、次のいずれかの方法を使用してゲストにアタッチできます。
  1. Virtual Machine Manager インターフェイスの使用詳細は、「virt-manager を使用した PCI デバイスの割り当て」 を参照してください。
  2. GPU 用の XML 設定フラグメントを作成し、virsh attach-device でアタッチする場合は、次のコマンドを実行します。
    1. 以下のような XML をデバイスに作成します。
      
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
      
    2. これをファイルに保存し、virsh attach-device [domain] [file] --persistent を実行して、ゲスト設定に XML を含めます。割り当てられた GPU は、ゲストマシンにある既存のエミュレートグラフィックデバイスに追加されることに注意してください。割り当てられた GPU は、仮想マシンではセカンダリーグラフィックデバイスとして扱われます。プライマリーグラフィックスデバイスとしての割り当てはサポートされていないため、ゲストの XML でエミュレートされたグラフィックスデバイスは削除しないでください。
  3. virsh edit を使用したゲスト XML 設定の編集および適切な XML セグメントの手動による追加

手順16.17 ゲストの Xorg 設定の変更

ゲストの GPU の PCI バスアドレスは、ホストの PCI バスアドレスとは異なります。ホストが GPU を適切に使用できるようにするには、割り当てられた GPU アドレスを使用するようにゲストの Xorg ディスプレイサーバーを設定します。
  1. ゲストで lspci コマンドを使用して GPU の PCI バスアドレスを決定します。
    # lspci | grep VGA
    00:02.0 VGA compatible controller: Device 1234:111
    00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
    
    この例では、バスアドレスは 00:09.0 です。
  2. ゲストの /etc/X11/xorg.conf ファイルに、検出されたアドレスを以下のように調整した BusID オプションを追加します。
    		Section "Device"
    		    Identifier     "Device0"
    		    Driver         "nvidia"
    		    VendorName     "NVIDIA Corporation"
    		    BusID          "PCI:0:9:0"
    		EndSection
    
    重要
    手順 1 で検出したバスアドレスが 16 進数の場合は、区切り文字の値を 10 進数に変換する必要があります。たとえば、00:0a.0 は PCI:0:10:0 に変換する必要があります。
注記
ゲストで、割り当てられた NVIDIA GPU を使用する場合は、NVIDIA ドライバーのみがサポートされます。その他のドライバーは動作せず、エラーが生成される場合があります。Red Hat Enterprise Linux 7 ゲストの場合は、インストール時にカーネルコマンドラインの オプション modprobe.blacklist=nouveau を使用して、nouveau ドライバーをブラックリストに追加できます。 その他のゲスト仮想マシンの詳細は、オペレーティングシステム固有のドキュメントを参照してください。
ゲストのオペレーティングシステムによっては、読み込んだ NVIDIA ドライバーで、エミュレートグラフィックと割り当てたグラフィックの両方の使用に同時に対応したり、エミュレートグラフィックを無効にしたりできます。割り当てられたグラフィックフレームバッファーへのアクセスは、virt-manager などのアプリケーションでは利用できないことに注意してください。割り当てられた GPU が物理ディスプレイに接続されていない場合、GPU デスクトップにアクセスするために、ゲストベースのリモートソリューションが必要になる場合があります。すべての PCI デバイスの割り当てと同様、割り当てられた GPU を持つゲストの移行はサポートされず、各 GPU は 1 つのゲストのみが所有します。ゲストオペレーティングシステムによっては、GPU のホットプラグ対応が利用できる場合があります。