AMD Ryzen™ AI 9 HX PRO 370内蔵の、AMD Radeon™ 890MをVM上のWin11 Proで動かすことが目標。
私の動作時の環境
Proxmox VE 9.0.q0
root@pve:~# uname -a
Linux pve 6.14.11-2-pve #1 SMP PREEMPT_DYNAMIC PMX 6.14.11-2 (2025-09-12T09:46Z) x86_64 GNU/Linux
N5 Proだと共通だと思うがパススルーしたいデバイスはこちら。
root@pve:~# lspci -nn | grep -e 'AMD/ATI'
c6:00.0 Display controller [0380]: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] [1002:150e] (rev d1)
c6:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Radeon High Definition Audio Controller [Rembrandt/Strix] [1002:1640]
とりあえず正解はわからないけど、動いている状態でのBIOSの設定を貼っておく。
https://wiki.adminsblog.com/Knowledge/PC/minisforum_n5_pro/iGPU_Passthrough_BIOS
設定の注意点としてはSSD1枚でもZFSでセットアップすること。
ext4だと私の環境だとinitramfsが通らなかった。(しばらくエラーっぽくないエラーで気づかなかった)
モジュールのロードなど起動順序にシビアなところがあるようで、そのあたりが関係してそう。
当然ながらIPは固定しておくこと。
ライセンスとかアップデートとか。
このページの位置づけ
N5 Pro(AMD Ryzen AI 9 HX PRO 370 / Radeon 890M)のiGPUをWin11 VMへ渡すまでに試した設定と、そのときに出た症状を時系列で残した記録だ。最終的に落ち着いた構成と検証方法は成功編にまとめてある。ここでは「どの設定を入れると何が起きるか」「エラーの見分け方」を中心に補足する。
以下、私の設定をそのまま貼り付け。
多分ZFSを選んだときはこの設定が一番重要かも。不要な設定もありそう。
カーネルパラメータの意味(足し引きの意味が分からなくなるので先に整理しておく)
iommu=pt … IOMMUをパススルーモードにする。ゲストへ渡すデバイスだけ変換テーブルを張るので、AMD環境のパススルーではほぼ必須。無いと性能が落ちる。initcall_blacklist=sysfb_init … 起動時にカーネルが簡易フレームバッファ(efifb/vesafb)を掴むのを止める。ホストがiGPUを握るとVMへ渡せないので入れる。成功編でも最後まで残っている必須項目。nofb / video=efifb:off / video=vesafb:off … 上のsysfb対策と役割が重なる。BIOSのフレームバッファをカーネルに使わせない指定。ここでは試したが最終構成からは外れている。pcie_acs_override=downstream,multifunction … IOMMUのグループ分けを強制的に細かくする。GPUとオーディオを別グループとして渡したいときの保険。副作用が強く、これの有無で挙動(VGA起動になるか、ドライバが当たった状態で起動するか)が変わる。iommu.strict=1 / iommu.passthrough=1 / iommu=fullflush … IOMMUのTLBフラッシュまわり。足すと再起動が伸びる/メモリ浸食が起きるなど、この環境では逆効果だったので最終的に外している。pcie_aspm=off … PCIeの省電力(ASPM)を切る。パススルー時のリンク不具合対策としてよく挙がるが、ここでは決め手にならなかった。iommu=soft … ハードウェアIOMMUが不調なときのソフトウェアIOMMUへのフォールバック。BIOSロゴが出ない症状の回避として試したが、VMが起動しなくなったので外した。# nano /etc/kernel/cmdline
修正後
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt initcall_blacklist=sysfb_init
修正前
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.passthrough=1 iommu=fullflush pcie_aspm=off pcie_acs_override=downstream,multifunction nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
色々見てるとZFSのときにこの設定は効いてない可能性があるけど念のため。
# nano /etc/default/grub
修正後
GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt"
修正前
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
ここに設定している人もいるが、結果として私の場合は何も入れていない。
# nano /etc/modprobe.d/blacklist.conf
これは多分必要。
# nano /etc/modules
# /etc/modules is obsolete and has been replaced by /etc/modules-load.d/.
# Please see modules-load.d(5) and modprobe.d(5) for details.
#
# Updating this file still works, but it is undocumented and unsupported.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
ここは2デバイスのIDを記載。
# nano /etc/modprobe.d/vfio.conf
options vfio-pci ids=1002:150e,1002:1640
softdep radeon pre: vfio-pci
softdep amdgpu pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
新旧コマンドが混ざってる気もするがこれでカーネルに反映
vfio-pci の意味と ids の読み方
vfio-pci は「デバイスをホストの本来のドライバに掴ませず、VMへそのまま渡す」ためのスタブドライバ。lspci -nnk の Kernel driver in use が vfio-pci になっていれば、そのデバイスはパススルー待ちの状態だ。ids=1002:150e,1002:1640 は「ベンダID:デバイスID」の組。1002 がAMD/ATI、150e がRadeon 890M(表示機能)、1640 がGPU内蔵のHDオーディオ。lspci -nn の角括弧 [1002:150e] がそのままこの値になる。softdep X pre: vfio-pci は「X(amdgpu / radeon / snd_hda_intel)を読み込む前に vfio-pci を先に当てる」順序指定。逆になると本来のドライバに先に奪われてパススルーできない。# update-initramfs -u -k all
# proxmox-boot-tool refresh
# update-grub
ここまでで再起動
vfio-pciで使えるようになっているか確認。c6:00.0,c6:00.1がKernel driver in use: vfio-pciになっていれば成功。
lspci -nnk
root@pve:~# lspci -nnk
c6:00.0 Display controller [0380]: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] [1002:150e] (rev d1)
Subsystem: Device [1f4c:b020]
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
c6:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Radeon High Definition Audio Controller [Rembrandt/Strix] [1002:1640]
Subsystem: Device [1f4c:b020]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
c6:00.2 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Strix/Krackan/Strix Halo CCP/ASP [1022:17e0]
Subsystem: Advanced Micro Devices, Inc. [AMD] Strix/Krackan/Strix Halo CCP/ASP [1022:17e0]
Kernel driver in use: ccp
Kernel modules: ccp
c6:00.4 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Device [1022:151e]
Subsystem: Advanced Micro Devices, Inc. [AMD] Device [1022:15b9]
Kernel driver in use: xhci_hcd
Kernel modules: xhci_pci
c6:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h/19h/1ah HD Audio Controller [1022:15e3]
DeviceName: Realtek ALC245
Subsystem: Advanced Micro Devices, Inc. [AMD] Device [1022:d808]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
c6:00.7 Signal processing controller [1180]: Advanced Micro Devices, Inc. [AMD] Sensor Fusion Hub [1022:164a]
Subsystem: Advanced Micro Devices, Inc. [AMD] Sensor Fusion Hub [1022:164a]
Kernel driver in use: pcie_mp2_amd
Kernel modules: amd_sfh
root@pve:~#
ドライバが切り離せているかを確認。Kernel driver in use: XXXXXが変化しているかを確認
root@pve:~# lspci -ks 0000:c6:00.0
c6:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev d1)
Subsystem: Device 1f4c:b020
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
root@pve:~# echo "0000:c6:00.0" > /sys/bus/pci/drivers/vfio-pci/unbind 2>/dev/null
root@pve:~# lspci -ks 0000:c6:00.0
c6:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev d1)
Subsystem: Device 1f4c:b020
Kernel modules: amdgpu
root@pve:~# echo "0000:c6:00.0" > /sys/bus/pci/drivers/amdgpu/bind 2>/dev/null
root@pve:~# lspci -ks 0000:c6:00.0
c6:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev d1)
Subsystem: Device 1f4c:b020
Kernel driver in use: amdgpu
Kernel modules: amdgpu
root@pve:~# echo "0000:c6:00.0" > /sys/bus/pci/drivers/amdgpu/unbind 2>/dev/null
root@pve:~# lspci -ks 0000:c6:00.0
c6:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev d1)
Subsystem: Device 1f4c:b020
Kernel modules: amdgpu
root@pve:~# echo "0000:c6:00.0" > /sys/bus/pci/drivers/vfio-pci/bind 2>/dev/null
root@pve:~# lspci -ks 0000:c6:00.0
c6:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev d1)
Subsystem: Device 1f4c:b020
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
root@pve:~#
この時点で、ちゃんとパススルーができる状態になっていればN5 Pro本体のHDMI出力が、ブートローダー以降黒の未出力になっているはず。なっていなければ設定ミスってる可能性大。
特に悩む必要はないという結果に至っているが、PCI Deviceのパススルーは上記2台が必須。
重要なのはWin11の場合、vbiosとAMDGopDriverの指定が必要。
vbiosの抜き方はこちら。isc30/ryzen-gpu-passthrough-proxmox
AMDGopDriverの抜き方はこちら。elandwg commented on Mar 1, 2024
AMDGopDriverはryzen-gpu-passthrough-proxmoxのサイトに落ちているが、これではだめだったので自分で再作成する必要があるが、超面倒なので2つのファイルを置いておく。
vbios_1002_150e_and_AMDGopDriver.zip
さらにコード43エラーを避けるためにinga-lovinde/RadeonResetBugFix: Radeon Reset Bug fixを使用する可能性が高い。その場合は0000:c6:00.6のオーディオを追加。
これはカーネル側の設定に加える必要はなく存在してればよさそう。
無いとResetBugFixが効かない気がする。

