Proxmox VE の Windows 11 VM で
内蔵 GPU (Radeon) を使う手順書

ミニ PC の内蔵 GPU を Windows 11 の仮想マシンに「PCI パススルー」して、Blender や Unity の 3D 表示を高速化します。
画面は普段どおり SPICE で見られ、重い作業のときだけ Moonlight (映像配信) に切り替えることもできます。

検証環境: Proxmox VE 9.2 / ミニ PC (Ryzen 5 7640HS・Radeon 760M) ゲスト: Windows 11 (UEFI / q35) Blender 5.2 で実測 参考情報は別ページ (reference.html)

0はじめに・全体像

🎯 この手順でできること
  • VM の中の Blender / Unity が、内蔵 GPU で動く
  • 画面は普段どおり SPICE で操作できる (マウスも動く)
  • VM を止めて起動し直しても GPU が使える
  • (任意) Moonlight にすると映像がさらに軽快
⚠ 先に知っておくこと
  • ホスト本体の HDMI 出力は映らなくなる (GPU を VM に渡すため)。SSH と Web UI は今までどおり使える
  • GPU を使えるのは VM 1 台だけ
  • この手順は AMD の内蔵 GPU で確認したものです (NVIDIA / Intel は対象外)
いちばん大事な約束 (STEP 7 で対策しますが、運用でも守ってください)

VM を止めるときは、Windows の「シャットダウン」か Proxmox の Shutdown を使います。Stop (強制停止) や強制電源オフは使わないでください。強制停止すると GPU が初期化できなくなり、Proxmox ホストの再起動が必要になります (AMD GPU のリセット不具合)。

システム構成図
図1 構成のイメージ。GPU をホストから外して VM に渡します。ホストの画面は NanoKVM などで見ます (任意)。

作業の流れ (どこで何をするか)

PC あなたが使っている PC PVE Proxmox ホスト (SSH で操作) VM Windows 11 の中 BIOS/KVM ホスト本体の画面
作業の順番
図2 作業の順番。上の 9 つの STEP を、この順に進めます。

あなたの環境の値を入力 (入力するとコマンドに反映されます)

入力した値はこのブラウザにだけ保存されます。ページ内の黄色い文字 (PVE_IP や VMID など) が、入力すると緑に変わって、あなたの値に置き換わります。

0準備するもの

検証したバージョン (詳細を見る)
項目バージョン
Proxmox VE / カーネル9.2.21 / 7.0.14-23-pve
ミニ PCRyzen 5 7640HS, Radeon 760M = Phoenix1 (1002:15bf)
ゲスト OSWindows 11 Pro 26200 / UEFI (OVMF) / q35 / CPU host
AMD ドライバAdrenalin 26.9.2 (ドライバ 32.0.32015.2008)
SPICE エージェントnefarius/vd_agent 0.13.0
Blender5.2.2 LTS (OpenGL 4.6 / Vulkan)
Sunshine / Moonlight2026.914.233613 / 6.2.0

別の機種・別のバージョンでは、PCI アドレスやデバイス ID、画面の見え方が変わります。手順の考え方は同じです。

⬇ダウンロード — スクリプトの ZIP (3 つ)

この手順で使うスクリプトは、置き場所ごとに 3 つの ZIP にまとめてあります。3 つともダウンロードしてください (pc.zip は STEP 9 の Moonlight 配信を使う人だけで構いません)。

PVE pve.zip

Proxmox ホストで使うスクリプト (4 ファイル)。バックアップ、GPU の vfio 設定と vBIOS の取り出し、VM への GPU 追加。

約 6 KB ・ 使う場面: STEP 2 / 4 / 5

⬇ pve.zip をダウンロード
VM vm.zip

Windows VM で使うスクリプト (13 ファイル)。OpenSSH、SPICE エージェント、AMD ドライバ導入、リセット対策、表示切替、「Blender (GPU fast)」、Sunshine。

約 14 KB ・ 使う場面: STEP 3 / 6 / 7 / 9

⬇ vm.zip をダウンロード
PC pc.zip 任意

あなたの PC で使うスクリプト (2 ファイル)。Moonlight で配信するときに、表示の切り替えから接続までを 1 回で行います。

