💻

Ubuntu上に立ち上げたWindowsにGPUを割り当てLooking Glass KVMで接続してゲームを遊ぶ

2024/09/22に公開

とりあえずセールでポチったり人から譲り受けたパーツでそろそろ 1 台組めそう + 既存デスクトップ pc より少し良いスペックになりそうだったので、移行先デスクトップ環境の整備をした記録。実現手段の解説と言うより試行錯誤の記録中心。

対象読者

  • Windows 離れしたい
    • でもゲームはやりたい & Windows でしか動かないゲームがある
    • (デイリーこなしたいだけなので音や画質より使い勝手の良さを重視したい)
  • そのためだけに別端末起動したくない(同一デスクトップ上で済ませたい)
  • メインマシンでも仮想マシン内でも GPU が使いたい
    • ただし仮想マシン起動中にメインマシンの GPU 性能は維持したい
    • つまり別々の GPU リソース割当

な人(いるのか?)。

検証環境

OS(main): Ubuntu Desktop 22.04 LTS
OS(host): Windows 11 Pro
CPU: AMD Ryzen 9 3950X
RAM: DDR4 3200Mhz 32GB * 2
GPU: RTX 4070 super + GTX 1660 Ti(for pass-through)

やったこと

  1. (実現手段比較検討)
  2. Ubuntu Desktop + Nvidia ドライバセットアップ
  3. virsh で Windows VM 作成
  4. Ubuntu 側で VM 設定
  5. GPU パススルー設定
  6. Windows VM 側で設定
  7. Looking Glass 設定

以下で順に補足。

実現手段比較検討

  • 別デバイスと併用する
    • 必要に応じて Windows をつける
    • ポータブルゲーミング pc をつける
    • PS5 をつける
  • サービスを利用する
    • NVIDIA GeForce Now をつかう
  • メインマシンでなんとかする
    • 仮想 Windows を立ち上げる - メインマシンと GPU を共有する - 仮想 Win 用の GPU を別途接続する

あれこれ検討したが、今回のケースにおいては「ぜんぶ単一 PC で解決したい」が最優先事項だったため仮想 Windows の方針で進めることに。

Ubuntu Desktop + Nvidia ドライバセットアップ

先行事例が沢山あるので既存記事[1]などを参考にさせて頂いた。環境構築後にデスクトップ画面が立ち上がらないことが何度かあったがリカバリモードで修復。3,4 回経験したが Nvidia ドライバの入れ直しですべて解決。

