Fedora WorkstationにおけるGPUパススルー(VFIO/IOMMU)詳細設定ガイド

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Linuxで作業したいけれど、Windows専用ソフトが手放せない?

プログラマーやDevOpsエンジニアにとって、快適なターミナルやネイティブなDocker環境が利用できるLinuxは魅力的な選択肢です。しかし、Adobe Premiereでの4K動画編集やDirectXアプリのテスト、あるいはValorantやApex Legendsなどのゲームをプレイしたい場合に問題が生じます。デュアルブートでも対処できますが、作業の合間に何度も再起動するのは煩わしく、集中力も途切れてしまいます。

一般的な仮想マシン(VirtualBoxやVMware)は仮想グラフィックを使用するため、3D描画時に大きなカクつきが発生します。この課題を根本から解決するのがGPUパススルー(VFIO)です。この技術により、専用のPCIeグラフィックボードをKVM/QEMU仮想マシンに直接割り当てて管理させることができます。その効果は圧倒的で、Fedoraを再起動することなく、仮想マシン上の3DMark Time Spyベンチマークでネイティブ環境の約12,450点に対して約12,100点を記録(97%以上の性能を維持)しました。

IOMMUとVFIOの仕組みを正しく理解する

動作メカニズムを把握しておくことで、画面が真っ暗になったりIOMMUグループ関連のエラーが発生した際も迅速に対処できます。

  • IOMMU(Intel VT-d / AMD-Vi): マザーボードのハードウェア機能です。ホスト側のKernelを介さずに、仮想マシンがRAMやPCIeデバイスへ直接アクセスできるようにします。
  • IOMMUグループ: BIOSによって定義されるハードウェアの分離境界です。安定したパススルーを実現するには、対象のディスクリートGPUと付属のオーディオコントローラーが単一のグループ内に完全に収まっている必要があります。このグループ内にNVMe SSDやネットワークカードが混在していてはなりません。
  • VFIOドライバー(vfio-pci): 「プレースホルダー」として機能するカーネルドライバーです。起動時にホスト側のグラフィックドライバー(nvidia、nouveau、amdgpu)が対象のGPUを掴むのを防ぎ、QEMUが利用できるようにデバイスを確保します。

必要最小限のハードウェア構成: 2基のGPUが必要です。最も一般的なのは、Fedoraの画面出力用に1基のiGPU(Intel UHD/IrisまたはAMD Radeon内蔵グラフィックス)を使用し、メインのPCIeスロットに挿したディスクリートGPU(Nvidia/AMD)をWindows仮想マシンへ割り当てる構成です。

Fedoraでの具体的な実装手順

Fedoraは最新カーネルの導入が早く、VFIO関連のパッチも継続的に更新されるため、比較的スムーズに構築できます。以下に標準的な手順をステップ・バイ・ステップで解説します。

ステップ1: ハードウェア仮想化の有効化とカーネルパラメータの設定

BIOS/UEFI設定画面に入り、Intel VT-dまたはAMD IOMMU(SVM / AMD-Vi)を有効化します。

Fedoraを起動後、ターミナルを開き、grubbyツールを使用してカーネルパラメータを設定します。

# Intel製CPU搭載マシンの場合:
sudo grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"

# AMD製CPU搭載マシンの場合:
sudo grubby --update-kernel=ALL --args="amd_iommu=on iommu=pt"

PCを再起動し、次のコマンドを実行して有効化状態を確認します。

dmesg | grep -E -i "(iommu|dmar)"

ターミナルにDMAR: IOMMU enabledまたはAMD-Vi: Initialized IOMMUと出力されれば、システムの準備は完了です。

ステップ2: ハードウェアIDの取得とIOMMUグループの確認

次のBashスクリプトを実行して、IOMMUグループの一覧を確認します。

for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done | grep -i -E "vga|3d|audio"

テスト環境での出力例:

IOMMU Group 14 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106 [GeForce RTX 3060] [10de:2503] (rev a1)
IOMMU Group 14 01:00.1 Audio device [0403]: NVIDIA Corporation GA106 High Definition Audio Controller [10de:228e] (rev a1)

行末の角括弧内にある2つのハードウェア識別IDを控えておきます: 10de:2503(VGA)および10de:228e(GPU内蔵オーディオコントローラー)。

ステップ3: 起動時にGPUをvfio-pciドライバーへ割り当てる

取得したハードウェアIDをmodprobe設定に記述します。

sudo bash -c 'cat <<EOF > /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2503,10de:228e
EOF'

Dracutに対して、initramfsの初期段階でVFIOドライバーを強制的に読み込むよう設定します。

sudo bash -c 'cat <<EOF > /etc/dracut.conf.d/vfio.conf
force_drivers+=" vfio vfio_iommu_type1 vfio_pci "
EOF'

initramfsを再生成してPCを再起動します。

sudo dracut --regenerate-all --force
sudo reboot

vfio-pciドライバーがディスクリートGPUを正しく制御しているか確認します。

lspci -k -s 01:00.0

Kernel driver in use: vfio-pciと表示されていれば、GPUはFedoraから完全に分離されています。

ステップ4: Virt-ManagerでWindows仮想マシンを設定する

KVM/QEMU関連パッケージ一式をインストールします。

sudo dnf install -y qemu-kvm libvirt virt-manager virt-install edk2-ovmf
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $(whoami)

仮想マシンマネージャー(virt-manager)を開き、Windows 10/11の仮想マシンを作成して以下の主要項目を設定します。

  1. Overview(概要): チップセットにQ35、ファームウェアにUEFI x86_64: .../OVMF_CODE.secboot.fdを選択します。
  2. CPU: 仮想マシンでAVX2/SSE4などの命令セットをフル認識させるため、モデルをhost-passthroughに設定します。適切なトポロジーを割り当てます(例: 8コア16スレッドのホストであれば、ゲストに6コア12スレッドを割り当て)。
  3. ハードウェアの追加: PCI Host Deviceを選択し、VGAデバイス(01:00.0)と対応するAudioデバイス(01:00.1)を追加します。
  4. 仮想ディスプレイの削除: Display Spice、Video QXL/Virtio、Channel spiceを削除します。物理グラフィックボードからディスプレイへ直接映像を出力します。

ディスクリートGPUから専用モニター(または既存モニターの別入力端子)へHDMI/DisplayPortケーブルを接続します。仮想マシンを起動し、Windows内で直接Nvidia/AMDの公式ドライバーをインストールします。

おわりに

GPUパススルーで最も難しいのは、IOMMUグループの分離と起動時の適切なドライバー読み込み設定です。正しく構成できれば、Linuxでの安定した開発環境と、Windowsでのハードウェア性能をフルに活かしたグラフィック制作・ゲーム環境を両立する理想的な環境が手に入ります。

Share: