目次
Proxmox VE GPU パススルー
Proxmox VE 8.3 を使用
GPU パススルー設定
● (A) AMD CPU に外付け GPU として GeForce / RADEON (RX5000以降) を接続している場合
コマンドライン操作不要 1)
- UEFI(BIOS) で IOMMU 有効化
- IOMMU のグループが分離できていれば、そのまま PCI デバイスを仮想マシンに割り当てるだけで OK
● (B) Intel CPU に外付け GPU として GeForce / RADEON (RX5000以降) を接続している場合
コマンドライン操作不要 2)
- UEFI(BIOS) で VT-d 有効化
- IOMMU のグループが分離できていれば、そのまま PCI デバイスを仮想マシンに割り当てる
● (C) AMD APU/CPU の内蔵 GPU を利用する場合
外部 GPU とは異なり romfile が必要
- UEFI(BIOS) で IOMMU 有効化
- vfio の読み込み設定
- /etc/modules に以下の行を追加
vfio vfio_iommu_type1 vfio_pci
- /etc/modprobe.d/vfio.conf を作成して以下の内容を書き込み
blacklist amdgpu blacklist snd_hda_intel
- update-initramfs -u -k all
- reboot
- rom file の準備
- 参考ページ の手順に従い vbios.c をコンパイルして vbios コマンドを作成
- vbios コマンドを実行
- 出力ファイル vbios_*.bin を /usr/share/kvm/vbios_apu.bin にコピー
- Win11 を使用する場合は AMDGopDriver.rom も準備し同様に /usr/share/kvm/AMDGopDriver_apu.rom にコピー
- UEFI(BIOS) で CSM を有効化してから Windows 10 + SeaBios を利用する場合は AMDGopDriver.rom は不要
- VM を作成して設定ファイルを編集する
- /etc/pve/qemu-server/<ID>.conf を編集して hostpci の行に romfile を以下のように追加
hostpci0: 0000:05:00.0,pcie=1,romfile=vbios_apu.bin hostpci1: 0000:05:00.1,pcie=1,romfile=AMDGopDriver_apu.rom
- もしエラーが出る場合、うまく起動できない場合は HOST ごと再起動する必要あり。
- もし VM に GeForce ドライバーが含まれている場合は先にアンインストールしておくこと。
- AMDGopDriver.rom を作成するにはマザーボードのサポートページからダウンロードできる BIOS ROM が必要。
● (D) Intel CPU の内蔵 GPU を利用する場合
未調査
IOMMU グループが分離できているかどうか
以下の例では、GeForce GTX 970, GeForce GTX 960 それぞれに異なる IOMMU のグループ番号 (15 と 16) が割り当てられているのでそのままパススルーできる。 またバス番号も GPU 毎に独自のもの (0b と 0c) が割り当てられているため、All Functions を使ってアサインできる。
以下の例では、RADEON RX 6400 に割り当てられた IOMMU が 0 で、他のデバイス (NVMe SSD や LAN コントローラーその他) と共有されているのでそのままではパススルーできない。 下の方にある GeForce GTX970 は IOMMU Group が 2 で独立しているのでパススルーできる。
VM へ PCI デバイス追加時の All Functions
PCI デバイス追加時の「All Functions」を使うと、複数の項目をまとめて設定できるので便利だが必須ではない。 GPU のバス番号が分離されていない場合は使えないので、その場合は Function 毎に個別に割り当てを行う。
- All Functions の意味
- PCI デバイスの Function とは「0000:AA:BB.C」の C に相当する。
- 含まれる C をすべてパススルーする場合は All Functions 指定を使うことができる。コマンドラインの書式は C を含まない「0000:AA:BB」の形式になる。
- All Functions のチェックがない場合は、Function 毎にそれぞれ割り当てを行う必要あり。「0000:AA:BB.C」の形式で複数指定できる。
VM 起動時に自動的に vfio の読み込みが行われない場合
(A)~(D) だけでは正しく動作しない場合 (VM が起動しない、GPU ドライバが正しく動作せずエラー 43が発生している、など)。主に RADEON。
VM 起動後、lspci -nnk で vfio が読み込まれているかどうか確認できます。以下のように GPU とその Audio Driver に「Kernel driver in use: vfio-pci」があれば正しく動作しています。
~ 03:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] [1002:1638] (rev c3) Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] [1002:0123] Kernel driver in use: vfio-pci Kernel modules: amdgpu 03:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637] Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637] Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel ~
もしうまく読み込まれていない場合は設定が必要です。
- /etc/modules に以下の行を追加
vfio vfio_iommu_type1 vfio_pci
- /etc/modprobe.d/vfio.conf を作成して以下の内容を書き込み
blacklist amdgpu blacklist nouveau
- update-initramfs -u -k all
- reboot
AMD GPU (RADEON) のリセット
AMD GPU では、GPU のエラー発生時などリセットを行う場合に、ホスト PC を再起動する必要がある。
RADEON GPU で VM がうまく起動せず黒い画面のまま停止する場合、デバイスマネジャーのドライバ画面でエラー 43 が発生する場合などはホスト PC の再起動で解決することがある。
デバイスの増減でネットワークに繋がらなくなった場合
GPU や M.2 SSD など、PCI デバイスを追加したり外したりするとネットワークインターフェースの番号が変化する。 PCI 接続されているネットワークコントローラーに割り当てられているバス番号が変わるため。
- ip a で enp7s0 などインターフェースの番号を確認する
- /etc/network/interfaces 内の設定と食い違ってる場合は修正する
- reboot
以下の例では enp4s0 が iface と bridge-ports の 2箇所あるので忘れずに両方書き換える。
auto lo iface lo inet loopback iface enp4s0 inet manual auto vmbr0 iface vmbr0 inet static address 192.168.1.20/24 gateway 192.168.1.1 bridge-ports enp4s0 bridge-stp off bridge-fd 0 source /etc/network/interfaces.d/*
ネットワークに繋がらない場合は直接コンソールから操作する必要があるので、コンソールの画面出力ができなくなるようなオプションはハードウエア構成を変更する前に外しておいた方が良い。 例えば grub コマンドラインの「iommu=pt」や vfio.conf の「options vfio-pci ids=」指定など。
デバイスの増減時の要注意
GPU など PCI デバイスを追加&削除するとパススルーしているデバイスに割り当てられたバスの番号が変化する可能性がある。 そのためパススルーしている VM の設定をすべて再確認する必要がある。
以下は実際にあったトラブル
- Windows PC を使って一時的な Proxmox VE の検証を行った
- 念の為 Windows ブート用の M.2 SSD を取り外してから SATA の SSD に Proxmox VE をインストール
- VM (Windows 24H2) を作成し GPU パススルーのテストを行い、きちんと動作確認が取れた
- Windows と Proxmox のマルチブートできるように、外していた Windows ブート用の M.2 SSD を取り付けた
- バス番号がずれたことに気が付かず、Proxmox VE 上で VM を起動
- 以前の GPU の番号にちょうど M.2 SSD が割り当てられる
- VM (Windows 24H2) に Windows ブート用 M.2 SSD がパススルーされてしまう
- 追加ストレージとみなされて BitLocker が有効化
- Proxmox ではなくもとの Windows で起動しようとしたら、身に覚えのない BitLocker で起動できなくなった
またネットワーク接続のために設定変更が必要になる可能性があるので、コンソールの画面出力ができなくなるようなオプションはハードウエア構成を変更する前に外しておいた方が良い。 例えば grub コマンドラインの「iommu=pt」や vfio.conf の「options vfio-pci ids=」指定など。
最適化
上記手順で動作確認がとれてから、あらためて iommu=pt などの最適化を行う。
複数 GPU パススルーの実際の設定メモ
AMD Ryzen 9 3950X + ASUS TUF GAMING X570-PLUS (ATX)
- UEFI (BIOS) 設定例 (実際は SVM と IOMMU の有効化だけで十分だと思われる)
SVM Mode [Disabled]->[Enabled] Power On By PCI-E [Disabled]->[Enabled] SR-IOV Support [Disabled]->[Enabled] IOMMU [Auto]->[Enabled] ACS Enable [Auto]->[Enable] PCIe ARI Support [Auto]->[Enable] PCIe ARI Enumeration [Auto]->[Enable]
- GPU 3 枚で同時パススルーを確認
- PCIe Gen4 x16 スロット GeForce RTX 2070 Super
- PCIe x16(Gen x4) スロット GeForce GTX 1070
- M.2 (CPU側 Gen4 x4) スロット + OCulink (SFF8611/8612) + DEG1 で RADEON RX6400
- 上記に加えてチップセット側 M.2 (Gen4 x4) をストレージに利用できる
OCulink の RADEON RX6400 のみ vfio を読み込めていなかったので以下の設定を追加。GeForce の方は特に設定なし。
- vi /etc/modules
vfio vfio_iommu_type1 vfio_pci
- vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=1002:743f,1002:ab28 blacklist amdgpu
AMD Ryzen 9 3950x + ASRock B550M Steel Legend (M-ATX)
- UEFI (BIOS) 設定
- IOMMU 有効化
- Resizable Bar 無効化
- CSM 無効化
- マザーボード 2つ目の x16 スロットは IOMMU が分離されておらずそのままではパススルー設定できない
- その代わり M.2 の OCulink を併用することで GPU 2 枚のパススルーができることを確認
- PCIe Gen4 x16 スロット GeForce RTX 2070 Super
- M.2 (CPU側 Gen4 x4) スロット + OCulink (SFF8611/8612) + DEG1 で RADEON RX6400
- 上記の組み合わせでもチップセット側 M.2 (Gen3 x2) が残っているのでストレージに利用できる
- IOMMU の分離には pcie_acs_override が使える可能性があるが注意が必要 (未確認)
AMD Ryzen 5 3600 + BIOSTAR X370GTN (ITX)
- ITX でも OCulink を併用することで GPU 2 枚の同時パススルーを確認
- PCIe Gen3 x16 スロット GeForce GTX 960
- M.2 スロット (背面 Gen3 x4) + OCulink (SFF8611/8612) + DEG1 で RADEON RX6400
- ただし ITX なので上記以外に PCIe スロットが無く、ストレージは SATA 接続のみになった
- また X370 は M.2 が Gen3 なので Oculink 経由の接続速度に制限あり
AMD Ryzen 7 9700X + ASUS TUF GAMING B650M-E
- UEFI (BIOS) 設定
- IOMMU 有効化
- Resizable Bar 無効化
- CSM 無効化
- OCulink 併用で GPU 2 枚の同時パススルー割当が可能
- PCIe Gen4 x16 スロット RADEON RX6400
- CPU 側 M.2 スロット (Gen4 x4) + OCulink (SFF8611/8612) + DEG1 で GeForce GTX 960
- UEFI による IOMMU の有効化のみ、modules や vfio.conf などの書き換えは行っていない
- チップセット側 M.2 スロット (Gen4 x4) をストレージとして利用可能
- romfile があれば Ryzen 7 9700X 内蔵 GPU のパススルーも可能
試した環境
GPU
きちんと動作したもの
- GeForce RTX 2070 Super (Turing)
- GeForce GTX 1080 (Pascal)
- GeForce GTX 1070 (Pascal)
- GeForce GTX 970 (Maxwell)
- GeForce GTX 960 (Maxwell)
- RADEON RX 6400 (RDNA2)
- RADEON RX 480 (Polaris GCN4)
- Ryzen 5 5560U 内蔵 GPU RADEON Vega 6 (GCN5), romfile が必要
- Ryzen 5 5825U 内蔵 GPU RADEON Vega 8 (CGN5), romfile が必要
- Ryzen 7 9700X 内蔵 GPU RADEON (RDNA2), romfile が必要
RADEON でエラーが出る場合は Host PC を再起動する必要あり
うまく動いていないもの
- RADEON RX Vega 56 (Vega GCN5)
CPU
- Ryzen 5 2600 (Zen1+)
- Ryzen 5 3600 (Zen2)
- Ryzen 9 3950X (Zen2)
- Ryzen 5 5560U (Zen3)
- Ryzen 7 5825U (Zen3)
- Ryzen 7 9700X (Zen5)
- Core i7-6700K (Skylake)
Mother Board
- ASUS TUF GAMING B650M-E
- ASUS TUF GAMING X570-PLUS
- ASRock B550M STEEL LEGEND
- BIOSTAR X370GTN
- GMKTec NucBox M5 Plus
- ASRock H170M-ITX
MINISFORUM DEG1 OCulink
接続方法
- PC 側の電源を切る。電源ユニット (PSU) 側のスイッチで完全に切っておく。スイッチがない場合はコンセントから電源ケーブルを抜くことで代用。以下同様。
- DEG1 に載せた電源ユニット (PSU) のスイッチを切る。スイッチがない場合はコンセントから電源ケーブルを抜くことで代用。以下同様。
- Oculink ケーブルでそれぞれ接続する。
- DEG1 側の電源ユニット (PSU) のスイッチを入れる。電源ボタンの LED が点灯することを確認する。
- PC 側の電源ユニット (PSU) のスイッチを入れる。この時点で DEG1 の電源が自動的に入る場合あり。
- PC 側ケースのスイッチで PC の電源をいれる。
電源を完全に切る
- PC をシャットダウンする。
- PC の電源ユニットのスイッチを切る。
- DEG1 の電源ユニットのスイッチを切る。
これで OCulink ケーブルを取り外し可能な状態になる。DEG1 のビデオカードの載せ替えもこの状態で行う。
電源を入れる
必ず先に OCulink ケーブルを接続しておく。
- DEG1 の電源ユニットのスイッチを入れる。
- PC 側の電源ユニットのスイッチを入れる。
- PC の電源をいれる。
GPU パススルー設定等
パススルー設定を行って reboot したあと lspci で GPU が認識されていない場合がある。 その場合は完全に電源を切って OCulink ケーブルを一旦抜いて接続し直してから正しい手順で電源を入れ直す。
Proxmox VE その他
Cluster の追加と削除
- 追加、または削除するノード (PC) は仮想マシン (VM または CT) をすべて削除しておく必要あり
Cluster から特定のノードを削除
- クラスターに残すノードの shell から pvecm delnode NODE名
切り離されたノードからクラスターの情報を削除
- systemctl stop pve-cluster corosync
- rm -r /etc/corosync/*
- pmxcfs -l
- rm -r /etc/pve/nodes/NODE
- rm /etc/pve/corosync.conf
- killall pmxcfs
- systemctl start pve-cluster
- reboot