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 Assignment: この方法により、物理 GPU から複数の 仲介デバイス を作成し、これらのデバイスを仮想 GPU として複数のゲストに割り当てることができます。これは、選択した NVIDIA GPU でのみサポートされ、単一のゲストに割り当てられる仲介デバイスは 1 つだけです。

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

Red Hat Enterprise Linux 7 は、VGA 以外のグラフィックデバイスとして、以下の PCIe ベースの GPU デバイスの PCI デバイス割り当てをサポートします。
  • Nvidia Quadro K-Series、M-Series、PSeries、および以降のアーキテクチャー(モデル 2000 シリーズ以降)
  • Nvidia Tesla K-Series, M-Series, and later architecture
現在、標準のエミュレートされた VGA インターフェースのいずれかに加えて、最大 2 つの GPU を仮想マシンに割り当てることができます。エミュレーションされた VGA は、起動前およびインストールに使用され、NVIDIA グラフィックドライバーが読み込まれると NVIDIA GPU が引き継ぎます。
GPU をゲスト仮想マシンに割り当てるには、ホストマシンで I/O Memory Management Unit(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"
    
  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-stub.ids オプションを値として、/etc/sysconfig/grub 設定ファイルにある GRUB_CMDLINX_LINUX 行に追加します。以下に例を示します。
    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 デバイスを割り当てる前に、ゲスト上で GPU が適切に動作するよう IOMMU 設定の変更が必要になることがあります。
  1. GPU の XML 情報の表示

    XML 形式で GPU の設定を表示するには、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. 仮想マシンマネージャーインターフェースの使用「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 バスアドレスは、ホスト上で異なります。ホストが GPU を適切にを使用できるようにするには、ゲストの Xorg ディスプレイサーバーを設定し、割り当てられた GPU アドレスを使用するように設定します。
  1. ゲストで lspci コマンドを使用して、GPU の PCI バスアクres を決定します。
    # 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 は単一のゲストによって排他的な所有されます。ゲストオペレーティングシステムによっては、GPU のホットプラグサポートを利用できます。

16.7.2. NVIDIA vGPU の割り当て

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

16.7.2.1. NVIDIA vGPU の設定

仮想 GPU 機能を設定するには、最初に 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 カードの vGPU タイプ nvidia-63 の仲介デバイスを作成する方法を示しています。
    # 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. NVIDIA vGPU を使用したビデオストリーミング用の VNC コンソールの設定および使用

Red Hat Enterprise Linux 7.7 以降では、Virtual Network Computing(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 つの異なるディスプレイ出力を使用できます。1 つはエミュレートされた Cirrus または QXL カード、NVIDIA vGPU からの出力です。また、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 キーボードショートカットを使用して、仮想 GPU ディスプレイに切り替えます。

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 では、Virtual Network Computing(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 であることを確認します。
    spice の例:
    <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 キーボードのショートカットを使用して、仮想 GPU ディスプレイに切り替えます。
    • SPICE の場合は、virt-viewer アプリケーションを使用します。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。