Re:シルの日々の戯言。

散財が生き甲斐になりかけている、デジタルガジェット大好き自称黄色いネズミの戯言。

構成都合上NUC9i7QNXでPCIeパススルー(GPUパススルー)はできない

次期ハイパーバイザー環境として購入したNUC9i7QNXですが、十分な時間を取れず少々放置してしまいました・・・が、とりあえず文句を言いつつProxmox VEで検証を進めています。
NUC9i7QNXはミニPCではあるもののPCIe x16/x4スロットが搭載されているため、PCIe x16にQuadro P600を搭載してGPUパススルーで遊ぼうと考えています。

しかし、前評判ではGPUパススルーが簡単に試せるProxmox VEでQuadro P600を上手くパススルー設定できません。思惑通りに進まず、慣れないProxmox VEでフラストレーションが溜まりカッとなって(公開終了前にライセンスキー発行・ISOダウンロード済みで今からでもインストールできる)VMware ESXi 8.0 U2に入れ替える暴挙に出ましたが、それでも上手くQuadro P600をパススルー設定できません。
・・・少なくともESXi 7.0のときはiGPU(CPU内蔵/雑な言い方するとオンボードGPU)をパススルー設定できたため、PCIe x16に挿入したQuadro P600がパススルー設定ができないのは不思議なことです。
sylve.hatenablog.jp

どうにかQuadro P600をパススルーさせたいとの思いで調べていくと、どうやらNUC9i7QNX(厳密にはNUC 9 Extreme/Ghost Canyon)を利用している場合に発生する特有の問題のようです。
同じような構成でGPUパススルーを試みる人がいるかは不明ですが、雑にブログ記事として残しておくこととします。

PCIeスロットが搭載されている場所が悪い

結論を先に言うと、NUC9i7QNXのPCIeスロットが存在する物理的場所が原因です。

NUC9i7QNXは構成が特殊で、PCIeカード形状の特殊なマザーボードを「ベースボード」と称する基盤に接続し、拡張カード用のPCIeスロット・SSD向けM.2 スロットを利用する形になっています。
この「ベースボード」が難点で、ハイパーバイザーOS(Proxmox VE)から見るとベースボードが1つのIOMMUグループ(内部的なデバイスマッピンググループ)として認識されています。
私の環境だとPCIe x16にQuadro P600(GPUパススルー用)・PCIe x4にIntel X520-DA1(10GbEカード)・M.2スロットにシステム領域用SSDを接続させているため、GPUパススルーを構成して仮想マシンの電源を投入すると、(Intel X520-DA1にも影響が出ますが)システム領域用のSSDに悪影響を及ぼします。

具体的な症状として、Proxmox VE利用時は(Quadro P600をパススルー設定した)仮想マシンの電源を投入した瞬間にシステムが落ちます。物理コンソール(HDMIなどからの画面出力)を見ると「Remounting filesystem」とのメッセージが出力されているため、恐らく仮想マシンにパススルーされるタイミングでSSDが瞬断されてしまったのではないかと推察しています。
VMware ESXiの場合は仮想マシンで動かすOS次第で、Windows系OSの場合はデバイスドライバの適用まで進めるもののエラーコード43が発生、Linux系OSの場合はデバイスドライバが適用された辺りでESXi自体が落ちます。*1

NUC9i7QNXの「ベースボード」にグラフィックボード(Quadro P600)だけを挿入すれば私の思い描くGPUパススルーは上手くいくものと思われますが、ハイパーバイザー用サーバーとして全てのM.2スロットにSSDを搭載し、運悪くベースボードのM.2にシステム領域用SSDを搭載したのが間違いだったようです。

どうすればいいのか

ACS(Access Control Services)の機能を有効化する設定を施せば良いと書かれていますが、主にXeonなどエンタープライズクラスのCPU向けのため、Core i7搭載のNUC9i7QNXでは利用不可です。*2
別解としてはPCIeスロットの差し替えがありますが、NUC9i7QNXの場合はPCIe x16/PCIe x4/M.2が1つのIOMMUグループに所属されてるため、PCIeスロット差し替えの別解は使えません。

