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 のホットプラグ対応が利用できる場合があります。

16.7.2. NVIDIA vGPU の割り当て

NVIDIA vGPU 機能を使用すると、物理 GPU デバイスを、仲介デバイス と呼ばれる複数の仮想デバイスに分割できます。仲介されたデバイスは、仮想 GPU として複数のゲストに割り当てることができます。その結果、このゲストは 1 つの物理 GPU のパフォーマンスを共有します。
重要
この機能は、限られた NVIDIA GPU セットでのみ利用できます。このデバイスの最新のリストは、NVIDIA GPU ソフトウェアのドキュメント を参照してください。

16.7.2.1. NVIDIA vGPU の設定

vGPU 機能を設定するには、最初に GPU デバイス用の NVIDIA vGPU ドライバーを取得し、仲介デバイスを作成して、目的のゲストマシンに割り当てる必要があります。
  1. NVIDIA vGPU ドライバーを取得して、システムにインストールします。手順は NVIDIA ドキュメント を参照してください。
  2. NVIDIA ソフトウェアのインストーラーが /etc/modprobe.d/nvidia-installer-disable-nouveau.conf ファイルを作成しなかった場合は、/etc/modprobe.d/ ディレクトリーに、任意の名前で conf ファイルを作成します。ファイルに次の行を追加します。
    blacklist nouveau
    options nouveau modeset=0
    
    
  3. 現在のカーネル用に初期 ramdisk を再生成してから再起動します。
    # dracut --force
    # reboot
    仲介されたデバイスで、以前対応していたカーネルバージョンを使用する必要がある場合は、インストールしたすべてのカーネルバージョンに対して初期 ramdisk を再生成します。
    # dracut --regenerate-all --force
    # reboot
  4. nvidia_vgpu_vfio モジュールがカーネルによりロードされていて、nvidia-vgpu-mgr.service サービスが実行していることを確認してください。
    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio 45011 0
    nvidia 14333621 10 nvidia_vgpu_vfio
    mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
    vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
    # systemctl status nvidia-vgpu-mgr.service
    nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
     Main PID: 1553 (nvidia-vgpu-mgr)
     [...]
    
  5. デバイスの UUID を /sys/class/mdev_bus/pci_dev/mdev_supported_types/type-id/create に書き込みます。pci_dev は、ホスト GPU の PCI アドレスで、type-id は、ホスト GPU タイプの ID です。
    次の例は、NVIDIA Tesla P4 カードの nvidia-63 vGPU タイプの仲介デバイスを作成する方法を示しています。
    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
    # echo "30820a6f-b1a5-4503-91ca-0c10ba58692a" > /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/nvidia-63/create
    特定のデバイスのtype-id値は、section 1.3.1 を参照してください。仮想 GPU ソフトウェアのドキュメント の仮想 GPU タイプ。Linux ゲストでは、GRID P4-2Q などの Q シリーズ NVIDIA vGPU のみが、仲介デバイス GPU タイプとしてサポートされます。
  6. 次の行を、vGPU リソースを共有するゲストの XML 設定の <devices/> セクションに追加します。前の手順で uuidgen コマンドで生成した UUID 値を使用します。各 UUID は、一度に 1 つのゲストにしか割り当てることができません。
    
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>
    
    
    重要
    割り当てられたゲストで vGPU 仲介デバイスが正しく動作するようにするには、ゲストに対して NVIDIA vGPU ゲストソフトウェアライセンスを設定する必要があります。詳細および手順は、NVIDIA の仮想 GPU ソフトウェアのドキュメント を参照してください。

16.7.2.2. NVIDIAvGPU を使用したビデオストリーミング用の VNC コンソールのセットアップと使用

テクノロジープレビューとして、Red Hat Enterprise Linux 7.7 以降では、仮想ネットワークコンピューティング (VNC) コンソールを、NVIDIA vGPU を含む GPU ベースの仲介デバイスとともに使用できます。その結果、VNC を使用して、NVIDIA vGPU デバイスが提供する高速グラフィカル出力を表示できます。
警告
この機能は現在、テクノロジープレビューとしてのみ提供されており、Red Hat ではサポートされていません。したがって、実稼働環境で以下の手順を使用することは強く推奨しません。
仮想マシンの VNC コンソールで vGPU 出力レンダリングを設定するには、次の手順を実行します。
  1. 「NVIDIA vGPU の設定」 の説明に従って、NVIDIA vGPU ドライバーをインストールし、システムに NVIDIA vGPU を設定します。仲介されたデバイスの XML 設定に display='on' パラメーターが含まれていることを確認します。以下に例を示します。
    			
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
       <source>
          <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
       </source>
    </hostdev>
    
    
  2. 必要に応じて、仮想マシンのビデオモデルタイプを none に設定します。以下に例を示します。
    			
    <video>
       <model type='none'/>
    </video>
    
    
    指定しない場合は、2 つの異なるディスプレイ出力 (エミュレートの Cirrus カードまたは QXL カードからの 1 つと、NVIDIA vGPU からの 1 つ) が出力されます。また、現在 model type='none' を使用すると、ドライバーが初期化されるまでブートグラフィカルアウトプットを表示できなくなります。その結果、最初に表示されるグラフィック出力はログイン画面になります。
  3. 仮想マシンのグラフィックタイプの XML 設定が vnc であることを確認します。
    以下に例を示します。
    			
    <graphics type='vnc' port='-1' autoport='yes'>
    	 <listen type='address'/>
    </graphics>
    
    
  4. 仮想マシンを起動します。
  5. VNC ビューアー リモートデスクトップクライアントを使用して仮想マシンに接続します。
    注記
    仮想マシンが、エミュレートされた VGA をプライマリービデオデバイスとして、vGPU をセカンダリーデバイスとして設定されている場合は、ctrl+alt+2 キーボードショートカットを使用して、vGPU ディスプレイに切り替えます。

