目次

Proxmox VE GPU パススルー

Proxmox VE 8.3 を使用

GPU パススルー設定

● (A) AMD CPU に外付け GPU として GeForce / RADEON (RX5000以降) を接続している場合

コマンドライン操作不要 1)

  1. UEFI(BIOS) で IOMMU 有効化
  2. IOMMU のグループが分離できていれば、そのまま PCI デバイスを仮想マシンに割り当てるだけで OK

● (B) Intel CPU に外付け GPU として GeForce / RADEON (RX5000以降) を接続している場合

コマンドライン操作不要 2)

  1. UEFI(BIOS) で VT-d 有効化
  2. IOMMU のグループが分離できていれば、そのまま PCI デバイスを仮想マシンに割り当てる

● (C) AMD APU/CPU の内蔵 GPU を利用する場合

外部 GPU とは異なり romfile が必要

  1. UEFI(BIOS) で IOMMU 有効化
  2. vfio の読み込み設定
    1. /etc/modules に以下の行を追加
      • vfio
        vfio_iommu_type1
        vfio_pci
    2. /etc/modprobe.d/vfio.conf を作成して以下の内容を書き込み
      • blacklist amdgpu
        blacklist snd_hda_intel
    3. update-initramfs -u -k all
    4. reboot
  3. rom file の準備
    1. 参考ページ の手順に従い vbios.c をコンパイルして vbios コマンドを作成
    2. vbios コマンドを実行
    3. 出力ファイル vbios_*.bin を /usr/share/kvm/vbios_apu.bin にコピー
    4. Win11 を使用する場合は AMDGopDriver.rom も準備し同様に /usr/share/kvm/AMDGopDriver_apu.rom にコピー
      • UEFI(BIOS) で CSM を有効化してから Windows 10 + SeaBios を利用する場合は AMDGopDriver.rom は不要
  4. VM を作成して設定ファイルを編集する
  5. /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

実際の設定例 (/etc/pve/qemu-server/114.conf)

● (D) Intel CPU の内蔵 GPU を利用する場合

未調査


IOMMU グループが分離できているかどうか

以下の例では、GeForce GTX 970, GeForce GTX 960 それぞれに異なる IOMMU のグループ番号 (15 と 16) が割り当てられているのでそのままパススルーできる。 またバス番号も GPU 毎に独自のもの (0b と 0c) が割り当てられているため、All Functions を使ってアサインできる。

X370

以下の例では、RADEON RX 6400 に割り当てられた IOMMU が 0 で、他のデバイス (NVMe SSD や LAN コントローラーその他) と共有されているのでそのままではパススルーできない。 下の方にある GeForce GTX970 は IOMMU Group が 2 で独立しているのでパススルーできる。

B550

VM へ PCI デバイス追加時の All Functions

PCI デバイス追加時の「All Functions」を使うと、複数の項目をまとめて設定できるので便利だが必須ではない。 GPU のバス番号が分離されていない場合は使えないので、その場合は Function 毎に個別に割り当てを行う。

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
~

もしうまく読み込まれていない場合は設定が必要です。

  1. /etc/modules に以下の行を追加
    • vfio
      vfio_iommu_type1
      vfio_pci
  2. /etc/modprobe.d/vfio.conf を作成して以下の内容を書き込み
    • blacklist amdgpu
      blacklist nouveau
  3. update-initramfs -u -k all
  4. reboot

AMD GPU (RADEON) のリセット問題

AMD GPU では、GPU のエラー発生時などリセットを行う場合に、ホスト PC を再起動する必要がある。

正常に動いていたにも関わらず、VM 再起動後に

などの問題が発生する。この場合ホスト PC の再起動が必要。 Windows Update などで PC の再起動を促された場合も、Proxmox VE が走っているホスト PC 毎再起動を行った方がよい。

デバイスの増減でネットワークに繋がらなくなった場合

GPU や M.2 SSD など、PCI デバイスを追加したり外したりするとネットワークインターフェースの番号が変化する。 PCI 接続されているネットワークコントローラーに割り当てられているバス番号が変わるため。

  1. ip a で enp7s0 などインターフェースの番号を確認する
  2. /etc/network/interfaces 内の設定と食い違ってる場合は修正する
  3. 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 の設定をすべて再確認する必要がある。

以下は実際にあったトラブル

最適化

  1. vi /etc/default/grub
    • iommu=pt
  2. update-grub
  3. reboot

複数 GPU パススルーの実際の設定メモ

AMD Ryzen 9 3950X + ASUS TUF GAMING X570-PLUS (ATX)

OCulink の RADEON RX6400 のみ vfio を読み込めていなかったので以下の設定を追加。GeForce の方は特に設定なし。

  1. vi /etc/modules
    • vfio
      vfio_iommu_type1
      vfio_pci
  2. 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)

AMD Ryzen 5 3600 + BIOSTAR X370GTN (ITX)

AMD Ryzen 7 9700X + ASUS TUF GAMING B650M-E

試した環境

GPU

きちんと動作したもの

ただし RADEON にはリセット問題あり。RADEON でエラーが出る場合は Host PC を再起動する必要がある。

うまく動いていないもの

CPU

Mother Board


接続方法

  1. PC 側の電源を切る。電源ユニット (PSU) 側のスイッチで完全に切っておく。スイッチがない場合はコンセントから電源ケーブルを抜くことで代用。以下同様。
  2. DEG1 に載せた電源ユニット (PSU) のスイッチを切る。スイッチがない場合はコンセントから電源ケーブルを抜くことで代用。以下同様。
  3. Oculink ケーブルでそれぞれ接続する。
  4. DEG1 側の電源ユニット (PSU) のスイッチを入れる。電源ボタンの LED が点灯することを確認する。
  5. PC 側の電源ユニット (PSU) のスイッチを入れる。この時点で DEG1 の電源が自動的に入る場合あり。
  6. PC 側ケースのスイッチで PC の電源をいれる。

電源を完全に切る

  1. PC をシャットダウンする。
  2. PC の電源ユニットのスイッチを切る。
  3. DEG1 の電源ユニットのスイッチを切る。

これで OCulink ケーブルを取り外し可能な状態になる。DEG1 のビデオカードの載せ替えもこの状態で行う。

電源を入れる

必ず先に OCulink ケーブルを接続しておく。

  1. DEG1 の電源ユニットのスイッチを入れる。
  2. PC 側の電源ユニットのスイッチを入れる。
  3. PC の電源をいれる。

GPU パススルー設定等

パススルー設定を行って reboot したあと lspci で GPU が認識されていない場合がある。 その場合は完全に電源を切って OCulink ケーブルを一旦抜いて接続し直してから正しい手順で電源を入れ直す。


Proxmox VE その他

Cluster の追加と削除

Cluster から特定のノードを削除

  1. クラスターに残すノードの shell から pvecm delnode NODE名

切り離されたノードからクラスターの情報を削除

  1. systemctl stop pve-cluster corosync
  2. rm -r /etc/corosync/*
  3. pmxcfs -l
  4. rm -r /etc/pve/nodes/NODE
  5. rm /etc/pve/corosync.conf
  6. killall pmxcfs
  7. systemctl start pve-cluster
  8. reboot
1)
AMD CPU は intel_iommu=on 相当の設定が不要 (archlinux wiki の PIC passthrough より)
2)
intel_iommu=on は Proxmox VE 8.2 からデフォルトで有効化されている ( Proxmox VE 8.2 releasenote より)