約 2 KB ・ 使う場面: STEP 9 (Moonlight を使う人だけ)

⬇ pc.zip をダウンロード

PC ダウンロードしたら展開する

ZIP を「ダウンロード」フォルダに保存した場合は、次の PowerShell をそのまま貼り付けると、C:\gpu-guide に pve・vm・pc の 3 つのフォルダができます。

PC の PowerShell作業用フォルダを作って、3 つの ZIP を展開
mkdir C:\gpu-guide
cd C:\gpu-guide
Expand-Archive $env:USERPROFILE\Downloads\pve.zip -DestinationPath .
Expand-Archive $env:USERPROFILE\Downloads\vm.zip -DestinationPath .
Expand-Archive $env:USERPROFILE\Downloads\pc.zip -DestinationPath .
Get-ChildItem . -Recurse -File | Unblock-File
dir
出力の例
Mode   Name
----   ----
d----- pc
d----- pve
d----- vm
このあとの手順は C:\gpu-guide が前提です

STEP 2・3・9 のコマンドは、この C:\gpu-guide から scp -r pve … のように実行します。エクスプローラーの「すべて展開」で展開した場合は、C:\gpu-guide\pve\00-backup-host.sh のようになっていて、フォルダが二重 (pve\pve) になっていないことを確認してください。

最後から 2 行目の Unblock-File は何?

Web から取得したファイルには「インターネットから取得」という印が付き、ダブルクリックしたときに Windows の警告が出ることがあります。この行でその印を外します。スクリプトはどれもテキストファイルで、メモ帳で中身を読めます。中身を確認したうえで使ってください。

1PVE 現状確認 — GPU の場所と IOMMU

まず PC の PowerShell から Proxmox ホストに SSH で入り、内蔵 GPU がどこにあるかを調べます。

PC の PowerShellPVE にログイン (パスワードはインストール時の root のもの)
ssh root@PVE_IP
PVE のシェルGPU の探索
pveversion
lspci -nn | grep -i -E "vga|display|audio"

こんな行が出ます (環境により数字は違います):

出力の例
65:00.0 VGA compatible controller [0300]: ... [AMD/ATI] Phoenix1 [1002:15bf] (rev c3)
65:00.1 Audio device [0403]: ... [AMD/ATI] Radeon High Definition Audio Controller [1002:1640]
65:00.6 Audio device [0403]: ... Family 17h/19h/1ah HD Audio Controller [1022:15e3]
GPU_ADDR を決める

VGA compatible controller の行の先頭 (上の例では 65:00.0) が GPU のアドレスです。このページ上部の入力欄の GPU_ADDR に入れておきましょう。その直後の .1 は GPU の HDMI 音声で、一緒に VM へ渡します。

IOMMU グループの確認

PVE のシェルGPU のまわりの機能が別々のグループになっているか
ls /sys/kernel/iommu_groups | wc -l
for d in /sys/kernel/iommu_groups/*/devices/*; do g=${d#*/iommu_groups/}; g=${g%%/*}; echo "group $g: $(lspci -nns ${d##*/})"; done | sort -V | grep "65:00"
出力の例
30                                  # ← 0 でなければ IOMMU は有効
group 18: 65:00.0 VGA compatible controller ... [1002:15bf]
group 19: 65:00.1 Audio device ... [1002:1640]
group 20: 65:00.2 Encryption controller ... PSP
group 21: 65:00.3 USB controller ...
group 22: 65:00.4 USB controller ...
group 23: 65:00.6 Audio device ... HD Audio Controller
数字が 0 だった / グループが 1 つにまとまっていた場合

BIOS の「IOMMU」「AMD-Vi」「SVM」が無効です。BIOS で有効にしてから、もう一度確認してください。

機能中身VM に渡す?
.0GPU 本体渡す
.1GPU の HDMI 音声渡す
.2PSP (暗号化)。ホスト自身が使用中渡さない
.3 .4USB コントローラ (NanoKVM のキーボードが載っていることがある)渡さない
.6オンボード音声渡さない
スクリプトは安全側に作ってあります

この手順のスクリプトは .0 と .1 だけを VM に渡します。PVE の画面の「All Functions (全機能)」は使わないでください。

