ハードウェアとPCIパススルー
Vaporでは、PCIeパススルー(VFIO)を使用して、物理ハードウェアデバイスを仮想マシンに直接割り当てることができます。
前提条件
PCIパススルーを使用するには、ホストのハードウェアがIOMMU(Intel VT-dまたはAMD-Vi)をサポートしている必要があり、ホストのBIOSおよびカーネルパラメーターで有効になっている必要があります。
PCIデバイスの割り当て
- VMの電源がオフになっていることを確認します。
- VMの Hardware タブに移動します。
- Add PCI Device をクリックします。
- Vaporは、ホスト上の利用可能なすべてのPCIデバイス(GPU、ネットワークカード、NVMeコントローラーなど)を一覧表示します。
- デバイスを選択して保存します。
WARNING
PCIデバイスをVMに割り当てると、そのデバイスはホストOSから削除されます。VaporのWebコンソールへのアクセスに使用しているネットワークカードは割り当てないでください。接続が失われます!
ホットプラグ
Vaporは、VMの電源を落とすことなく、特定の仮想ハードウェアコンポーネントのホットプラグをサポートしています:
- ディスク (Disks): 実行中のVMに新しい仮想ディスクをアタッチできます。
- ネットワークインターフェース (Network Interfaces): 仮想ネットワークインターフェースを追加または削除できます。
(注:CPUとメモリのホットプラグには、特定のゲストOSのサポートが必要であり、すべてのOSバリアントで利用できるとは限りません)。
NVIDIA vGPU(仲介デバイス / Mediated Devices)
PCIパススルーは1つのGPU全体を1つのVMに割り当てます。NVIDIA vGPU は、1つのエンタープライズGPUを複数の仮想GPUに分割(スライス)し、複数のVMが同時に共有できるようにします。たとえば、16 GBのTesla T4の2 GBスライスを8つのVMがそれぞれ受け取ることができます。
各スライスは 仲介デバイス (mediated device / mdev) です。これは、フレームバッファサイズ、ディスプレイヘッド、最大解像度を固定する プロファイル からホスト上に作成されるインスタンスです。
パススルーかvGPUか?
| PCIパススルー | vGPU | |
|---|---|---|
| GPUあたりのVM数 | 1 | 多数 |
| GPUモデル | 任意 | NVIDIA vGPU対応のみ |
| 追加ライセンス | なし | NVIDIA vGPUソフトウェアが必要 |
| ホストドライバー | なし(デバイスはホストから隠蔽) | NVIDIA vGPU Manager |
| ゲストドライバー | 標準NVIDIAドライバー | NVIDIA vGPU (GRID) ゲストドライバー |
IMPORTANT
GPUは両方を同時に行うことはできません。カードがパススルーデバイスとしてVMに割り当てられている間は vfio-pci にバインドされ、vGPUを提供することはできません。逆も同様です。
A. 要件
- vGPU対応のNVIDIA GPU — Tesla T4、V100、A100、H100、L40、RTX 6000 Ada、および同様のデータセンターカード。コンシューマー向けのGeForceカードはvGPUをサポートしていません。
- NVIDIA vGPUソフトウェアライセンスおよびエンタイトルメント(NVIDIA Licensing Portalへのアクセス権が付与されます)。
- PCIパススルーと同様に、ホスト上で IOMMUが有効 であること(Intel VT-dまたはAMD-Vi)。
- ドライバーは実行中のカーネル向けにコンパイルされるため、ホストの カーネルヘッダーおよびビルドツール。
TIP
Ampere以降のアーキテクチャに基づくGPUでは、vGPUプロファイルが表示される前にホスト上でSR-IOV仮想機能を有効にする必要があります(/usr/lib/nvidia/sriov-manage -e <pci_address>)。また、インスタンスは物理カードではなく仮想機能に対して作成されます。Tesla T4などの古いカードではこのステップは不要です。
B. ドライバーの取得
VaporはNVIDIAのドライバーを同梱したり、代わりにダウンロードしたりすることは できません。ドライバーはライセンスソフトウェアであり、NVIDIAのポータルには自身のアカウントが必要となるため、ご自身のエンタイトルメントの下でダウンロードし、Vaporにアップロードします。
- エンタープライズアカウントでNVIDIA Licensing Portalにサインインします。
- Linux KVM用の NVIDIA vGPU software パッケージをダウンロードします。これは、ホストドライバーとゲストドライバーの両方を含む単一のアーカイブです。
- アーカイブを展開します。次の2つのファイルが必要です:
- ホストドライバー:
NVIDIA-Linux-x86_64-<version>-vgpu-kvm.run— Vaporホストにインストールします。 - ゲストドライバー:
Guest_Driversフォルダー内 — 各VMの 内部 にインストールします。
- ホストドライバー:
WARNING
ホストドライバーとゲストドライバーは 同じリリースブランチ のものである必要があります。たとえば、550.144.02 のホストドライバーは 550.144.03 のゲストドライバーとペアリングします。ブランチの混在(例:550.x ホストに対して 570.x ゲストドライバーを使用)はサポートされておらず、失敗します。NVIDIAのアーカイブにはほぼ同じファイル名のバージョンが複数含まれているため、アップロード前にバージョンを確認してください。
C. ホストへのドライバーのアップロード
- Third-Party Libraries に移動します。
- NVIDIA vGPU Manager タイルを見つけます。
*-vgpu-kvm.runホストドライバーを選択し、Upload をクリックします。
アップロードは中断再開が可能(resumable)なため、接続が切断されても転送を最初からやり直すことなく中断したところから再開できます。
D. ホストの準備状態の確認
NVIDIA vGPU Manager タイルには、すべての前提条件と現在の状態が一覧表示されます。それぞれが独立してチェックされるため、どれが妨げになっているかを正確に確認できます:
| チェック項目 | 意味 |
|---|---|
| NVIDIA GPU present | PCIバス上にvGPU対応カードが見つかりました。 |
| IOMMU enabled | ホストが intel_iommu=on または amd_iommu=on で起動しました。 |
| GPU free for the vGPU driver | カードが vfio-pci にバインドされていません。バインドされている場合、チェックにはパススルーしているVMの名前が表示されます。 |
| Kernel headers for the running kernel | 起動中 のカーネルと一致するヘッダーがインストールされています。 |
| Build toolchain | gcc、make、dkms が利用可能です。 |
| Secure Boot | Secure Bootが署名されていないモジュールをブロックしていません。 |
| nouveau not holding the GPU | オープンソースの nouveau ドライバーがロードされていません。 |
| vGPU Manager package uploaded | ホストドライバーパッケージがホスト上に保存されています。 |
| vGPU driver active | ドライバーがロードされ、GPUがプロファイルを広報しています。 |
インストール前に不足していると報告された項目を解決してください。特に以下の2点に注意してください:
- カーネルヘッダー: 一般的な
linux-headers-amd64メタパッケージ(現在起動中のカーネルよりも新しいカーネルを追跡している可能性があります)ではなく、実行中のカーネルに一致するパッケージlinux-headers-$(uname -r)をインストールしてください。ドライバーは実行中のカーネルに対してビルドされるため、異なっていると失敗します。 - GPUがまだ使用中: カードがVMにパススルーされている場合は、そのVMを停止してカードを解放します:bash
virsh nodedev-reattach pci_0000_81_00_0
E. ホストドライバーのインストール
- NVIDIA vGPU Manager タイルで、Guided install を見つけます。
- Install driver をクリックし、確認します。
インストール処理によりカーネルモジュールがビルド・ロードされ、nvidia-vgpud および nvidia-vgpu-mgr サービスが開始され、vGPUプロファイルが表示されたことが確認されます。進行状況は実行中に表示され、通常1〜2分で完了します。失敗した場合は Show log を展開してください。ビルド出力に理由が記載されています。
CAUTION
インストールすると、実行中のNVIDIAカーネルモジュールが置き換えられます。ドライバーをアンロードすると実行中のVMからGPUが取得されてしまうため、VaporはvGPUインスタンスがアクティブな間の開始を拒否します。まずそれらのVMを停止し、vGPUインスタンスを削除してください。
成功すると、"vGPU Manager installed — 1 GPU(s) offering 14 profiles" のようなメッセージが表示され、vGPU driver active のチェックが緑色に変わります。通常、再起動は必要ありません。再起動が必要な場合、Vaporは明確にその旨を表示します。
F. VMへのvGPUの追加
vGPUは、新規マシンと既存のマシンの両方でVMウィザードにて設定します。
- 新しいVMを作成するか、電源がオフ になっている既存のVMを編集します。
- Step 4 — Hardware に進み、Advanced Configuration を開きます。
- NVIDIA vGPU (Mediated Device) の下で、+ Add vGPU (Mediated Device) をクリックします。
- プロファイル を選択します。ピッカーは名前、プロファイルID、VRAMサイズ、またはGPUで検索でき、それぞれの残りのスライス数が表示されます。容量が残っていないプロファイルは選択できません。
- Existing mdev Device UUID は空のままにします。Vaporがインスタンスを作成し、VMが削除されたときに破棄します。ご自身で作成したインスタンスをアタッチする場合のみ入力してください。
- Guest PCI Address はオプションです。ゲスト内の特定のスロットにデバイスを固定する必要がない限り、空欄のままにしてください。
- 保存してウィザードを終了します。
IMPORTANT
vGPUの追加または削除は、VMの 電源がオフ の状態でのみ行えます。NVIDIA vGPUはホットプラグもホットアンプラグもサポートしていないため、実行中のVMではこれらのコントロールが無効になります。実行中のVMに対してAPI経由で行われた変更は保存された設定に書き込まれ、次回の再起動時に有効になります。
プロファイルの命名規則
プロファイルは GRID <カード>-<サイズ><シリーズ> のパターンに従います。例:GRID T4-2Q:
- Q — Virtual Workstation。プロフェッショナル向けグラフィックスおよびCUDA。コンピューティングのための一般的な選択肢。
- C — Compute Server。コンピューティング専用、ディスプレイ出力なし。
- B — Virtual PC. オフィスおよびブラウザワークロード、CUDAなし。
- A — Virtual Application。アプリケーションストリーミング。
数字はギガバイト単位のフレームバッファサイズです。したがって T4-2Q は2 GBのワークステーションプロファイルであり、16 GBのT4はこれを8つホストできます。
G. ゲストドライバーのインストール
VMが起動すると、すぐにvGPUがPCIデバイスとして認識されますが、VMの内部 にゲストドライバーがインストールされるまでは休止状態のままです。これはVM自体の管理者によって行われる一般的なゲスト内ソフトウェアのインストールであり、Vaporは関与しません。
開始する前に、ゲストがデバイスを認識していることを確認します:
lspci -nn | grep -i nvidia
# 05:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8]何も表示されない場合、vGPUはアタッチされていません。セクションFに戻ってください。
TIP
ゴールデンイメージまたはテンプレートにドライバーを一度インストールし、そこからVMをクローン作成します。ドライバーはクローン作成後も維持されるため、このセクション全体の作業はVMごとではなくイメージごとに1回で済みます。
G.1 インストーラーのVMへの取り込み
環境に適した方法を使用してください:
- ネットワーク経由(VMに接続性とSSHがある場合):bash
scp NVIDIA-Linux-x86_64-<version>-grid.run user@<vm-ip>:~/ - ホストからHTTP経由(インバウンドSSHがないlibvirt NATネットワーク上のVMに便利)。ホスト上でゲストドライバーを保持するディレクトリを公開します:bash次にVM内部で(
cd /path/to/Guest_Drivers && python3 -m http.server 8000 --bind 192.168.122.1192.168.122.1はlibvirtゲートウェイ):bash終了したらサーバーを停止します。curl -O http://192.168.122.1:8000/NVIDIA-Linux-x86_64-<version>-grid.run - 仮想CD-ROMとして(VMにネットワークがない場合):ドライバーを含むISOをビルドし、ISO Images の下にアップロードしてVMにアタッチします。
G.2 DebianおよびUbuntu
# 前提条件。実行中のカーネルに一致するヘッダーを使用してください。一般的な
# linux-headers-amd64 メタパッケージは起動中のカーネルよりも新しいカーネルを追跡している可能性があり、
# ドライバーは実行中のカーネルに対してビルドされます。
sudo apt-get update
sudo apt-get install -y dkms build-essential "linux-headers-$(uname -r)"
# ドライバーのインストール
sudo dpkg -i nvidia-linux-grid-<branch>_<version>_amd64.deb
sudo rebootWARNING
Debianでは、NVIDIAの .deb が linux-headers というパッケージへの依存関係を宣言していますが、これはDebianのアーカイブには存在しません。実際のパッケージは linux-headers-amd64 および linux-headers-<version> であり、どちらもその名前を 提供 (provides) していません。これはNVIDIAのパッケージングにおけるUbuntu独自の仕様であり、インストール途中で dpkg が停止します。
パッケージデータベースの整合性を損なう dpkg の強制実行ではなく、equivs シムを使用してクリーンに解決します:
sudo apt-get install -y equivs
cat > linux-headers-shim <<EOF
Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: linux-headers
Version: $(uname -r)
Provides: linux-headers
Depends: linux-headers-$(uname -r)
Description: Satisfies the NVIDIA guest driver's bare linux-headers dependency
EOF
equivs-build linux-headers-shim
sudo dpkg -i linux-headers_*.deb
# これでドライバーが正常にインストールされます
sudo dpkg -i nvidia-linux-grid-<branch>_<version>_amd64.deb
sudo rebootまたは、G.4で説明する .run インストーラーを使用して、パッケージングの問題を完全に回避します。
G.3 RHEL、Rocky、およびAlmaLinux
sudo dnf install -y dkms gcc make "kernel-devel-$(uname -r)" "kernel-headers-$(uname -r)"
sudo rpm -ivh nvidia-linux-grid-<branch>-<version>.x86_64.rpm
sudo rebootG.4 任意のLinuxディストリビューション(.run インストーラー)
.run インストーラーはどこでも動作し、ディストリビューションのパッケージングの癖を回避できますが、パッケージマネージャーを通じて自動更新されることはありません。
sudo sh NVIDIA-Linux-x86_64-<version>-grid.run --dkms
sudo reboot--dkms はモジュールをDKMSに登録するため、ゲストカーネルが更新されたときに自動的に再ビルドされます。これがないと、次のカーネルアップグレード後にドライバーがロードされなくなります。
インストーラーが nouveau との競合を報告した場合は、ブラックリストを書き込ませてから再起動し、再度実行してください。
G.5 Windows
- ゲストドライバーの
.exeをVMにコピーします。 - 実行してデフォルト設定を受け入れます。
- 再起動します。
- デバイスマネージャーの Display adapters の下にアダプターが表示されることを確認します。
G.6 確認
ゲストの内部で:
nvidia-smi選択したプロファイル名とフレームバッファサイズが報告されるはずです。例:
| GPU Name Persistence-M | Bus-Id Disp.A |
| 0 GRID T4-2Q On | 00000000:05:00.0 Off |
| | 1MiB / 2048MiB |ゲストがパススルーカードではなく、純正のvGPUを使用していることを確認するには:
nvidia-smi -q | grep -A2 "GPU Virtualization Mode"
# Virtualization Mode : VGPUホスト上でも、同じセッションが反対側から確認できるはずです。これにより、ホストドライバーとゲストドライバーが相互に通信していることも確認されます:
nvidia-smi vgpu
# 0 Tesla T4 | 00000000:81:00.0 | 0%
# 3251634273 GRID T4-2Q | 0c6a... my-vm | 0%G.7 ライセンスの設定
ライセンスサーバーがない場合でもドライバーはロードされ、nvidia-smi は Unlicensed と報告して動作します。ゲスト内の /etc/nvidia/gridd.conf (またはWindowsのNVIDIAコントロールパネル経由)でDelegated License Service (DLS) または Cloud License Service (CLS) のアドレスを設定して、完全なライセンスを取得してください。
H. ホスト上のvGPUデバイスの管理
Virtualization → vGPU Devices には、VMから独立して、ホスト上のすべての仲介デバイスが表示されます。
- Capacity(容量):プロファイルごと。容量が枯渇したプロファイルは暗く表示されます。
- Assigned To(割り当て先):各インスタンスを保持するVM、または Unassigned(未割り当て)バッジ。
- Create(作成):新しいインスタンスを事前に作成します。
- Remove(削除):インスタンスを削除して、その容量をGPUに戻します。
TIP
VMからvGPUを削除しても、基になるインスタンスが常に破棄されるわけではありません。VaporがVM用に作成したインスタンスはVMとともに破棄されますが、ご自身で作成したインスタンスは解放されるだけです。未割り当てのインスタンスもGPUの容量を消費するため、空きスライスが見当たらない場合はこのページを確認してください。
I. トラブルシューティング
ウィザードにvGPUプロファイルが表示されない。 NVIDIA vGPU Manager タイルを確認してください。最も一般的な原因は、vGPU Managerホストドライバーがインストールされていないことです。標準のNVIDIAデータセンタードライバーおよびオープンソースの nouveau ドライバーはvGPUを提供せず、vgpu-kvm パッケージのみがプロファイルツリーを作成します。
「No capacity left for profile … available_instances is 0」。 SR-IOVのないGPU(Tesla T4を含む)では、インスタンスが存在する間、カードは単一のフレームバッファサイズにロックされます。2 GBのインスタンスが実行されている場合、他の2 GBのプロファイルのみ作成できます。サイズを切り替えるには、vGPU Devices の下に表示される未割り当てのインスタンスを含め、そのGPU上の すべての 既存のインスタンスを最初に削除してください。
ホストの再起動後にVMが起動しない。 Vaporはインスタンスを永続的に作成するため、ブート時に自動的に再作成されます。Vaporの外部で作成されたインスタンス(例えば直接の sysfs 書き込みなど)は一時的な(transient)ものであり、再起動時に消失してVMが存在しないデバイスを参照したままになります。以下で確認してください:
mdevctl list -dauto とマークされたインスタンスはブート時に再作成されます。
VM内部で nvidia-smi が見つからない。 ゲストドライバーがインストールされていません。セクションGを参照してください。
ゲストドライバーはインストールされたが nvidia-smi がエラーを報告する。 ホストドライバーとゲストドライバーのブランチが一致していない可能性があります。ホスト上の nvidia-smi とゲストドライバーのバージョンを比較してください。同じブランチのものである必要があります。