16.7.2.3. NVIDIA vGPU デバイスの削除

仲介 vGPU デバイスを削除するには、デバイスが非アクティブのときに次のコマンドを使用します。uuid は、デバイスの UUID (30820a6f-b1a5-4503-91ca-0c10ba58692a など) に置き換えます。
# echo 1 > /sys/bus/mdev/devices/uuid/remove
ゲストで現在使用されている vGPU デバイスを削除しようとすると、以下のエラーが発生することに注意してください。
echo: write error: Device or resource busy

16.7.2.4. NVIDIA vGPU 機能のクエリー

特定タイプの仲介デバイスをどのぐらい作成できるかなど、システムの仲介デバイスの詳細を取得するには、virsh nodedev-list --cap mdev_types コマンドおよび virsh nodedev-dumpxml コマンドを使用します。たとえば、以下は、Tesla P4 カードで利用可能な vGPU タイプを表示します。

$ virsh nodedev-list --cap mdev_types
pci_0000_01_00_0
$ virsh nodedev-dumpxml pci_0000_01_00_0
<...>
  <capability type='mdev_types'>
    <type id='nvidia-70'>
      <name>GRID P4-8A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-69'>
      <name>GRID P4-4A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-67'>
      <name>GRID P4-1A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-65'>
      <name>GRID P4-4Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-63'>
      <name>GRID P4-1Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-71'>
      <name>GRID P4-1B</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-68'>
      <name>GRID P4-2A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
    <type id='nvidia-66'>
      <name>GRID P4-8Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-64'>
      <name>GRID P4-2Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
  </capability>
</...>

16.7.2.5. NVIDIA vGPU のリモートデスクトップのストリーミングサービス

以下のリモートデスクトップストリーミングサービスは、Red Hat Enterprise Linux 7 の NVIDIA vGPU 機能での使用が正常にテストされています。
  • HP-RGS
  • Mechdyne TGX - 現在、Windows Server 2016 ゲストで Mechdyne TGX を使用することはできません。
  • NICE DCV - このストリーミングサービスを使用する場合は、解像度を動的にすると、場合によっては画面が黒くなるため、Red Hat は、解像度を固定する設定を使用することを推奨します。

16.7.2.6. NVIDIA vGPU を使用したビデオストリーミング用の VNC コンソールの設定

導入部分

テクノロジープレビュー として、Red Hat Enterprise Linux 8 では、仮想ネットワークコンピューティング (VNC) コンソールを、NVIDIA vGPU を含む GPU ベースの仲介デバイスとともに使用できます。その結果、VNC を使用して、NVIDIA vGPU デバイスが提供する高速グラフィカル出力を表示できます。
重要
テクノロジープレビューのため、この機能は Red Hat では対応していません。したがって、実稼働環境で以下の手順を使用することは強く推奨しません。

設定

仮想マシンの VNC コンソールで vGPU 出力レンダリングを設定するには、次の手順を実行します。
  1. 「NVIDIA vGPU の割り当て」 の説明に従って、NVIDIA vGPU ドライバーをインストールし、ホストに NVIDIA vGPU を設定します。仲介されたデバイスの XML 設定に display='on' パラメーターが含まれていることを確認します。以下に例を示します。
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
     <source>
        <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
     </source>
    </hostdev>
    
  2. 必要に応じて、仮想マシンのビデオモデルタイプを none に設定します。以下に例を示します。
    <video>
     <model type='none'/>
    </video>
    
  3. 仮想マシンのグラフィックタイプの XML 設定が spice または vnc であることを確認します。
    スパイスの例:
    <graphics type='spice' autoport='yes'>
     <listen type='address'/>
     <image compression='off'/>
    </graphics>
    
    vncの例:
    <graphics type='vnc' port='-1' autoport='yes'>
     <listen type='address'/>
    </graphics>
    
  4. 仮想マシンを起動します。
  5. 上の手順で設定したグラフィックプロトコルに適したクライアントを使用して、仮想マシンに接続します。
    • VNC の場合は、VNC ビューアー リモートデスクトップクライアントを使用します。仮想マシンが、エミュレートされた VGA をプライマリービデオデバイスとして、vGPU をセカンダリーとして設定されている場合は、ctrl+alt+2 キーボードショートカットを使用して vGPU ディスプレイに切り替えます。
    • SPICE には、virt-viewer アプリケーションを使用します。