うちの環境では、なぜかVMを起動すると大量のエラーを吐く。
これがどの設定で避けられるのかは不明だし、この工程が無くても出来ている人はいる。なんでだろ?

VM起動前に以下のコマンドを叩く。詳しくはSnippetsを参照。StorageのContentにSnippetsを追加するとデフォルトでは/var/lib/vz/snippets/にスクリプトを入れるディレクトリがある。
$ echo 1 > /sys/bus/pci/devices/0000\:c7\:00.0/remove
$ echo 1 > /sys/bus/pci/rescan
VM起動時にSnippetsを呼ぶ設定。
#create snippets folder
$ mkdir /var/lib/vz/snippets
#create script with content above
$ nano /var/lib/vz/snippets/gpu-hookscript.sh
#!/bin/bash
if [ $2 == "pre-start" ]
then
echo "gpu-hookscript: Resetting GPU for Virtual Machine $1"
echo 1 > /sys/bus/pci/devices/0000\:c6\:00.0/remove
echo 1 > /sys/bus/pci/rescan
fi
#make it executable
$ chmod +x /var/lib/vz/snippets/gpu-hookscript.sh
#apply script to VM
$ qm set 100 --hookscript local:snippets/gpu-hookscript.sh
症状の見分け方(この後のログは、結局この4つのどれが起きているかを追っているだけとも言える)
IO_PAGE_FAULT やメモリ関連エラーで埋まり、ホストの空きメモリが減っていくように見える。リセットが不完全で、前のVMが残したDMAが残存メモリを指すのが原因。iommu=soft や iommu.force_aperture で一時的にマシになるが根治しない。iommu.strict=1 iommu.passthrough=1 iommu=fullflush を足すと耐える回数が伸びることがある(無限に再起動できた構成もあった)。1回目のVMシャットダウン、VM起動
AMD-Vi: Event logged [IO_PAGE_FAULT ]
https://forum.zorin.com/t/solved-amd-vi-iommu-event-log-overflow/34763
iommu=softを追記
マシンの起動時にブートローダーロゴがちゃんと出るようになった
ログ上変ではないが、VMが起動しない。
->余計なのを消したら直ったかも
nano /etc/modprobe.d/vfio.confはそもそもせっていしているのか?
.6がないと、一度は起動するが再起動もできない?
pcie_acs_override=downstream,multifunctionが効いてる気がする。これがあると、VM起動時にVGAにならず、ドライバがロードされた状態で起動そる。ただし、再起動で43エラー
0.6パススルーありRadeonResetBugFix,pcie_acs_override=downstream,multifunctionあり
初回起動時VGA
BIOS SPICIFIEDをAUTOに変更したらC6がC7に
初回起動
[ 90.031856] vfio-pci 0000:c7:00.0: enabling device (0002 -> 0003)
[ 90.031917] vfio-pci 0000:c7:00.0: resetting
[ 90.056213] vfio-pci 0000:c7:00.0: reset done
[ 90.073822] vfio-pci 0000:c7:00.1: enabling device (0000 -> 0002)
[ 90.073838] vfio-pci 0000:c7:00.1: resetting
[ 90.097878] vfio-pci 0000:c7:00.1: reset done
[ 90.112813] vfio-pci 0000:c7:00.6: enabling device (0000 -> 0002)
[ 90.137648] vfio-pci 0000:c7:00.1: resetting
[ 90.160809] vfio-pci 0000:c7:00.1: reset done
[ 90.161246] vfio-pci 0000:c7:00.0: resetting
[ 90.186160] vfio-pci 0000:c7:00.0: reset done
2回目
[ 163.002538] vfio-pci 0000:c7:00.0: resetting
[ 163.026836] vfio-pci 0000:c7:00.0: reset done
[ 163.041471] vfio-pci 0000:c7:00.1: resetting
[ 163.066282] vfio-pci 0000:c7:00.1: reset done
[ 163.108851] vfio-pci 0000:c7:00.1: resetting
[ 163.132486] vfio-pci 0000:c7:00.1: reset done
[ 163.133176] vfio-pci 0000:c7:00.0: resetting
[ 163.158015] vfio-pci 0000:c7:00.0: reset done
ここのほうほうでかいけつか?
https://github.com/isc30/ryzen-gpu-passthrough-proxmox/issues/16
終了、起動で2回目からフラッシュ。3回目、メモリ系フラッシュ
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt pcie_acs_override=downstream,multifunction nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
終了、起動で2回目からメモリ系フラッシュ
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
ここまでpnputilなし、追加してみる
remove rescan辞めたら2回目から起動しない。
この時のdmesgはこれで埋め尽くされている。
[ 1076.614208] vfio-pci 0000:c7:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0002 address=0x30c3c0000 flags=0x0000]
関係ありそう。
https://github.com/ollama/ollama/issues/7575
AMD GPU IOMMU 設定を備えた Intel Xeon の推奨カーネル パラメータ
:
intel_iommu=on – Intel CPU の IOMMU を有効にし、カーネルが GPU のメモリを管理できるようにします。iommu
=pt – IOMMU をパススルーモードに設定します。これは、直接メモリアクセスを必要とする GPU に最適です。
メモリとページテーブルの権限:
iommu.strict=1 – 厳密なメモリ割り当てを有効にします。これは、GPUワークロードなどのメモリ使用量が多い設定で役立ちます。iommu.passthrough
=1 – GPUなどのデバイスが割り当てられたメモリ領域に直接アクセスできるようにします。
ページテーブル処理:
iommu.force_aperture=1 – IOMMU が単一のメモリ領域を使用するように強制します。これにより、大規模なメモリ領域での安定性が向上します
。iommu=fullflush – IOMMU が完全なキャッシュフラッシュを実行し、潜在的なメモリ競合を軽減します。PCIe
および GPU 固有の最適化:
pcie_aspm=off – アクティブステートパワーマネジメントを無効にし、高性能GPUにおける潜在的なレイテンシ問題を防止します。amdgpu.vm_update_mode
=3 – 複数のGPUを扱う際のamdgpuによる仮想メモリの更新を改善します。
診断とフォールトトレランス:
loglevel=7 – 詳細なカーネル ログを有効にします。これは、詳細な障害診断に役立ちます。
iommu=soft – フォールバックとして、ハードウェア IOMMU に問題がある場合、ソフトウェア IOMMU を有効にします。
これが誰かの役に立つことを願います。
正解です。
私は以下のものを申請しました。
$sudo nano /etc/default/grub
#Append IOMMU at the end of GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt iommu.strict=1 iommu.passthrough=1 amdgpu.vm_update_mode=3"
これで再チャレンジ
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.force_aperture=1 iommu.passthrough=1 nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
一回目起動。正常2回目以降変化なし
さらに追加
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.force_aperture=1 iommu.passthrough=1 amd_iommu=on iommu=fullflush pcie_aspm=off nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
一回目起動。正常,リブート3回OKこれは行けそう。終了、起動1回目
gnif/vendor-resetも試す
https://zenn.dev/nkte8/scraps/671df0f24fbb81
追加でやること
apt install build-essential
apt install pve-headers
apt reinstall -y pve-headers-$(uname -r)
src/amd/amdgpu/atom.cの32行目
#include <asm/unaligned.h>
を
#include <linux/unaligned.h>
に変更
効果なし。
20220924
下記のオプションを削除すると初回起動後解像度落ち。遅延して解像度復活。2回再起動も可能だけど3回目は駄目。
iommu.strict=1 iommu.passthrough=1 iommu=fullflush pcie_aspm=off pcie_acs_override=downstream,multifunction nofb video=efifb:off video=vesafb:off
これだと再起動は無限に行けるが終了、起動はメモリ浸食。
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.passthrough=1 iommu=fullflush pcie_aspm=off initcall_blacklist=sysfb_init
これだけ追加してみる
iommu.strict=1 iommu.passthrough=1 iommu=fullflush pcie_aspm=off
```
これは駄目
```
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.passthrough=1 iommu=fullflush pcie_aspm
```
改めてこれは再起動1回はOK
```
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt initcall_blacklist=sysfb_init
```
下記オプション&x86-64-v2-AESで終了、起動でメモリ浸食
```
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.force_aperture=1 iommu.passthrough=1 amd_iommu=on iommu=fullflush pcie_aspm=off nofb video=efifb:off video=vesafb:off initcall_blacklist=sysfb_init
```
さらにremove消してみる→だめ。起動しない。
s最新バックアップ
```
root=ZFS=rpool/ROOT/pve-1 boot=zfs quiet iommu=pt iommu.strict=1 iommu.force_aperture=1 iommu.passthrough=1 amd_iommu=on iommu=fullflush pcie_aspm=off initcall_blacklist=sysfb_init
```
あやしいけど試してない
**この試行錯誤の結論**
- 最終的に効いたのは、**vbios / AMDGopDriverを正しく指定する**ことと、**VMの起動前後にPCIデバイスをremove/rescanし、Windows側でDevConによりenable/disableする**ことの組み合わせだった。カーネルパラメータの足し引きだけではcode43とメモリ浸食を消しきれなかった。
- パラメータは増やしすぎると別の症状(再起動不可・メモリ浸食)を呼ぶ。成功編の最終形は `quiet iommu=pt initcall_blacklist=sysfb_init` 程度まで絞ってある。派手なオプションは諸刃の剣だと思っておく。
- 「remove/rescanをやめると2回目以降が起動しない」というログのとおり、この環境は**毎回デバイスを切り離してから渡す**運用が前提。乱暴だが、これが一番安定する。
https://www.reddit.com/r/VFIO/comments/ry4i4d/workaround_for_sysfs_cannot_create_duplicate/
## 参考URL
- [Proxmox VE PCI Passthrough(公式Wiki)](https://pve.proxmox.com/wiki/PCI_Passthrough)
- [Arch Wiki: PCI passthrough via OVMF(カーネルパラメータの解説が詳しい)](https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF)
- 設定値はProxmoxのバージョン(このページは9.0.q0 / カーネル6.14.11-2-pve)で挙動が変わることがある。適用前に自分の環境のカーネルで確認しておく。
※ 本ページのAmazonリンクにはアフィリエイトタグ(toobf6-22)が付いている。
---
> 🤖 このページには**AIエージェント(ノア)による編集・加筆**が含まれます。内容の正確性は保証できないため、重要な判断は一次情報でご確認ください。