Proxmox VEの場合、強制的にACSを利用できるユーザーパッチが標準で適用されているため、grubの引数を修正することで対応可能なようです。・・・が、試して見たもののNUC9i7QNXでは上手く行かないようで症状は変わらず・・・。また、強制ACSのオプションは他に手段が存在しない場合の『最終手段』と言う文言も併記されているため、気軽に設定するパラメーターでは無さそうです。
pve.proxmox.com

ESXiの場合はどうするかと言うと、Broadcomに買収された関係上、ナレッジが探しにくいことになっているので「詰み」です。
多分、通常では設定出来ない箇所のパラメータをゴニョればProxmox VEと同じく類似設定ができそうな気がしますが、そもそもESXi自体がエンタープライズ向けでガチガチに固められた製品なので、逸般の誤家庭向けに本来あるべき姿ではないイレギュラー設定のナレッジは存在していない可能性も微レ存です。

Intel UHD 630(iGPU)ならESXiでパススルー可能

GPUパススルーが全く設定できないのかと言われると、実は出来なくはないと言う話になりまして・・・。

ESXiの(モニター出力の意味合いの)物理コンソールをQuadro P600に任せて、NUC9i7QNXのオンボードGPUであるIntel UHD 630をパススルーさせることは可能です。しれっとESXi 8.0 U2に入れ替えたときに(iGPUのパススルーを)試して成功していますし、Intel UHD 630のIOMMUグループが単独に設定されていたので、他のデバイスに影響を及ぼさないためです。
もう少し言うならば、今回のNUC9i7QNXでの構成だとQuadro P600に映像出力を任せられるため、過去事例の時に発生していたESXi再起動時にパススルー設定の有効・無効が不要になります。・・・もしIntel UHD 630だけの場合だと、ESXi再起動時にパススルー設定の無効・有効操作が必要*3になると思われるので、無用な手間が減るので意外と好ましい限りです。

・・・が、Quadro P600よりも圧倒的に低性能なIntel UHD 630をパススルーすることになるため、オブラート無しに表現すると「気に入らねぇ・・・」です。

ちなみにProxmox VEの場合は、どうしてもエラーコード43が出てしまいIntel UHD 630をパススルーすることができませんでした・・・。・・・あんるぇー?*4

NUC9i7QNXはGPUパススルー設定も含めて構成を考えた次期ハイパーバイザー環境ですが、GPUパススルーが出来ないことが(将来的なサーバー運用で)致命的な問題になるわけではありません。あくまでVMware ESXiが「あかんこと」になったので、不平不満を垂れ流していますがNUC9i7QNXでProxmox VEが使えれば必要最低限の要件は満たせます。
ただ、オンボードのiGPUパススルーがProxmox VEでは上手く行かないとなると、Quadro P600を搭載したNUC9i7QNXの存在意義が大きく失われてしまいます。GPUパススルーが行えないならばQuadro P600を売却して、代替としてPCIe x16に挿入・増設するSSDカードなどを調達してストレージ強化したほうが、遥かに有効的な気がしてきました。

いずれにせよ、そろそろ決断の時です。
何気にNUC9i7QNXを購入して1ヶ月以上が経過しているので、そろそろ次期ハイパーバイザー環境をどうするのか(無理にしてProxmox VEか、極めて消極的理由でESXiか)を決めて、本格稼働に移りたいところです・・・。

*1:当初エラーコード43に引っ張られて(ESXiでパススルー設定する場合に手動で設定する必要のあるパラメーターの)「hypervisor.cpuid.v0=FALSE」入れてるんだけど・・・と惑わされました・・・。

*2:古いユーザーブログなどを見ると「将来的にはCore i7/i5でも対応が期待されます」のような文言がありますが、少なくともNUC9i7QNXのUEFIではそんな設定項目は見かけませんでした・・・。

*3:再起動すると物理コンソール出力用にオンボードGPUが利用されてしまうため、変な挙動になります・・・。

*4:これでProxmox VEでiGPUパススルーが上手く行ったら、個人的に(Quadro P600が有効活用できず不満はあるもののある程度は)納得した環境なので本格始動となったのですが・・・。