virsh で Windows VM 作成

  • GUI で設定(Virtual Machine Manager を利用)
  • CUI で設定($ virsh ~

virsh-manager は USB メモリ経由で Ubuntu Desktop イメージを作成する際に用いた Rufus と似たような感覚でセットアップ出来る。初回はそれでイメージを掴んだが、結局細かい設定変更を Claude に相談しつつ進めるなら CUI のが便利だった、ということで最終的に実行したのは下記。

$ sudo virt-install \
  --name Win11VM \
  --memory 16384 \
  --vcpus 4 \
  --disk path=/PATH/TO/FILENAME.qcow2,format=qcow2 \
  --os-variant win11 \
  --cdrom /Windows11のISO \
  --network network=default \
  --graphics spice

GPU パススルー設定

先人の有り難い記事[2] がたくさんあるのと Claude 3.5 sonnet が優秀すぎるのとでいつの間にか完了していた。。解説記事を添付しつつ「どこまで完了しているのか」を確認するためのコマンドを都度出力してもらい進捗を判断する、というステップ形式が非常に便利だった。

細かい設定は環境次第なのでクリティカルだった箇所のみ。

Win11VM.xml

<domain type='kvm'>
  <name>Win11VM</name>
  ...
  <memory unit='KiB'>16777216</memory>
  <currentMemory unit='KiB'>16777216</currentMemory>
  ...
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/PATH/TO/FILENAME.qcow2'/>
      <target dev='sda' bus='sata'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    ...
    <memballoon model='none'/>
    <shmem name='looking-glass'>
      <model type='ivshmem-plain'/>
      <size unit='M'>32</size>
      <address type='pci' domain='0x0000' bus='0x10' slot='0x01' function='0x0'/>
    </shmem>
  </devices>
</domain>

Windows VM 側で設定

Windows 側で Nvidia ドライバをインストール…しただけだった記憶。

Looking Glass 設定

client side

xml ファイルの設定については GPU パススルー設定の箇所で書いているとおり。本家 Installation ページ[3]に記載あり。なお Looking Glass のトップページでは推奨設定が記載されている[4] がこのドキュメントは古く、現在はクライアント側が Nvidia 系 GPU でも問題ないらしい[5]。手元の環境では何も問題なく動いている。

host side

  • パススルー GPU にダミーのドングル(この過程で初めて存在を知った)[6]を接続
  • 仮想 Windows に looking-glass-host.exe を配置しスタートアップアプリに設定

ダミードングルについては参考記事[7]に記述あり。解像度上げたいときにこれが必要だった。

補足

「どこまで完了しているのか」を確認するためのコマンドを都度出力してもらい進捗を判断する、というステップ形式

こんな感じで進めてみた、のサンプルを 2 つほど。

Claude 実行サンプル 1
GPU パススルーの設定を行うにあたって、以下の手順で進めていきましょう。環境が異なるため、4 年前の記事とは若干異なる部分がありますが、基本的な流れは同じです。

1. IOMMU グループの確認
2. VFIO の設定
3. カーネルパラメータの設定
4. 仮想マシンの設定

それでは、順を追って説明していきます。

## IOMMU グループの確認

まず、GPU がどの IOMMU グループに属しているかを確認します。以下のコマンドを実行してください:

```bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
  n=${d#*/iommu_groups/*}; n=${n%%/*}
  printf 'IOMMU Group %s ' "$n"
  lspci -nns "${d##*/}"
done | sort -V
```

このコマンドの出力から、GTX 1660 Ti に関連するデバイス(VGA controller, Audio device, USB controller, Serial bus controller)が同じ IOMMU グループに属していることを確認してください。
Claude 実行サンプル 2
はい、実行結果を確認しました。以下の点に注目します:

1. IOMMU グループの分離: GTX 1660 Ti (パススルー対象の GPU) は IOMMU Group 25 に属しており、そのグループには以下のデバイスが含まれています:

```bash
IOMMU Group 25 0a:00.0 VGA compatible controller ...
IOMMU Group 25 0a:00.1 Audio device ...
IOMMU Group 25 0a:00.2 USB controller ...
IOMMU Group 25 0a:00.3 Serial bus controller ...
```

これは良いニュースです。すべての関連デバイスが同じ IOMMU グループに属しているため、これらを一緒にパススルーすることができます。

2. RTX 3070 (ホスト OS で使用する GPU) は IOMMU Group 24 に属しており、別のグループになっています。これも問題ありません。
3. AMD CPU/マザーボードを使用しているようですが、IOMMU グループの分離が適切に行われています。

結論として、この IOMMU グループの構成は GPU パススルーに適しており、特に問題は見られません。次のステップに進む準備が整っています。

次の手順として、VFIO の設定を行いますが、その前に以下の点を確認しましょう:

1. BIOS/UEFI 設定で、仮想化支援機能 (AMD-V) と IOMMU が有効になっていることを確認してください。
2. 現在使用している NVIDIA ドライバーのバージョンを確認します。以下のコマンドを実行してください:

```bash
nvidia-smi
```

このコマンドの出力を共有してください。
これらの情報を確認した後、VFIO の設定に進みましょう。準備ができたら次の手順に進みます。
脚注
  1. ubuntu に CUDA、nvidia ドライバをインストールするメモ ↩︎

  2. サルでもできる GPU パススルー ↩︎

  3. Looking Glass | Installation | Configuration ↩︎

  4. Looking Glass | Requirements | Recommended ↩︎

  5. NVIDIA(GitHub Issue) | True DMABUF support ↩︎

  6. HDMI ダミープラグ(Amazon)一例 ↩︎

  7. Looking Glass (KVM)を「例のグラボ」で試した ↩︎

Discussion