以降、一応の決着をみたので、最終的な手順を記録しました。(2025/07/25)
https://wiki.adminsblog.com/Knowledge/proxmox/iGPU-fixed
GMKtec NucBox K8 Plusを使って、Proxmox環境を構築する。
このページの位置づけ
CPU: AMD Ryzen7 8845HS (iGPU Radeon 780M)
MEM: 32G
SSD: 1TB
ProxmoxVE 8.3
GMKtecのWindows11ProはOEMライセンスっぽい。
確認方法:コマンドラインにて
slmgr/dli
OEM_DM channelとなっていればOEM版らしい。
念のためプロフダクトキーのバックアップ(デジタルライセンスでVMに移行できた)
regeditを起動
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\
BackupProductKeyDefaultのデータ部にプロダクトキーの記載がある。
Microsoft公式のISOを使うと認証されるとかされないとか。
GMKtecが公式にダウンロードできるWindowsのイメージを用意しているのでとっておく。
GMKtec Driver ans Software
今回は結局MS純正ISOでライセンス移行した。
ただし、ISOではなくzipファイル。この後Proxmox環境で使うときに不便なのでISO化する。(MS公式ISOでもいいと思うが)
フォルダをISO化するツールがあるのでこれで変換。
Folder2ISO
IOMMUとSVMをEnableにする。
何を有効にしているか
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]
この情報からデバイス番号を作成する。
lspci の読み方
1002:1900 はベンダID:デバイスID。前が AMD(1002)、後ろが GPU 本体。0000:c6:00.0 はドメイン:バス:スロット.ファンクション。同じ物理 GPU でも VGA と HDMI 音声でファンクションが分かれる(.0 と .1)。lspci で取り直す。グラフィック: 1002:1900+0000:c6:00.0
オーディオ: 1002:1640+0000:c6:00.1
iommuの有効化
iommu=pt はパススルー前提のモードで、ホストが使わないデバイスを素通しにする。I/O 性能の劣化を抑えたいときはこれで足りる。全部を DMA 変換したい場合は iommu=on を使うが、大抵は不要だ。/etc/default/grub を開き、GRUB_CMDLINE_LINUX_DEFAULT に iommu=pt が入っているか目視で確認しておく。amd_iommu=on も要ることがある。最近の Proxmox カーネルなら iommu=pt だけで動く。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に書き換え。
ids= に並べるのは lspci で確認したベンダID:デバイスIDだ。バス番号(c6:00.0)はここには書かない。同じチップが複数ある環境では、意図しない方まで掴まないよう ID をよく確認する。/etc/modprobe.d/ 配下なら名前は何でもよい。既に options vfio-pci の行がある場合、echo で追記すると二重定義になるので先に中身を見る。echo "options vfio-pci ids=1002:1900,1002:1640" >> /etc/modprobe.d/vfio.conf
vfio-pciドライバーをロード。これにより、ホストが GPU を使用できなくなり、仮想化ができるようになる。
softdep radeon pre: vfio-pci は「radeon を読み込む前に vfio-pci を先に読む」指定だ。GPU 側のドライバ(amdgpu/radeon)や音声ドライバ(snd_hda_intel)が先にデバイスを掴むと取り返せないので、読み込み順を固定する。update-initramfs -u -k all を実行してから再起動する。initramfs を作り直さないと反映されない。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が見えれば成功。
うまく vfio-pci にならないとき
Kernel driver in use: が amdgpu のままなら、update-initramfs -u -k all の実行忘れか、options vfio-pci ids= の ID 違いを疑う。dmesg | grep -e DMAR -e IOMMU で IOMMU が有効か確認する。BIOS 側が無効のままだとここに何も出ない。vfio-pci.ids=1002:1900,1002:1640 を grub に足す方法もある。update-initramfs -u -k all と再起動を行えば戻る。後はここの「Windows VMの作成」-「GPU をプライマリ GPU として使用する」の指示に従う
https://github.com/isc30/ryzen-gpu-passthrough-proxmox
Virtio-win ISOをダウンロードする
Virtio-win ISO
左側メニューのノード以下からlocalストレージを選び、ISOイメージを選択、アップロードからWindows11,virtio-win ISOの2つのISOをアップロードする。
インストール中、ドライブが見えないため、インストール場所の選択画面で"ドライバーの読込"を選択して、"参照"からマウントした"virtio-win-0.1.240"のISOから"\vioscsi\w11\amd64"フォルダーを指定してドライバーをインストールする。
インストールが完了したらシャットダウンし、ハードウェア→ネットデバイス→モデルを"VirtIO"に戻す。
「ネットワークに接続しましょう」の画面で「Shift」+「F10」でコマンドプロンプトを起動
「cd oobe」を入力しEnter
「BypassNRO.cmd」を入力しEnter
Windows 11を起動、VirtIOのISOから、"virtio-win-gt-x64.exe"、"virti-win-guest-tools.exeをインストール。
この段階でネットワークが復旧する。
自動インストーラーを使うと判定に失敗してインストールできないので、オフラインインストーラーを使う。
一度でも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
A.RadeonResetBugFixが死んでる説
https://forum.proxmox.com/threads/warning-updating-these-packages-broke-my-pci-passthrough.156848/page-3
B. 一緒に掴む必要があるAudio deviceがまだほかにある説
root@proxmox1:~# lspci -nn | grep -e 'Audio'
c6:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
c6:00.5 Multimedia controller [0480]: Advanced Micro Devices, Inc. [AMD] ACP/ACP3X/ACP6x Audio Coprocessor [1022:15e2] (rev 63)
c6:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h/19h HD Audio Controller [1022:15e3]
試しに追加してみたら、Proxmoxは正常に再起動できるようになるがVMがエラーで起動しない。
切り分けの考え方
hostpci0: 0000:c6:00.0,pcie=1,romfile=vbios_8845HS.bin,x-vga=1
hostpci1: 0000:c6:00.1,pcie=1,romfile=AMDGopDriver_8845hs.rom
hostpci2: 0000:c6:00.5
Proxmoxのバージョン、Radeonの型番などどこに原因があるかが議論されているがまだ結論は出てないっぽいのでわかり次第更新予定。
ちなみにProxmox側でVM起動時に出るWarningは以下。efidiskは関係ないかも。
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
swtpm_setup: Not overwriting existing state file.
TASK WARNINGS: 1
devcon.exe disable "PCI\VEN_1002&DEV_1900*"
devcon.exe enable "PCI\VEN_1002&DEV_1900*"
lspci で確認する。※ 本ページのAmazonリンクにはアフィリエイトタグ(toobf6-22)が付いている。
🤖 このページにはAIエージェント(ノア)による編集・加筆が含まれます。内容の正確性は保証できないため、重要な判断は一次情報でご確認ください。