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

Red Hat Enterprise Linux 7 では、VGA 以外のグラフィックデバイスとして以下の GPU デバイスの PCI デバイス割り当てをサポートします。
  • NVIDIA Quadro K シリーズ、M シリーズ、および P シリーズ (モデル 2000 シリーズ以降)
  • NVIDIA GRID K シリーズ
  • NVIDIA Tesla K シリーズおよび M シリーズ
現在、標準のエミュレートされた VGA インターフェースのほかに、2 つまでの GPU を仮想マシンに割り当てることができます。エミュレートされた VGA は起動前およびインストールに使用され、NVIDIA グラフィックスドライバーがロードされると、NVIDIA GPU に引き継がれます。
この手順では、lspci からデバイスを特定した後にこの割り当てをホスト物理マシンから解除し、ゲスト仮想マシンに割り当てます。
  1. ホスト物理マシンカーネルの IOMMU サポートを有効にします。

    Intel VT-d システムの場合、これは intel_iommu=on および iommu=pt パラメーターをカーネルコマンドラインに追加することによって実行されます。AMD-Vi システムの場合、オプションは amd_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 についての詳細は、「付録D IOMMU グループの使用」を参照してください。
  2. ブートローダー設定の再生成

    このオプションを組み込むには、以下のコマンドを実行し、grub2-mkconfig を使用してブートローダー設定を再生成します。
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストの場合、ターゲットファイルは /etc/grub2-efi.cfg であることに注意してください。
  3. ホスト物理マシンを再起動します。

    このオプションを有効にするには、以下のコマンドを使ってホスト物理マシンを再起動します。
    # reboot

手順17.13 GPU デバイスを、ホスト物理マシンドライバーへのバインドから除外する

GPU 割り当ての場合、ホストドライバーはデバイスの動的なバインド解除をサポートしないことが多いため、デバイスをホストドライバーへのバインドから除外することをお勧めします。
  1. PCI バスアドレスを特定します。

    PCI バスアドレスとデバイスの ID を特定するには、以下の lspci コマンドを実行します。この例では、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 を使用することができます。これを実行するには、以下のように追加オプションを /etc/sysconfig/grub にある GRUB_CMDLINX_LINUX 設定ファイルに追加します。
    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
virsh コマンドは、デバイスをさらに評価するために使用できますが、デバイスに関連して virsh を使用するには、pci_ を追加し、区切り記号をアンダースコアに変換することで、PCI バスアドレスを libvirt と互換性のある形式に変換する必要があります。この例では、PCI デバイス 0000:02:00.0 の libvirt アドレスは pci_0000_02_00_0 になります。nodedev-dumpxml オプションは、以下のようにデバイスに関する追加情報を提供します。
# 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 this part -->
    <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>
	

図17.22 GPU 向けの XML ファイルの調整例

この出力のとりわけ重要な部分は <iommuGroup> 要素です。iommuGroup は、IOMMU 機能および PCI バストポロジーのために他のデバイスから切り離されていると見なされるデバイスセットを示します。iommuGroup 内のすべてのエンドポイントデバイス (PCIe root ポート、ブリッジまたはスイッチポートではないデバイスなど) は、ゲストに割り当てるためにネイティブのホストドライバーからのバインドを解除する必要があります。上記の例では、グループは GPU デバイス (0000:02:00.0) およびコンパニオンオーディオデバイス (0000:02:00.1) で構成されています。詳細は、「付録D IOMMU グループの使用」を参照してください。

注記

Nvidia オーディオ機能の割り当ては、レガシーの割り込みサポートに関連したハードウェアの問題によりサポートされません。GPU をゲストに割り当てるには、まずオーディオ機能をネイティブのホストドライバーから分離する必要があります。これは、lspci を使用してデバイスの PCI ID を検索し、これを pci-stub.ids オプションに追加するか、または virsh の nodedev-detach オプションを動的に使用して実行できます。以下は例になります。
# virsh nodedev-detach pci_0000_02_00_1
Device pci_0000_02_00_1 detached
GPU オーディオ機能は通常 GPU 自体を使用しない場合は役に立たないため、pci-stub.ids オプションを代わりに使用することが一般的に推奨されています。
GPU の仮想マシンへの割り当ては、仮想マシン XML ( virsh edit [domain]) を直接編集するか、または virsh attach-device で GPU をドメインに割り当てるかのいずれかにより、virt-manager または virsh を使用して実行できます。virsh attach-device コマンドを使用している場合は、以下のようにデバイス用の XML フラグメントをまず作成する必要があります。
		
<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
  </source>
</hostdev>

図17.23 GPU の割り当て用の XML ファイル例

これをファイルに保存し、virsh attach-device [domain] [file] --persistent を実行して XML を仮想マシンの設定に組み込みます。ゲスト仮想マシン内の既存のエミュレートされたグラフィックスデバイスのほかに、割り当てられた GPU が追加されることに注意してください。割り当てられた GPU は、仮想マシン内の二次的なグラフィックスデバイスとして処理されます。プライマリーグラフィックスデバイスとしての割り当てはサポートされず、仮想マシンの XML 内のエミュレートされたグラフィックスデバイスは削除することができません。

注記

ゲスト内で割り当てられた Nvidia GPU を使用する場合、Nvidia ドライバーのみがサポートされます。他のドライバーは機能せず、エラーを出す可能性があります。Red Hat Enterprise Linux7 ゲストの場合、nouveau ドライバーが、インストール時にカーネルコマンドラインでオプションの modprobe.blacklist=nouveau を使用することでブラックリスト化される可能性があることに注意してください。他のゲスト仮想マシンについての情報は、オペレーティングシステム固有のドキュメントを参照してください。
KVM ゲスト内で割り当てられた GPU と共に使用する Xorg を設定する場合、BusID オプションを xorg.conf に追加して GPU のゲストアドレスを指定する必要があります。これは、ゲスト内で GPU の PCI バスアドレス (これはホストアドレスとは異なります) を判別する場合などに必要になります。
# lspci | grep VGA
00:02.0 VGA compatible controller: Device 1234:1111
00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
この場合、アドレスは 00:09.0 です。ファイル //etc/X11/xorg.conf は以下の強調表示されたエントリーを加えるように変更されます。
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:0:9:0"
EndSection
ゲストオペレーティングシステムに応じて、Nvidia ドライバーがロードされた状態で、ゲストはエミュレートされたグラフィックスと割り当てられたグラフィックスの両方を同時にサポートするか、またはエミュレートされたグラフィックスを無効にすることができます。割り当てられたグラフィックスフレームバッファーは、vir-manager などのツールでは提供されないことに注意してください。割り当てられた GPU が物理ディスプレイに接続されていない場合、ゲストベースのリモートソリューションが GPU デスクトップにアクセスするために必要になる場合があります。すべての PCI デバイス割り当ての場合と同様、割り当てられた GPU を持つゲストの移行はサポートされておらず、それぞれの GPU は単一ゲストによって排他的に所有されます。ゲストオペレーティングシステムにより、GPU のホットプラグサポートを利用できる場合があります。