LinuxMint21のQEMU+KVMで動くWindowsにGPUパススルー

AdobeCreativeCloudをGPUで快適に使用したく、設定対象の機種がAPUとGPUを両方使える機種だったので、APUはホスト用、GPUを仮想マシンのWindows用に設定することにした。

ASUS ROG Flow x13 GV301QH
AMD Ryzen 9 5900HS
NVIDIA GeForce GTX 1650 Mobile / Max-Q
Linux Mint 21 Vanessa
virt-manager 4.0.0
QEMU 6.2.0

GPUのデバイスIDを確認する。

01:00.0 3D controller [0302]: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] [10de:1f9d] (rev a1)

ArchWikiを参考にカーネルパラメーターに「amd_iommu=on」「iommu=pt」「vfio-pci.ids=[デバイスID]」を追加する。

…
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt vfio-pci.ids=10de:1f9d"
…

GRUBの設定を更新してホストを再起動する。

# update-grub

Windowsの仮想マシンはvirt-managerを使用して作成した。

仮想マシンを作成してインストール前に設定変更
ファームウェアをUEFIに
ハードウェアの追加でPCIホストデバイスのGPUを選択して追加
WindowsをインストールしてGPUが認識されていることを確認
ドライバなどをインストール
Windowsのリモートデスクトップを有効化
LinuxからRDPクライアントで接続できることを確認
Windowsをシャットダウン
仮想マシンの詳細設定で「ディスプレイ Spice」を削除
Windowsを起動してRDPで接続し動作確認

利便性を考えてこんなスクリプトも作ってみた。起動中画面のアイコンを変えたかったらzenityに--class付けてデスクトップエントリファイル(*.desktop)と関連付けて。

#!/bin/bash
virsh start windows 1>/dev/null 2>/dev/null
result=1
(
while [ ! "$result" = "0" ]
do
    nc -v -w 1 windows-vm.local -z 3389 1>/dev/null 2>/dev/null
    result=$?
    sleep 1
done
) | zenity --progress --title="Windows起動中" --text="仮想マシンを起動中です…\n" --width=300 --height=50 --percentage=99 --auto-close --no-cancel
remmina --connect=$HOME/.local/share/remmina/windows-vm-local.remmina 1>/dev/null 2>/dev/null
カテゴリーMint