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の仮想マシンを作成して以下の主要項目を設定します。
- Overview(概要): チップセットに
Q35、ファームウェアにUEFI x86_64: .../OVMF_CODE.secboot.fdを選択します。 - CPU: 仮想マシンでAVX2/SSE4などの命令セットをフル認識させるため、モデルを
host-passthroughに設定します。適切なトポロジーを割り当てます(例: 8コア16スレッドのホストであれば、ゲストに6コア12スレッドを割り当て)。 - ハードウェアの追加: PCI Host Deviceを選択し、VGAデバイス(01:00.0)と対応するAudioデバイス(01:00.1)を追加します。
- 仮想ディスプレイの削除: Display Spice、Video QXL/Virtio、Channel spiceを削除します。物理グラフィックボードからディスプレイへ直接映像を出力します。
ディスクリートGPUから専用モニター(または既存モニターの別入力端子)へHDMI/DisplayPortケーブルを接続します。仮想マシンを起動し、Windows内で直接Nvidia/AMDの公式ドライバーをインストールします。
おわりに
GPUパススルーで最も難しいのは、IOMMUグループの分離と起動時の適切なドライバー読み込み設定です。正しく構成できれば、Linuxでの安定した開発環境と、Windowsでのハードウェア性能をフルに活かしたグラフィック制作・ゲーム環境を両立する理想的な環境が手に入ります。

