Intel GVT-g
Intel GVT-g は Intel GPU (Broadwell 以降) で mediated デバイスパススルーを実現する技術です。複数のゲスト VM で GPU を仮想化して使うことができ、仮想マシンでほぼネイティブと同じ性能を発揮しつつ、ホストからは仮想化された GPU を通常通りに使用できます。完全なデバイスパススルーができるディスクリート GPU がない ultrabook で Windows の仮想マシンを動作させてグラフィック支援が欲しい場合に有用です (NVIDIA や AMD の GPU でも同じような技術は存在しますが、Quadro や Radeon Pro などのプロ向けの GPU でしか使うことができません)。
派生技術として GVT-d という名前の技術も存在し、こちらは vfio-pci ドライバーによる完全なデバイスパススルーになります。GVT-d では、ホストは仮想化された GPU を使用できません。
設定
まず仮想 GPU (vGPU) を作成してから、仮想マシンに GPU を割り当てます。vGPU が割り当てられた仮想マシンからは通常の GPU として認識されるので、ネイティブのドライバーをインストールしてください (vGPU を動作させるには特殊なドライバーが必要ですが、現在は上流の Linux/Windows ドライバーに必要な変更が含まれています)。
以下の作業が必要です:
- Linux 4.16 と QEMU 2.12 以上を使ってください。
- カーネルパラメータに
i915.enable_gvt=1
を追加して GPU 仮想化を有効にしてください。 /sys/bus/pci/devices
から GPU の PCI アドレスを確認してください (下のコマンドの$GVT_PCI
は適切なアドレスに置き換えてください)。アドレスは次のような形式となります:0000:00:02.0
。lspci
を実行してVGA compatible controller: Intel Corporation HD Graphics ...
と書かれている横のアドレスをメモしてください。- vGPU の GUID を生成してください (下のコマンド中の
$GVT_GUID
)。GUID を使用して vGPU を作成・割り当てます。ひとつの仮想マシンに割り当てられる仮想 GPU はひとつだけです。必要な数だけ GUID を作成してください (uuidgen
を実行することで作成できます)。
i915.enable_gvt=1
フラグを付けて再起動したら、vGPU を作成することができます。作成できる vGPU のタイプは複数存在し、タイプによって vGPU に使われるリソースが異なります。システムで利用可能なタイプは以下のように確認できます (それぞれのタイプで cat description
を実行することで機能を確認できます):
# ls /sys/bus/pci/devices/$GVT_PCI/mdev_supported_types/ i915-GVTg_V5_1 # Video memory: <512MB, 2048MB>, resolution: up to 1920x1200 i915-GVTg_V5_2 # Video memory: <256MB, 1024MB>, resolution: up to 1920x1200 i915-GVTg_V5_4 # Video memory: <128MB, 512MB>, resolution: up to 1920x1200 i915-GVTg_V5_8 # Video memory: <64MB, 384MB>, resolution: up to 1024x768
使用したいタイプを選択してください。以下では $GVT_TYPE
としています。先に作成した GUID を使って vGPU を作成:
# echo "$GVT_GUID" > "/sys/bus/pci/devices/$GVT_PCI/mdev_supported_types/$GVT_TYPE/create"
作成した GUID の数だけ上記の操作を繰り返してください。作成した vGPU は /sys/bus/pci/devices/$GVT_PCI/
から確認できます。vGPU を削除したい場合:
# echo 1 > /sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove
最後に、仮想化した GPU を使って VM を作成するために、QEMU コマンドラインに以下のパラメータを追加してください:
-device vfio-pci,sysfsdev=/sys/bus/pci/devices/$GVT_PCI/$GVT_GUID,rombar=0