Red Hat Training

A Red Hat training course is available for RHEL 8

第12章 仮想マシンでの GPU デバイスの管理

RHEL 8 ホストの仮想マシンのグラフィカルパフォーマンスを向上するには、ホスト GPU を仮想マシンに割り当てることができます。改善点を報告する場合は、以下のように行います。

  • ホストから GPU の割り当てを解除し、GPU の完全な制御を仮想マシンに直接渡すことができます。
  • 物理 GPU から複数の仲介デバイスを作成し、このデバイスを仮想 GPU(vGPU)として複数のゲストに割り当てることができます。現在、この方法は一部の NVIDIA GPU でのみサポートされており、1 つのゲストに割り当てられる仲介デバイスは 1 つだけです。

12.1. GPU の仮想マシンへの割り当て

ホストシステムに接続されている GPU にアクセスして制御するには、GPU を直接仮想マシン(VM)に渡すようにホストシステムを設定する必要があります。

前提条件

  • ホストマシンカーネルで IOMMU サポートを有効にする必要があります。

    • Intel ホストで VT-d を有効にする必要があります。

      1. intel_iommu=on パラメーターで GRUB 設定を再生成します。

        # grubby --args="intel_iommu=on" --update-kernel DEFAULT
      2. intel_iommu=on が機能する場合は、これを iommu=pt に置き換えて passthrough モードに切り替えることができます。

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注記

        pt オプションは、パススルーモードで使用されるデバイスの IOMMU のみを有効にし、ホストのパフォーマンスが向上します。ただし、すべてのハードウェアがオプションに対応しているわけではありません。ホストで iommu=pt オプションが機能しない場合は、intel_iommu=on オプションに戻ります。

      3. ホストを再起動します。
    • AMD ホストで、AMD-Vi を有効にする必要があります。

      AMD ホストでは、IOMMU がデフォルトで有効にされており、iommu=pt を追加してパススルーモードに切り替えることができることに注意してください。

      1. iommu=pt パラメーターで GRUB 設定を再生成します。

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注記

        pt オプションは、パススルーモードで使用されるデバイスの IOMMU のみを有効にし、ホストのパフォーマンスが向上します。ただし、すべてのハードウェアがオプションに対応しているわけではありません。このオプションが有効になっているかどうかに関係なく、デバイスを割り当てることができます。

      2. ホストを再起動します。

手順

  1. ドライバーが GPU にバインドされないようにします。

    1. GPU がアタッチされる PCI バスアドレスを特定します。

      # lspci -Dnn | grep VGA
      0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    2. ホストのグラフィックドライバーが GPU を使用しないようにする。これには、pci-stub ドライバーと共に GPU の PCI ID を使用します。

      たとえば、以下のコマンドは、ドライバーが 10de:11fa バスに接続された GPU にバインドできなくなります。

      # grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT
    3. ホストを再起動します。
  2. オプション: 音声などの特定の GPU 機能は、サポートの制限により仮想マシンに渡すことができない場合、IOMMU グループ内のドライバーバインディングが必要な GPU 機能のみを通過できるように変更することができます。

    1. GPU 設定を XML に変換し、ホストドライバーに接続できないようにエンドポイントの PCI アドレスをメモします。

      これを行うには、pci_ 接頭辞をアドレスに追加し、区切り文字をアンダースコアに変換して、GPU の PCI バスアドレスを libvirt と互換性のある形式に変換します。

      たとえば、以下のコマンドは 0000:02:00.0 バスアドレスで接続された GPU の 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>
        <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>
    2. エンドポイントがホストドライバーに割り当てられないようにします。

      この例では、GPU を仮想マシンに割り当てるには、<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/> の bus='0x02' function='0x1'/> に対応するエンドポイントを、ホスト audio ドライバーにアタッチし、代わりにエンドポイントを VFIO-PCI に割り当てます。

      # driverctl set-override 0000:02:00.1 vfio-pci
  3. GPU の仮想マシンへの割り当て

    1. PCI バスアドレスを使用して GPU の XML 設定ファイルを作成します。

      たとえば、GPU バスアドレスからのパラメーターを使用して、以下の XML ファイル GPU-Assign.xml を作成できます。

      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
    2. ホストシステムにファイルを保存します。
    3. ファイルを仮想マシンの XML 設定にマージします。

      たとえば、以下のコマンドは GPU XML ファイル GPU-Assign.xml を System1 仮想マシンの XML 設定ファイルにマージします。

      # virsh attach-device System1 --file /home/GPU-Assign.xml --persistent
      Device attached successfully.
      注記

      GPU がセカンダリーグラフィックデバイスとして仮想マシンに接続されている。プライマリーグラフィックデバイスとしての GPU の割り当てはサポートされていないため、Red Hat では、仮想マシンの XML 設定でプライマリーエミュレートされたグラフィックデバイスを削除することは推奨していません。

検証