KVMでのLooking Glass設定:GPUパススルーの遅延を劇的に改善する究極の解決策

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

従来のGPUパススルーにおける悩み

Linux上でWindows仮想マシンを動かすためにGPUパススルーを構築したことがある方なら、2台のモニターを使用する不便さを痛感しているはずです。

Linuxでスムーズにコードを書いていたのに、Windowsからの信号をモニターが認識するまで3〜5秒待たされるのは、作業の集中力を完全に削いでしまいます。また、マウスとキーボードが1セットしかない場合、切り替え機(KVMスイッチ)の導入はコストがかさむだけでなく、画質の低下を招くこともあります。

なぜ従来のリモートデスクトップでは不十分なのか?

多くのユーザーはRDP、VNC、あるいはParsecなどで代用しようと考えます。しかし、負荷の高いグラフィック作業や動きの速いゲームにおいて、これらの解決策には明確な限界があります。

  • 遅延(Latency): 1Gbpsのローカルネットワークであっても、遅延は15〜30ms程度発生します。CS2やValorantのようなFPSゲームにおいて、この数字は致命的です。
  • 映像の圧縮: スムーズな伝送のために映像が圧縮される(圧縮アーティファクト)ことが多く、色が不正確になります。これはカラーグレーディングや動画編集を行うクリエイターにとっては許容できません。
  • システムオーバーヘッド: 仮想マシン側でのエンコード and ホスト側でのデコードによりCPUを大幅に消費し、全体的なFPSが低下します。

現在主流のディスプレイソリューション

仮想化コミュニティでは、仮想マシンの映像を処理するために主に3つの方法が検討されます。

  1. 2台のモニターを使用: シンプルで安定していますが、スペースとコストがかかります。
  2. キャプチャカード: 外付けデバイスで映像をキャプチャし、USB/PCIe経由でLinuxに戻します。これには1万〜2万円程度の費用がかかり、依然として一定の遅延が存在します。
  3. Looking Glass: プロフェッショナルなLinuxユーザーにとって、現在最も最適化されたソフトウェアソリューションです。

Looking Glass:共有メモリを活用して1ms未満の遅延を実現

RTX 3070を搭載したホームラボを6ヶ月間運用した結果、Looking Glassこそがゲームチェンジャーであると確信しました。映像をネットワーク経由で伝送する代わりに、ホストとゲストの間に共有メモリ(Shared Memory)を作成します。

Windows仮想マシンはフレームを直接RAMに書き込み、Linuxホストはそれを読み取って表示するだけです。データはメモリバス上を直接流れるため、遅延はほぼゼロです。実際の使用感は非常に滑らかで、実機を使っているのと全く遜色がありません。

ステップ1:共有メモリ(IVSHMEM)の初期化

まず、フレームバッファの保存場所として /dev/shm 内にファイルを作成する必要があります。ファイルサイズは解像度に依存し、計算式は 幅 x 高さ x 4 x 2 (バイト) です。例えば1080pなら約32MB必要ですが、4Kへの対応も考慮して64MBまたは128MBを割り当てるのが無難です。

# 起動時に自動初期化するためのsystemd設定ファイルを作成
sudo nano /etc/tmpfiles.d/10-looking-glass.conf

# 以下の行を追加('username'を自分のユーザー名に変更してください)
f /dev/shm/looking-glass 0660 username kvm -

コマンド systemd-tmpfiles --create /etc/tmpfiles.d/10-looking-glass.conf を実行して設定を即座に適用します。

ステップ2:KVM仮想マシンのXML設定

virsh edit <仮想マシン名>仮想マシンの設定ファイルを開きます。<devices> タグ内の最後に、以下のコードを追加します。

<shmem name='looking-glass'>
  <model type='ivshmem-plain'/>
  <size unit='M'>64</size>
  <address type='pci' domain='0x0000' bus='0x10' slot='0x01' function='0x0'/>
</shmem>

busslot の値が既存のデバイスと競合していないか注意深く確認してください。

ステップ3:Windowsゲスト側での設定

Windows仮想マシンを起動し、以下の手順を実行します。

  1. VirtIO-Winリポジトリから IVSHMEMドライバ をダウンロードします。
  2. デバイスマネージャーを開き、「PCI Standard RAM Controller」のドライバをダウンロードしたファイルで更新します。
  3. Looking Glass Host (.exe) をインストールします。このプログラムが、GPUから共有RAMへフレームを転送する役割を担います。

ステップ4:Linuxホスト側でのクライアントのインストール

Linux側では、映像を表示するためにLooking Glassクライアントをインストールする必要があります。UbuntuやDebianの場合、最高のパフォーマンスを得るためにソースからビルドすることをお勧めします。

# 依存関係のあるライブラリをインストール
sudo apt install cmake libsdl2-dev libsdl2-ttf-dev libspice-protocol-dev libfontconfig1-dev libx11-dev

# ソースコードをクローンしてビルド
git clone --recursive https://github.com/gnif/LookingGlass.git
cd LookingGlass/client
mkdir build && cd build
cmake ../
make -j$(nproc)

./looking-glass-client を実行して仮想マシンのウィンドウを開きます。驚異的なレスポンス速度でWindowsの画面が表示されるはずです。

エクスペリエンスを最適化するための重要な注意点

Cyberpunk 2077のプレイやAdobe Premiereでの作業を通じて得た、3つの重要なTipsを紹介します。

  • HDMIダミープラグの使用: GPUは物理的なモニターが接続されていると認識しない限り、映像出力をアクティブにしません。数百円で購入できるダミープラグを使用することで、この問題を完全に解決できます。
  • 脱出キー: Looking Glassはマウスを「キャプチャ」します。Scroll Lock キーを押すことで制御を解除し、Linux側に戻ることができます。
  • 音声の同期: Looking Glassは映像のみを伝送します。音声については、仮想ネットワーク経由で極めて低遅延で音声を伝送できる Scream を別途インストールしてください。

総じて、Looking GlassはLinuxを完璧な仕事・娯楽マシンへと変えるための最後のピースです。皆さんのセットアップが成功することを願っています!

Share: