第16章 仮想マシンでの GPU デバイスの管理
RHEL 9 ホストで仮想マシンのグラフィカルパフォーマンスを向上させるために、仮想マシンにホスト GPU を割り当てることができます。
- ホストから GPU を取り外し、GPU の完全な制御を仮想マシンに直接渡すことができます。
- 物理 GPU から複数の仲介デバイスを作成し、これらのデバイスを仮想 GPU (vGPU) として複数のゲストに割り当てることができます。現在、これは選択した NVIDIA GPU でのみ対応しており、1 つのゲストに割り当てることができる仲介デバイスは 1 つだけです。
GPU の割り当ては現在、Intel 64 システムおよび AMD64 システムでのみサポートされています。
16.1. 仮想マシンへの GPU の割り当て
ホストシステムに接続されている GPU にアクセスして制御するには、GPU の直接制御を仮想マシンに渡すようにホストシステムを設定する必要があります。
仮想 GPU の割り当て方法の詳細は、Managing NVIDIA vGPU devices を参照してください。
前提条件
ホストマシンカーネルで IOMMU サポートを有効にする必要があります。
Intel ホストでは、VT-d を有効にする必要があります。
intel_iommu=on
およびiommu=pt
パラメーターを使用して GRUB 設定を再生成します。# grubby --args="intel_iommu=on iommu_pt" --update-kernel DEFAULT
- ホストを再起動します。
AMD ホストでは、AMD-Vi を有効にする必要があります。
AMD ホストでは、IOMMU はデフォルトで有効になっているため、
iommu=pt
を追加してパススルーモードに切り替えることができます。iommu=pt
パラメーターで GRUB 設定を再生成します。# grubby --args="iommu=pt" --update-kernel DEFAULT
注記pt
オプションは、パススルーモードで使用されるデバイスにのみ IOMMU を有効にし、ホストパフォーマンスを向上させます。ただし、すべてのハードウェアがこのオプションに対応しているわけではありません。このオプションが有効になっていない場合でも、デバイスを割り当てることは可能です。- ホストを再起動します。
手順
ドライバーが GPU にバインドしないようにします。
GPU の接続先である PCI バスアドレスを特定します。
# lspci -Dnn | grep VGA 0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
ホストのグラフィックドライバーが GPU を使用しないようにします。これには、pci-stub ドライバーで GPU の PCI ID を使用します。
たとえば、次のコマンドは、ドライバーが10de: 11fa バスに接続されている GPU にバインドしないようにします。
# grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT
- ホストを再起動します。
オプション: サポートの制限により、オーディオなどの特定の GPU 機能を仮想マシンにパススルーできない場合は、IOMMU グループ内のエンドポイントのドライバーバインディングを変更すると、必要な GPU 機能のみをパススルーできます。
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>
エンドポイントがホストドライバーに接続されないようにします。
この例では、GPU を仮想マシンに割り当て、オーディオ機能である
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
に対応するエンドポイントがホストオーディオドライバーに接続されないようにし、代わりにエンドポイントを VFIO-PCI に接続します。# driverctl set-override 0000:02:00.1 vfio-pci
GPU の仮想マシンへの接続
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>
- ホストシステムにファイルを保存します。
ファイルを仮想マシンの 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 設定で、エミュレートしているプライマリーグラフィックスデバイスを削除することは推奨しません。
検証
-
デバイスが、仮想マシンの XML 設定の
<devices>
セクションに表示されます。詳細は、Sample virtual machine XML configuration を参照してください。
既知の問題
仮想マシンに接続できる GPU の数は、割り当てられた PCI デバイスの最大数 (RHEL 9 では現在 64) によって制限されます。ただし、仮想マシンに複数の GPU を接続すると、ゲストのメモリーマップド I/O (MMIO) で問題が発生する可能性があり、その結果、GPU が仮想マシンで使用できなくなる可能性があります。
これらの問題を回避するには、より大きな 64 ビット MMIO 空間を設定し、vCPU 物理アドレスビットを設定して、拡張された 64 ビット MMIO 空間をアドレス指定可能にします。
- 現在 RHEL 9 ゲストオペレーティングシステムを使用している仮想マシンに NVIDIA GPU デバイスを接続すると、その仮想マシンで Wayland セッションが無効になり、代わりに Xorg セッションが読み込まれます。これは、NVIDIA ドライバーと Wayland の間の非互換性が原因です。