2PCPVE バックアップ — 失敗しても戻せるように

設定を変える前に、ファイルのコピーと VM のスナップショットを取ります。まず pve.zip を展開してできた pve フォルダを PVE にコピーします。

⬇ pve.zip(まだなら。展開方法はダウンロードの項目へ)
コピーするファイル (C:\gpu-guide の中)コピー先 (PVE)
pve\00-backup-host.sh→/root/gpu-guide/
pve\01-setup-vfio.sh→/root/gpu-guide/
pve\02-add-gpu-to-vm.sh→/root/gpu-guide/
pve\extract-vbios-from-vfct.py→/root/gpu-guide/
PC の PowerShellZIP を展開した C:\gpu-guide で実行。フォルダごとコピーします
cd C:\gpu-guide
scp -r pve root@PVE_IP:/root/gpu-guide
PVE のシェルバックアップ (VM のスナップショットも作ります)
cd /root/gpu-guide
chmod +x *.sh
./00-backup-host.sh VMID
出力の例
backup folder : /root/gpu-passthrough-backup-20261011-130622
VM snapshot   : before-gpu-passthrough   (restore: qm stop VMID; qm rollback VMID before-gpu-passthrough)
これで戻れます

バックアップ先 (/root/gpu-passthrough-backup-…) には GRUB・modprobe.d・VM の設定が入ります。VM 全体は上のスナップショットに戻せます。元に戻す手順は「元に戻す」に書いてあります。

スナップショットが作れない場合

ストレージの種類 (LVM-thin、ZFS など) によっては作れません。その場合は ./00-backup-host.sh VMID --no-snapshot を使い、VM は Proxmox の「バックアップ」機能で別に保存しておいてください。

3VM と PC の下準備 — GPU を渡す「前」に済ませる

GPU を渡したあとは VM の画面が不安定になることがあります。先に、VM をあとから操作できる準備 (SSH・SPICE の正しい設定) をしておきます。

PVE 3-1 VM の設定を確認する

PVE のシェル
qm config VMID
項目あるべき値理由
biosovmfUEFI 起動 (Windows 11 の標準)
machinepc-q35-…PCI Express のパススルーに必要
cpuhost—
vgaqxlSPICE で画面を見るため。外さない
tablet1SPICE のマウスのずれ防止
agentenabled=1QEMU ゲストエージェント
PVE のシェル足りないものがあれば (VM を止めてから)
qm set VMID --vga qxl --tablet 1 --agent enabled=1

VM 3-2 OpenSSH サーバーを有効にする (ファイルを送るため)

PVE の Web UI で VM を選び「コンソール」を開いて (SPICE が使えます)、Windows で 管理者として PowerShell を開き、次を貼り付けます。最初の 1 回だけ手入力が必要です。

VM の PowerShell (管理者)
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service sshd -StartupType Automatic
Start-Service sshd
if (-not (Get-NetFirewallRule -Name OpenSSH-Server-In-TCP -ErrorAction SilentlyContinue)) { New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 }
New-Item -ItemType Directory C:\gpu-setup -Force | Out-Null
ipconfig    # ← IPv4 アドレスが VM_IP です

PC 3-3 VM 用ファイルを送る

vm.zip を展開してできた vm フォルダを、VM に送ります。

⬇ vm.zip(まだなら。展開方法はダウンロードの項目へ)
コピーするファイル (C:\gpu-guide の中)コピー先 (VM)
vm\ の中身すべて (13 個)→C:\gpu-setup\vm\
PC の PowerShellWindows のパスワードを聞かれます
cd C:\gpu-guide
scp -r vm WINUSER@VM_IP:C:/gpu-setup/

PCVM 3-4 パスワード無しで入れるように SSH 鍵を作る

PC の PowerShell鍵を作る (質問は Enter のままで OK) → 公開鍵を表示
ssh-keygen -t ed25519
type $env:USERPROFILE\.ssh\id_ed25519.pub
VM の PowerShell (管理者)"ssh-ed25519 …" の全文を、PC に表示された公開鍵に置き換える
cd C:\gpu-setup\vm
Set-ExecutionPolicy -Scope Process Bypass -Force
.\enable-openssh.ps1 -PublicKey "ssh-ed25519 AAAA... あなたの公開鍵"
PC の PowerShellパスワード無しで入れれば成功
ssh WINUSER@VM_IP hostname

