KVM仮想マシンの3Dグラフィックス加速:GPUパススルーは不要、VirtIO-GPUを使おう!

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

LinuxのUIがスローモーションのように重いとき

仮想マシンでアプリのデモを行っている最中、ターミナルウィンドウが表示されるまでに2秒もかかったことはありませんか?私はIntel i5-12400搭載のサーバーでこの問題に直面しました。CPUは非常に強力であるにもかかわらず、GNOMEインターフェースはひどくカクついていました。Chromeのウィンドウをドラッグするだけで、1つのCPUコアの負荷が100%に跳ね上がってしまいます。

原因は glxinfo | grep "renderer" コマンドの結果にあります。もし結果が llvmpipe であれば、仮想マシンはCPUを使用してすべてのグラフィックス処理を行っている(ソフトウェアレンダリング)ことになります。複雑なGPUパススルーのために数万円のグラフィックボードを買い足す代わりに、私は VirtIO-GPUVirgil3D を組み合わせる方法を選びました。

このソリューションにより、仮想マシンは中間ライブラリを介してホストの内蔵GPU(iGPU)の演算能力を「借りる」ことができます。結果は劇的で、FPSは10〜15から滑らかな60 FPSまで向上しました。仮想マシンでYouTubeの1080p動画を再生した際のCPU負荷も、80%から約15%まで低下しました。

なぜGPUパススルーよりVirtIO-GPUの方が実用的なのか?

GPUパススルーは極端な解決策です。1枚の物理グラフィックボードを1つの仮想マシンだけに完全に専有させる必要があります。自作ラボを運用している方や、Mini PC(Intel NUCやDell Optiplexなど)を使用している方にとって、オンボードGPUが1つしかない環境ではほぼ不可能です。

VirtIO-GPUとVirgil3Dには、主に3つの利点があります:

  • リソースの共有: 5〜10台の仮想マシンで1つのIntel iGPUやAMDグラフィックボードを共有できます。
  • セットアップが極めて迅速: IOMMUグループの設定や複雑なドライバのブラックリスト化は不要です。
  • 柔軟性: ノートPC、事務用PC、専用サーバーのいずれでも動作します。

ステップ1:ホストマシンでのアクセス権限設定

まず、ホストマシンに virglrenderer ライブラリが必要です。UbuntuやDebianであれば、以下のコマンド1つで環境を準備できます。

sudo apt update && sudo apt install qemu-system-x86 libvirglrenderer-dev libepoxy-dev virt-manager -y

多くの人が見落としがちな最も重要なポイントは、ハードウェアへのアクセス権限です。QEMUにはGPUデバイスファイル(通常は /dev/dri/renderD128)への読み書き権限が必要です。すぐにユーザーを render グループに追加しましょう:

sudo usermod -aG render $USER
# 変更を反映させるために、一度ログアウトして再ログインしてください

ステップ2:XML設定ファイルの編集

virt-manager のGUIでは、高度なオプションがすべて表示されないことがあります。最も確実な方法は、仮想マシンのXMLファイルを直接編集することです。

virsh edit 仮想マシン名 コマンドを入力し、 <devices> セクションを探します。以下の2つのコードブロックを置換または追加する必要があります。

1. Graphics Spiceの設定

OpenGLを有効にし、ホストマシンのGPUの正しいレンダーノードを指定します。

<graphics type='spice' autoport='yes'>
  <listen type='address'/>
  <gl enable='yes' rendernode='/dev/dri/renderD128'/>
</graphics>

2. Video Modelの宣言

グラフィックボードの種類を virtio に変更し、 accel3d 機能を有効にします。

<video>
  <model type='virtio' heads='1' primary='yes'>
    <acceleration accel3d='yes'/>
  </model>
</video>

保存後、再起動(Restart)ではなく、仮想マシンを一度完全にシャットダウンしてから起動してください。

ステップ3:仮想マシン内での結果確認

Ubuntu 22.04以降のようなモダンなディストリビューションには、必要なドライバが既に含まれています。仮想マシン内でターミナルを開き、確認ツールをインストールするだけです:

sudo apt update && sudo apt install mesa-utils -y
glxinfo | grep "renderer"

もし “Virgl” または “VirtIO V3D” という行が表示されれば、設定は成功です。 glmark2 を実行して違いを確認してみてください。3Dの立方体が、以前のカクつきが嘘のように非常に滑らかに回転するはずです。

「黒い画面」エラーを回避するための注意点

試行錯誤の末、トラブルシューティングのための3つの重要な経験則をまとめました:

  • Spiceのみを使用: Virgil3DはVNCプロトコル経由では動作しません。3Dパフォーマンスを享受するには、 virt-viewer または Remote Viewer を使用する必要があります。
  • AppArmorのエラー: 仮想マシンが起動しない場合は、 /var/log/libvirt/qemu/ のログを確認してください。 /etc/libvirt/qemu.conf ファイルでQEMUが /dev/dri/ にアクセスするための権限付与が必要な場合があります。
  • カーネル: 仮想マシンのカーネルが4.4以上であることを確認してください。古すぎるディストリビューションでは、このVirtIOグラフィックボードを認識できません。

おわりに

VirtIO-GPUを活用することは、コストをかけずにホームラボを最適化する最も賢い方法です。ストレスの溜まる仮想デスクトップ体験を、実機のようにスムーズなものに変えてくれます。WebGLアプリケーションを実行したり、単にGNOMEやKDEを快適に使いたい場合は、ぜひこの設定を試してみてください!

Share: