GMKtec NucBox K8 Plusを使って、Proxmox環境を構築する。
→結果として、Windowsを再起動、終了させることができない状態なので実用的ではないことが判明。
少なくともProxmoxVE8.4.5 +Windows11Proの組み合わせなら複数の再起動、終了、起動に耐えうる理想状況だと思います。
何が変わったのか
CPU: AMD Ryzen7 8845HS (iGPU Radeon 780M)
MEM: 32G
SSD: 1TB
ProxmoxVE 8.4.5
IOMMUとSVMをEnableにする。
以降、基本は以下のページに倣う感じでOK.
https://github.com/isc30/ryzen-gpu-passthrough-proxmox
GPU PCI ID の確認。
lspci -nn | grep -e 'AMD/ATI'
c6:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix3 [1002:1900] (rev c5)
c6:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
この情報からデバイス番号を作成する。
グラフィック: 1002:1900+0000:c6:00.0
オーディオ: 1002:1640+0000:c6:00.1
iommuの有効化
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt"/g' /etc/default/grub
update-grub
カーネルモジュールを追加してvfio(仮想関数io)を有効にする
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules
vfioにどのデバイスを仮想化するか(GPU 1002:1900+ オーディオ1002:1640)を指定する。
idsは自分のidに書き換え。
echo "options vfio-pci ids=1002:1900,1002:1640" >> /etc/modprobe.d/vfio.conf
vfio-pciドライバーをロード。これにより、ホストが GPU を使用できなくなり、仮想化ができるようになる。
echo "softdep radeon pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
echo "softdep amdgpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
echo "softdep snd_hda_intel pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
カーネル モジュールを更新して再起動。
update-initramfs -u -k all
shutdown -r now
再起動後、Kernel driver in Useがvfio-pciになっているか確認。
lspci -nnk
c6:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix3 [1002:1900] (rev c5)
Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix3 [1002:0124]
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
c6:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
Kernel driver in use: vfio-pciが見えれば成功。
後はここの「Windows VMの作成」-「GPU をプライマリ GPU として使用する」の指示に従う
https://github.com/isc30/ryzen-gpu-passthrough-proxmox
私の環境の場合は、
(optional) Getting OVMF (UEFI) BIOS working: Error 43
も実施しています。
Virtio-win ISOをダウンロードする
Virtio-win ISO
左側メニューのノード以下からlocalストレージを選び、ISOイメージを選択、アップロードからWindows11,virtio-win ISOの2つのISOをアップロードする。
インストール中、ドライブが見えないため、インストール場所の選択画面で"ドライバーの読込"を選択して、"参照"からマウントした"virtio-win-0.1.240"のISOから"\vioscsi\w11\amd64"フォルダーを指定してドライバーをインストールする。
「ネットワークに接続しましょう」の画面で「Shift」+「F10」でコマンドプロンプトを起動
「cd oobe」を入力しEnter
「BypassNRO.cmd」を入力しEnter
Windows 11を起動、VirtIOのISOから、"virtio-win-gt-x64.exe"、"virti-win-guest-tools.exeをインストール。
この段階でネットワークが復旧する。
自動インストーラーを使うと判定に失敗してインストールできないので、CPU名もしくはGPU名を指定してオフラインインストーラーを使う。
nano /etc/pve/qemu-server/<VM_ID>.conf
argsゲストから仮想化を隠すように変更する
-hypervisor は CPUID 上からハイパーバイザの存在を消す。kvm=off は KVM の署名も隠す。AMD の Adrenalin はゲストが仮想環境だと判定するとドライバ導入や一部機能を拒むことがあるので、この2つを同時に指定する。
cpu: host と併記する。cpu: host だけではホストの CPU 機能がそのまま見えるので、隠したい分を args 側で落とす。
NVIDIA の Error 43 対策と同じ理屈だ。Radeon でも効くことがある。
hostpciGPUの行を変更する
romfile= には GPU の VBIOS(例 vbios_7xxx.bin)と、音声側の GOP ドライバ(例 AMDGopDriver_8845hs.rom)を分けて指定する。ROM を /usr/share/kvm/ に置くと、ファイル名だけで参照できる。
VBIOS の吸い出しは、同じ iGPU を積む実機の Windows か、Proxmox ホストの /sys/bus/pci/devices/0000:c6:00.0/rom から行う。GPU を先に vfio で掴んでいないと読めない点に注意する。
romfile を渡さないとゲスト側で初期化に失敗し、リセット不能の原因になることがある。逆に ROM の内容が実機と合っていないと映像が出ない。型番(8845HS なら Radeon 780M)に合うものを探す。
+以降を追加、-以降を削除、各id、ファイル名は自分の環境に合わせる。
+args: -cpu 'host,-hypervisor,kvm=off'
agent: 1
balloon: 2048
bios: seabios
boot: order=ide0;ide2;net0
cores: 8
cpu: host
-hostpci0: 0000:34:00.0,pcie=1
+hostpci0: 0000:34:00.0,pcie=1,romfile=vbios_7xxx.bin
hostpci1: 0000:34:00.1,pcie=1
ide0: local-lvm:vm-100-disk-0,discard=on,size=64G,ssd=1
ide2: local:iso/Windows10.iso,media=cdrom,size=4697792K
machine: pc-q35-8.0
memory: 12048
meta: creation-qemu=8.0.2,ctime=1696067822
name: win10
net0: e1000=E2:4A:E7:86:8D:13,bridge=vmbr0,firewall=1
numa: 0
ostype: win10
scsihw: virtio-scsi-single
sockets: 1
上記手順の2デバイスに加え、同じハードウェアIDの中にあるデバイス名に記載のあるデバイスはリセットに影響があるためパススルーに追加する(使用する、しないに関係なく、ないとリセットできないんだと思われる)
lspci -nn で同じ [1002:...] の並びを確認し、その中で GPU に属するものを hostpci に足す。番号は環境で変わる(このページの例は 34:00.0、iGPU ページは c6:00.0)ので読み替える。

一度でもiGPUをパススルーしたVMを落とすとどうやっても再起動できない。
VMも再起動できなければProxmoxも再起動できなくなるため、iGPUを掴んだVMが起動できるのは最初の一回だけ。
一度手放したグラボを初期化に失敗して再度つかむことができないっぽい。
WARN: no efidisk configured! Using temporary efivars disk.
error writing '1' to '/sys/bus/pci/devices/0000:c6:00.0/reset': Inappropriate ioctl for device
failed to reset PCI device '0000:c6:00.0', but trying to continue as not all devices need a reset
TASK ERROR: timeout waiting on systemd
Windowsの起動時、終了時に作法としてデバイスの有効化、無効化を明示的に実行する。
pnputilであれば標準で使えるので、下記gpedit.mscのバッチファイルに書くだけ。
pnputilは@ggrks_meさんに教えてもらいました。ありがとうございました。
私が見つけた方法はdevconだがインストールが面倒なのでpnputilが吉。
ローカルグループポリシーエディター gpedit.msc の中にある、スタートアップ、シャットダウンスクリプトの中に、enable.bat,disable.batをそれぞれ置き、devconを実行するだけ。
起動時(VEN_以降は自分のGPUのIDに書き換え)
pnputil /enable-device /deviceid PCI\VEN_1002&DEV_1900*
終了時(VEN_以降は自分のGPUのIDに書き換え)
pnputil /disable-device /deviceid PCI\VEN_1002&DEV_1900*
Windows Driver Kitをインストールすることなしにdevcon.exeを用意する
https://www7390uo.sakura.ne.jp/wordpress/archives/705
Devconによる有効化、無効化
https://curtisshoward.com/post/fixing-amd-gpu-passthrough-reset-issues-in-windows/
起動時(VEN_以降は自分のGPUのIDに書き換え)
devcon.exe enable "PCI\VEN_1002&DEV_1900*"
終了時(VEN_以降は自分のGPUのIDに書き換え)
devcon.exe disable "PCI\VEN_1002&DEV_1900*"
やっていることは、
ローカルグループポリシーエディター gpedit.msc の中にある、スタートアップ、シャットダウンスクリプトの中に、enable.bat,disavle.batをそれぞれ置き、devconを実行するだけ。
Win11homeはローカルグループポリシーエディターが標準では使えないのでコマンドで使えるようにする。
https://www.pastel-software.work/entry/windows11_home_gpedit_howtouse
以上の手順で問題は解決した。当時はパススルーするデバイスだけ追加するという作業はやらなかったので、もしかしたらRadeonResetBugFixも同じようなサービスで有効なのかもしれない。知らんけど。
※ 本ページのAmazonリンクにはアフィリエイトタグ(toobf6-22)が付いている。
🤖 このページにはAIエージェント(ノア)による編集・加筆が含まれます。内容の正確性は保証できないため、重要な判断は一次情報でご確認ください。