VM 3-5 SPICE エージェントを新しくする (マウスが動かなくなる問題の予防)

古い SPICE エージェントは、パススルーした GPU があるとマウスが動かなくなります。修正済みのエージェントに入れ替えます。

VM の PowerShell (管理者)
cd C:\gpu-setup\vm
.\install-spice-agent.ps1
成功の目安

最後の表で spice-agent が Running、vdservice が Disabled なら OK です。ダウンロードしたファイルは SHA-256 と署名を自動で確認します。

4PVE ホストの設定 — GPU を vfio に確保して再起動

ホストが GPU を使わないようにして、代わりに VM へ渡せる状態 (vfio-pci) にします。あわせて GPU の「ビデオ BIOS (vBIOS)」を取り出します。

なぜ vBIOS が必要?

内蔵 GPU には単体の GPU のような ROM が無いため、そのままでは VM の GPU が コード 43 で動きません。ACPI テーブルから取り出した vBIOS を VM に渡すと動きます (スクリプトが自動で行います)。

PVE のシェル① まず「予行演習」(何も変更しません)
cd /root/gpu-guide
./01-setup-vfio.sh GPU_ADDR --dry-run

書き込む内容と、vBIOS が取り出せること (55AA=True) が表示されます。問題なければ本番です。

PVE のシェル② 本番
./01-setup-vfio.sh GPU_ADDR
出力の例 (最後のほう)
VFCT table: 17028 bytes
  image: PCI 65:00.0  id 1002:15bf  size 16896  55AA=True
  -> saved /usr/share/kvm/vbios_1002_15bf.rom  sha256=...
Finished. NEXT: reboot the host ('reboot') ...
vBIOS file name to use later: vbios_1002_15bf.rom
このスクリプトが変更するもの (詳細を見る)
ファイル内容
/etc/modprobe.d/vfio.confoptions vfio-pci ids=1002:15bf,1002:1640 disable_vga=1 と、softdep amdgpu pre: vfio-pci など (GPU を amdgpu より先に vfio-pci が確保する)
/etc/modules と /etc/initramfs-tools/modulesvfio vfio_iommu_type1 vfio_pci を追加 (initramfs 側にも必要)
/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に iommu=pt を追加 → update-grub
initramfsupdate-initramfs -u -k all
/usr/share/kvm/vbios_….romACPI の VFCT テーブルから取り出した vBIOS (VM の設定ではこのフォルダのファイル名だけ指定できる)

変更前のファイルは STEP 2 のバックアップに入っています。AMD の IOMMU は BIOS で有効にすれば足り、amd_iommu=on のようなカーネルオプションは不要です。

PVE ホストを再起動して確認

再起動すると、ホスト本体の画面 (HDMI) は映らなくなります

