背景
今回のブログ記事ではProxmoxVEにおけるGPUパススルー設定についてご紹介します。
Proxmox VEは、GPUリソースを仮想マシンに割り当てるパススルー機能をサポートしています。
この機能を活用することでProxmoxVEを用いた仮想環境基盤の活用の幅が広がります。
本記事がHCI環境の構築をご検討の方のお役に立てば幸いです。
検証環境
項目 | 内容 |
仮想環境 | ProxmoxVE8.2.4 |
パススルーのソースデバイス | NVIDIA T400 |
パススルーのターゲット 仮想マシン | Ubuntu 24.04 LTS |
手順
ステップ1 IOMMUI (Input/Output Memory Management Unit)の有効化
IOMMU(Input-Output Memory Management Unit)は、コンピュータの入出力デバイスが物理メモリに直接アクセスする際にアドレス変換を行い、メモリの保護と効率的な資源管理を実現するハードウェアコンポーネントです。
まずはBIOS設定でIOMMUを有効にします。またProxmoVEのカーネルオプションでもIOMMUを有効に設定します。
具体的な方法ですが、IOMMUの実装名はCPUメーカやマザーボードメーカによって異なっています。そのため実際の作業の際に構成に合わせて設定方法を確認する必要があります。
一例となりますが当社で検証したIntel Xeon Scalable Processor とSupermicro製のマザーボードが搭載されており、その構成ではBIOS項目は以下の通りでした。
BIOS - Advanced Chipset Configuration - North Bridge - IIO Configuration - Intel VT for Directed I/O (VT-d) - Intel VT for Directed I/O (VT-d) [Enable]
IOMMUという項目名のほかにIntel VT-dやAMD-Viという項目名となっている場合がございます。
またProxmoxVEのカーネルオプション設定に関してもIOMMUを有効化する必要がありますが、ハードウェア構成や採用されているブートトローダ(GRUB か systemd-boot)によって設定方法が異なります。
ステップ2 vfio(Virtual Function I/O)モジュールの設定
VFIO モジュールは、ユーザー空間へ直接デバイス アクセスを公開するための IOMMU/デバイス非依存フレームワークです。
https://docs.kernel.org/driver-api/vfio.html
ProxmoxVEでvfioモジュールを有効にするにはWebUI上で操作します。GPUが搭載されているノードのコンソールからシェルを開いて下記のコマンドを実行してください。
# 搭載されているGPUデバイスを確認します。
root@pve00:~# lspci -nn | grep -ie nvidia
c7:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GL [T400 4GB] [10de:1ff2] (rev a1)
c7:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)
コマンド実行結果から、下記のようにデバイスのバスIDとベンダーIDとデバイスIDを確認します。
デバイス | バスID | ベンダーID:デバイスID |
---|---|---|
VGA compatible controller | c7:00.0 | 10de:1ff2 |
Audio device | c7:00.1 | 10de:10fa |
vfio.confというファイルを新規作成します。vfio-pciは、PCIデバイスを仮想マシンにパススルーするために必要なモジュールの設定です。
root@pve00:~# vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1ff2,10de:10fa disable_vga=1
#ids=10de:1ff2,10de:10faは、PCIデバイスのベンダーIDとデバイスIDを指定しており、ここではNVIDIAのデバイス(ベンダーIDが10de)で、デバイスIDが1ff2と10faのものを指しています。これにより、これらのデバイスがvfio-pciドライバによって管理されるようになります。
#disable_vga=1は、VGA互換のデバイスを無効にするオプションです。これは、通常、GPUのパススルーを行う際に重要で、VGA機能を無効にすることでデバイスの競合を避ける目的があります。
ProxmoxVE起動時に下記のモジュールを自動的に読み込むように設定ファイルを記述します
root@pve0:~# vi /etc/modules
#以下4行を追加記載
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
ステップ3 GPUドライバモジュールをブラックリストに登録
ブラックリストは、特定のカーネルモジュールの自動ロードを防ぐために使用される設定で、これにより不要なドライバや問題を引き起こすモジュールの読み込みを抑制できます。https://wiki.debian.org/KernelModuleBlacklisting
ブラックリストを有効にするにはProxmoxVEのWebUI上で操作します。ホスト(ProxmoxVE)上で指定デバイスのドライバーが読み込まれないようにブラックリストファイルを新規に作成します。root@pve00:~# vi /etc/modprobe.d/blacklist.conf
blacklist nvidia
blacklist nvidiafb
blacklist nouveau
これらのドライバモジュールをロードさせない事でホスト(ProxmoxVE)がGPUデバイスに干渉せず、PCIeデバイスを仮想マシンにパススルーが可能となります。
ステップ4 再起動
これまで行ったブートローダのオプション変更、vfioモジュールのロード、nvidia関連のモジュールのブラックリスト追加の設定を行ったノードは再起動が必要です。
パススルー設定はクラスタの構築前に設定する事が多いと思いますが、もしクラスタ構築済の設定後のノードに対して再起動を行う場合は適切な手順で慎重に行ってください。(クラスタがデグレードする可能性があります。)
ステップ5 PCIeデバイスのマッピング
権限を持ったユーザでProxmoxの管理WebUIにてデータセンター→リソースマッピング→PCIeデバイス追加と選択します。
マッピングの識別のための名前を入力し、ノード上のマッピングにはデバイスが搭載されているノードを選択します。ステップ2で確認したバスIDを持つデバイスにチェックを入れ作成を押します。
PCIeデバイスが追加されたことを確認します。
ステップ6 仮想マシンにPCIeデバイスの割り当て
PCIeデバイスを割り当てたい仮想マシンを選択してカラムからハードウェア→追加→PCIデバイスと選択します。今回の検証ではVMID131(vmGPU-test)という仮想マシンに割り当てを行います。
Mappedデバイスに先ほどステップ5で追加したT400という項目が表示されます。T400を選択し追加ボタンを押します。
VMID131(vmGPU-test)のハードウェア構成にPCIデバイスが追加されたことを確認します。
注意:仮想マシンのハードウェア構成のマシンはpc-q35と設定します。Q35 チップセットは仮想 PCIe バスも提供するため、PCIe ハードウェアをパススルーする場合に適しています。
ステップ7 仮想マシン上でGPUデバイスの認識確認
VMID131(vmGPU-test)のUbuntu24.04を起動してターミナルにてlspciを実行します。仮想マシンにNVIDIAデバイスが認識されているか確認します。
NVIDIAドライバをインストールしてnvidia-smiも実行してみました。
上記の実行結果の通りNVIDIA T400デバイスが仮想マシンに認識されています。
検証の中では仮想マシン数に対してパススルーGPUデバイスが1基でしたが、技術的には仮想マシン数が1台に対して、複数の物理GPUデバイスの割り当てることが可能です。
まとめ
今回はProxxmoxVEにおけるGPUパススルーの方法をご紹介しました。
GPUパススルーによって仮想基盤上でGPUリソースを効率的に活用する一助となれば幸いです。
当社では仮想化基盤 (HCI) 構築サービスを開始いたしました。
ぜひお気軽にお問い合わせください。