Proxmox VE GPU パススルー
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 にコピー
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 が必要。
実際の設定例 (/etc/pve/qemu-server/114.conf)
agent: 1
balloon: 0
bios: ovmf
boot: order=scsi0;ide0;ide2;net0
cores: 8
cpu: host
efidisk0: local-lvm:vm-114-disk-0,efitype=4m,pre-enrolled-keys=1,size=4M
hostpci0: 0000:05:00.0,pcie=1,romfile=vbios_5825u.bin
hostpci1: 0000:05:00.1,pcie=1,romfile=AMDGopDriver-5825U.rom
ide0: none,media=cdrom
ide2: none,media=cdrom
machine: pc-q35-9.0
memory: 16384
meta: creation-qemu=9.0.2,ctime=1731754676
name: gputest3
net0: virtio=<~>,bridge=vmbr0,firewall=1
numa: 0
ostype: win11
scsi0: local-lvm:vm-114-disk-1,discard=on,iothread=1,size=64G,ssd=1
scsihw: virtio-scsi-single
smbios1: uuid=<~>
sockets: 1
tpmstate0: local-lvm:vm-114-disk-2,size=4M,version=v2.0
vmgenid: <~>
● (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 を再起動する必要がある。
正常に動いていたにも関わらず、VM 再起動後に
などの問題が発生する。この場合ホスト PC の再起動が必要。
Windows Update などで PC の再起動を促された場合も、Proxmox VE が走っているホスト 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/*
ネットワークに繋がらない場合は直接コンソールから操作する必要があるので、コンソールの画面出力が表示されなくなるような設定はハードウエア構成を変更する前に外しておいた方が良い。
デバイスの増減時の要注意
GPU など PCI デバイスを追加&削除するとパススルーしているデバイスに割り当てられたバスの番号が変化する可能性がある。
そのためパススルーしている VM の設定をすべて再確認する必要がある。
以下は実際にあったトラブル
最適化
vi /etc/default/grub
update-grub
reboot
複数 GPU パススルーの実際の設定メモ
AMD Ryzen 9 3950X + ASUS TUF GAMING X570-PLUS (ATX)
GPU 4 枚で同時パススルーを確認
PCIe Gen4 x16 スロット GeForce RTX 2070 Super
PCIe x16(Gen x4) スロット GeForce RTX 4060 Ti
M.2 (CPU側 Gen4 x4) スロット + OCulink (SFF8611/8612) + DEG1 で GeForce GTX 1080 or RADEON RX6400
PCIe x1(Gen x1) スロットにライザーケーブル経由で GeForce GTX 1070
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 無効化
AMD Ryzen 5 3600 + BIOSTAR X370GTN (ITX)
AMD Ryzen 7 9700X + ASUS TUF GAMING B650M-E
UEFI (BIOS) 設定
IOMMU 有効化
Resizable Bar 無効化
CSM 無効化
試した環境
GPU
きちんと動作したもの
GeForce RTX 4060 Ti 16GB (Ada Lovelace)
GeForce RTX 2070 Super 8GB (Turing)
GeForce GTX 1080 8GB (Pascal)
GeForce GTX 1070 8GB (Pascal)
GeForce GTX 970 4GB (Maxwell)
GeForce GTX 960 2GB (Maxwell)
RADEON RX 6400 4GB (RDNA2)
RADEON RX 480 8GB (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 にはリセット問題あり。RADEON でエラーが出る場合は Host PC を再起動する必要がある。
うまく動いていないもの
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
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 の追加と削除
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