GPU を VM に渡すためで、故障ではありません。SSH (ssh root@PVE_IP) と Web UI (https://PVE_IP:8006) は使えます。念のため、ホストの画面を見られる KVM があると安心です。

PVE のシェルVM を止めてから再起動 → 数分後に再ログイン
qm shutdown VMID
reboot
PVE のシェル (再起動後)確認 (2 行目は GPU_ADDR の末尾 .0 を .1 にした HDMI 音声)
lspci -nnk -s GPU_ADDR
lspci -nnk -s 65:00.1
成功の目安

両方に Kernel driver in use: vfio-pci と出れば成功です (amdgpu や snd_hda_intel のままなら、STEP 4 をやり直してください)。

機種によって (検証に使ったミニ PC で確認したこと)

再起動のたびに BIOS が青い「Boot Option Restored」画面で止まることがありました。KVM などでホストの画面を見て、Continue boot または Always continue boot を選ぶと起動します。Always を一度選ぶと、その後は止まりませんでした。

5PVE VM に GPU を追加する

PVE のシェルVM は止まっている状態で。まず予行演習 → 本番
cd /root/gpu-guide
./02-add-gpu-to-vm.sh VMID GPU_ADDR --dry-run
./02-add-gpu-to-vm.sh VMID GPU_ADDR
qm start VMID
VM の設定に追加される行
hostpci0: 0000:65:00.0,pcie=1,romfile=vbios_1002_15bf.rom
hostpci1: 0000:65:00.1,pcie=1
設定の考え方 (確認済み)
  • vga: qxl はそのまま残す。外すと SPICE の画面が出なくなります
  • x-vga=1 や「Primary GPU」は付けない
  • PVE の画面の「All Functions」は使わない (USB 等まで巻き込むため)

VM が起動したら、Windows の「デバイス マネージャー」の「ディスプレイ アダプター」を開きます。この時点では次のようになっているのが正常です。

見えるもの意味
Red Hat QXL controllerSPICE 用の画面 (正常)
Microsoft Basic Display Adapter に ⚠GPU は見えているが、ドライバがまだ無い。次の STEP 6 で解決します

6PCVM AMD ドライバを入れる

AMD のインストーラを VM で直接実行しない

オンライン版インストーラは「AMD 製品ではない」と判定されて止まることがあります。ここでは、インストーラの中から ディスプレイドライバだけを取り出して、VM に入れます (Adrenalin のアプリは入りません)。

PC 6-1 ドライバを取り出す

PC の PowerShellダウンロードしたインストーラのあるフォルダで。ファイル名は実際のものに
cd $env:USERPROFILE\Downloads
& "C:\Program Files\7-Zip\7z.exe" x -oC:\amd-extract .\whql-amd-software-adrenalin-*.exe "Packages\Drivers\Display"
dir C:\amd-extract\Packages\Drivers\Display

フォルダ (例: WT6A_INF) が出てくれば成功です。名前はバージョンによって違うことがあります。

PC 6-2 VM に送る

コピーするフォルダ (PC)コピー先 (VM)
C:\amd-extract\Packages\Drivers\Display\WT6A_INF→C:\gpu-setup\amddrv
PC の PowerShell約 2 GB。LAN なら数十秒です
scp -r C:\amd-extract\Packages\Drivers\Display\WT6A_INF WINUSER@VM_IP:C:/gpu-setup/amddrv

VM 6-3 インストール

VM の PowerShell (管理者)
cd C:\gpu-setup\vm
Set-ExecutionPolicy -Scope Process Bypass -Force
.\install-amd-driver.ps1 -DriverDir C:\gpu-setup\amddrv
成功の目安

最後の表で AMD Radeon 760M Graphics (お使いの GPU の名前) の Status が OK になります。

Status が Error (コード 43) のとき
  1. VM をシャットダウン
  2. Proxmox ホストを再起動 (reboot)
  3. VM を起動 (qm start VMID)

ホストを起動した直後の「最初の VM 起動」は GPU がきれいな状態です。それでも直らないときは、STEP 5 の設定に romfile=… があるかを確認してください (参考情報)。

Windows Update の自動ドライバ更新に注意

検証中、Windows Update が古い AMD ドライバを自動で入れて青い画面 (BSOD) になったことがありました。そうなった場合も、上のとおりホスト再起動で戻り、手動で入れたドライバが使われます。

7VM 対策スクリプト・表示切替・ショートカット

ここが、このやり方の要です。次の 3 つを 1 回のコマンドで入れます。

① GPU リセット対策
Windows のシャットダウン時に GPU を無効化、起動時に有効化します。これで VM を止めて再起動しても GPU が使えます。
② 表示モードの切替
SPICE モードとストリームモードを切り替えるタスク (GpuMode-spice / GpuMode-stream)。
③ 「Blender (GPU fast)」
デスクトップのショートカット。クリックするだけで、Blender が GPU で高速に動く状態で起動します。
先に Blender を VM に入れてください

ショートカットは Blender を探して作ります。Blender を入れたあとにもう一度スクリプトを実行しても大丈夫です。

VM の PowerShell (管理者)普段 Windows にログオンしているユーザーで実行します
cd C:\gpu-setup\vm
Set-ExecutionPolicy -Scope Process Bypass -Force
.\install-all.ps1
出力の例
[1/5] scripts copied to C:\ProgramData\gpu-reset-fix
[2/5] GPU reset-bug workaround installed (shutdown script + startup task)
[3/5] tasks GpuMode-spice / GpuMode-stream created for user ...
[4/5] task GpuMode-spice-onlogon created (returns to the SPICE layout 25 s after every logon)
[5/5] desktop shortcut 'Blender (GPU fast)' created

入れたものを確認する (再起動テスト)

  1. VM を Windows の「スタート → 電源 → シャットダウン」で止めます (PVE の Shutdown でも同じ)。

  2. PVE のシェル
    qm status VMID        # stopped になってから
    qm start VMID
  3. 起動して 1 分ほどしたら、VM でログを見ます。

    VM の PowerShell
    Get-Content C:\ProgramData\gpu-reset-fix\log.txt -Tail 8
    Get-PnpDevice -Class Display | Format-Table FriendlyName, Status -AutoSize
    正しい出力の例
    […] shutdown: disabling GPU
    […] disabled PCI\VEN_1002&DEV_15BF&SUBSYS_…
    […] startup: checking GPU
    […] status=Error problemcode=22
    […] status=OK problemcode=0
    […] final status=OK
成功の目安

shutdown: disabling GPU のあとで final status=OK になっていれば、リセット対策が働いています。2〜3 回繰り返しても OK のままなら完璧です。

install-all.ps1 は何をしている? (詳細を見る)
作るもの内容
C:\ProgramData\gpu-reset-fix\スクリプト一式とログ (log.txt / mode.log / launcher.log)
グループポリシーのシャットダウンスクリプトgpu-shutdown.ps1 (GPU を無効化)。gpedit.msc の「Windows の設定 → スクリプト → シャットダウン」で見えます
タスク GpuResetFix-Startup起動のたびに SYSTEM 権限で gpu-startup.ps1 (GPU を有効化)
タスク GpuMode-spice / GpuMode-stream手動で動かす表示切替。ログオンしているあなたの権限で動く
タスク GpuMode-spice-onlogonログオン 25 秒後に SPICE モードへ戻す (ストリームモードのまま VM を止めたときの保険)
powercfg /hibernate off「高速スタートアップ」を無効にし、毎回きちんとシャットダウンスクリプトを実行させる
デスクトップの Blender (GPU fast).lnkStart-Blender-Fast.ps1 を呼ぶ

やめたいときは uninstall-all.ps1 を管理者の PowerShell で実行します。

8PCVM 動作確認 — Blender が速いか見てみる

PC の virt-viewer (SPICE) で VM に接続し (PVE の Web UI → VM → コンソール → SPICE)、デスクトップの 「Blender (GPU fast)」 をダブルクリックします。

GPU fast ショートカットの動き
図3 ショートカットの流れ。途中で SPICE の画面が 10〜30 秒ほど黒くなりますが、自動で戻ります。

チェックリスト

速度の比較
図4 検証環境での比較。「GPU fast」で起動すると、普通に起動した場合より約 30 倍速くなりました。
なぜ「先に GPU 側で起動」するの?

Blender の描画ドライバ (OpenGL) は「ウィンドウを作ったときの画面」で決まります。SPICE の画面 (QXL) で作ると GPU が使えず、Blender は起動できません。そこで一瞬だけ画面を GPU 側にして Blender を起動し、すぐ SPICE に戻します。起動後の Blender は GPU のまま動き続けます (くわしくは 参考情報)。

使い方のルール
  • Blender は毎回このショートカットで起動する (閉じて開き直すたびに)。普通のショートカットだと遅い Vulkan になる
  • .blend ファイルをこのショートカットにドラッグ&ドロップすると、そのファイルが開く

9(任意) Moonlight で映像配信 — もっと軽快に

SPICE で十分なら、この STEP は飛ばしてかまいません。ゲームのベンチマークや、もっと大きな 3D 作業をするとき向けです。VM の GPU が映像をハードウェアで圧縮して PC に送るため、画面更新は約 3 ms と最速になります。

SPICE モードとストリームモード
図5 2 つの表示モード。Moonlight で接続するとストリームモード、終了すると SPICE モードに自動で戻ります。

VM 9-1 Sunshine (配信する側) を入れる

VM の PowerShell (管理者)STEP 7 のあとに。Web UI のユーザー名を決め、パスワードは画面で入力します
cd C:\gpu-setup\vm
Set-ExecutionPolicy -Scope Process Bypass -Force
.\install-sunshine.ps1 -WebUser admin
自動で行われること

最新版のダウンロード (SHA-256 と署名の確認つき)、サービスとして登録、Web UI のログインの設定、「Desktop」アプリの設定 (接続でストリームモード、終了で SPICE モード)、別の PC のブラウザから Web UI を使えるようにする設定です。

PC 9-2 Moonlight (見る側) を入れてペアリングする

  1. Moonlight のリリースページから MoonlightPortable-x64-….zip をダウンロードし、%LOCALAPPDATA%\Programs\Moonlight に展開します (インストーラ版でも可。その場合は 9-3 のスクリプトに -Moonlight で場所を教えます)。

  2. Moonlight を起動し、右上の「+」から VM_IP を追加します。4 桁の PIN が表示されます。

  3. PC のブラウザで https://VM_IP:47990 を開きます (証明書の警告は「詳細設定 → 進む」)。9-1 で決めたユーザー名とパスワードでログインし、PIN タブに表示された PIN を入力して送信します。

  4. Moonlight の一覧に VM が出て、「Desktop」が選べるようになれば完了です。

「CSRF Protection Error」が出たとき

別の PC のブラウザから Sunshine の Web UI を使うために許可が必要です。9-1 のスクリプトが VM の IP アドレスを許可してありますが、別のアドレス (別名など) で開くと出ます。VM で .\install-sunshine.ps1 -SkipInstall -AllowedOrigin https://開いたアドレス:47990 を実行してください。

PC 9-3 接続用のスクリプトを用意する (おすすめ)

Moonlight だけで接続しても映りますが、ハードウェアエンコードを使うには、接続の前に VM をストリームモードにしておく必要があります (Sunshine は接続の直後に使えるエンコーダを探すため)。次のスクリプトが、切替 → Moonlight 起動 → 終了後に SPICE へ戻す、までやります。

⬇ pc.zip(まだなら。展開方法はダウンロードの項目へ)
使うファイル (C:\gpu-guide\pc の中)置き場所 (PC)
pc\Start-Blender-Stream.ps1→そのまま C:\gpu-guide\pc で使えます (別のフォルダに移してもよい)
pc\Start-Blender-Stream.cmd→上と同じフォルダ (2 つは同じ場所に置く)
  1. Start-Blender-Stream.ps1 をメモ帳で開き、先頭の VM_IP_ADDRESS と WINDOWS_USER を、あなたの VM の IP アドレスと Windows のユーザー名に書き換えて保存します。

  2. Start-Blender-Stream.cmd をダブルクリックします。

  3. Moonlight の画面が出たら、VM の Blender (または他のアプリ) を通常どおり操作できます。

  4. 終わるときは Ctrl+Alt+Shift+Q でセッションを終了します。VM は自動で SPICE モードに戻ります。

Blender はストリーム中なら普通のショートカットで OK

ストリームモードの間は GPU が画面そのものなので、デスクトップの普通の「Blender 5.2」で、OpenGL のまま高速に動きます。

戻らなくなったとき

Moonlight を強制終了したときなどは、VM がストリームモードのままで SPICE が黒いままになることがあります。PC から次を実行すると戻ります。

PC の PowerShell
ssh WINUSER@VM_IP schtasks /run /tn GpuMode-spice

★毎日の使い方・守ること

やりたいことやり方
VM を止めるWindows の「シャットダウン」/ PVE の Shutdown (qm shutdown VMID)
VM を止める (やってはいけない)PVE の Stop (qm stop)・電源の長押し・クラッシュ → 次回 GPU が コード 43 になる
VM を再起動するWindows の「再起動」/ qm reboot VMID (どちらも OK)
コード 43 になったらVM を止める → Proxmox ホストを再起動 → VM を起動
Blender を起動するデスクトップの 「Blender (GPU fast)」 (SPICE で使うとき)
画面が黒いままになったPC から ssh WINUSER@VM_IP schtasks /run /tn GpuMode-spice
ホスト (ミニ PC) の電源を切る/入れる自動起動は設定していないので、起動後に qm start VMID が必要

?困ったとき

症状まず試すこと
デバイス マネージャーで GPU が コード 43VM を止める → ホストを再起動 → VM 起動。直らなければ vBIOS (romfile=) の設定を確認
VM は動くが GPU が出ない (Basic Display Adapter のまま)STEP 6 のドライバ導入。install-amd-driver.ps1 を実行
SPICE でマウスが効かない / カーソルが消えるSTEP 3-5 の SPICE エージェント。VM で schtasks /run /tn GpuMode-spice
VM が起動しない (qm start がエラー)STEP 4 の再起動をしたか、lspci -nnk で vfio-pci になっているか
Blender が「OpenGL 4.3 以上が必要」と出て起動しない普通のショートカットではなく 「Blender (GPU fast)」 で起動する
Blender が数秒待たされるほど遅い「GPU fast」を使わず Vulkan で起動していないか。いったん Blender を閉じて「GPU fast」で開き直す
Moonlight の映像が真っ黒・崩れるGPU のある実機 PC の Moonlight で試す。VM の PC 上の Moonlight は非対応のことが多い
ホスト再起動後に BIOS で止まるホストの画面で Continue boot / Always continue boot (機種による)

くわしい原因と対処は 参考情報 (トラブルシューティング) にあります。

↩元に戻す

一番簡単なのは STEP 2 のスナップショットに戻す方法です。部分的に戻したいときは下の 3 つを使い分けます。

PVE VM を GPU なしに戻す
PVE のシェル
qm shutdown VMID
qm set VMID --delete hostpci0,hostpci1
qm start VMID
PVE ホストに GPU を返す
PVE のシェル
rm /etc/modprobe.d/vfio.conf
sed -i '/^vfio/d' /etc/modules /etc/initramfs-tools/modules
cp /root/gpu-passthrough-backup-*/grub /etc/default/grub
update-grub; update-initramfs -u -k all
reboot
VM 対策スクリプトを外す
VM の PowerShell (管理者)
cd C:\gpu-setup\vm
.\uninstall-all.ps1
PVE のシェルVM 全体をスナップショットの時点に戻す
qm stop VMID
qm rollback VMID before-gpu-passthrough
qm start VMID

□ファイル一覧とコピー先

3 つの ZIP の中身と、コピー先の一覧です。ZIP は ダウンロードの項目にもあります。

ZIP の中のファイルコピー先使う STEP
pve\00-backup-host.sh→PVE: /root/gpu-guide/2
pve\01-setup-vfio.sh→PVE: /root/gpu-guide/4
pve\02-add-gpu-to-vm.sh→PVE: /root/gpu-guide/5
pve\extract-vbios-from-vfct.py→PVE: /root/gpu-guide/ (01 が自動で呼ぶ)4
vm\enable-openssh.ps1→VM: C:\gpu-setup\vm\3
vm\install-spice-agent.ps1→VM: C:\gpu-setup\vm\3
vm\install-amd-driver.ps1→VM: C:\gpu-setup\vm\6
vm\install-all.ps1→VM: C:\gpu-setup\vm\ (これが下の 6 個を C:\ProgramData\gpu-reset-fix\ にコピーする)7
vm\gpu-shutdown.ps1 / gpu-startup.ps1→VM: C:\gpu-setup\vm\ → 自動で C:\ProgramData\gpu-reset-fix\7
vm\gpu-mode.ps1 / gpu-mode-wait.ps1→同上7 / 9
vm\Start-Blender-Fast.ps1 / blender-ready.py→同上7
vm\uninstall-all.ps1→VM: C:\gpu-setup\vm\元に戻す
vm\install-sunshine.ps1 / sunshine-apps.json→VM: C:\gpu-setup\vm\9
pc\Start-Blender-Stream.ps1 / .cmd→PC: 好きなフォルダ9
おつかれさまでした!

うまくいかなかった方法や、測定の細かい数字、仕組みの説明は 参考情報 (別ページ) にまとめてあります。