ACS Override PatchによるIOMMUグループの分離:安価なマザーボードでGPUパススルーを実現する秘策

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

背景:深夜にハードウェアが「拒否権」を発動したとき

おなじみの光景:自宅で12台の仮想マシン(VM)を稼働させているProxmoxサーバーに、新しく購入したRTX 3060を装着したとしましょう。そこはDockerからKubernetesまで、あらゆるものをいじり倒すあなたの遊び場です。目標は明確、GPUのパワーを仮想マシンに直接割り当てる(GPUパススルー)ことで、AIの実行やクラウドゲーミングを実現することです。しかし、現実はそう簡単にはいきません。

仮想マシンの起動ボタンを押した瞬間、サーバー全体がフリーズするか、dmesgログにI/Oエラーが延々と流れ始めます。詳しく調べてみると、GPUがオンボードのネットワークカードやSATAコントローラーと同じIOMMUグループに含まれていることが判明します。GPUをVMに渡そうとすると、ネットワークカードまで道連れにしなければなりません。その結果、サーバーは接続を失い、文字通り「文鎮」と化してしまいます。

この問題は、一般向けのマザーボード(Consumer Motherboards)でよく発生します。メーカーはコスト削減のためにACS(Access Control Services)機能を省略することが多く、その結果IOMMUのグルーピングが非常に乱雑になります。ACS Override Patchは、システムにこれらのグループを強制的に分離させるための救世主です。

セットアップ:PCIeシステムの「診断」

「病状」を把握しないまま、深い介入を行うのは避けましょう。まずはスクリプトを使用して、PCIeデバイスがどのように割り当てられているかを詳しく確認する必要があります。

ステップ1:BIOSでIOMMUを有効にする

まず、BIOSでIntel VT-dまたはAMD-Viが「Enabled」になっていることを確認してください。その後、Linux上で以下のコマンドを実行して状態を確認します。

dmesg | grep -e DMAR -e IOMMU

もし “IOMMU enabled” というメッセージが表示されない場合、それ以降の努力はすべて無駄になります。すぐにBIOS設定に戻ってください。

ステップ2:スクリプトでグループ分けの状況を確認する

以下のスクリプトは、「同居」しているデバイスを詳細にリストアップします。

#!/bin/bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done

もしGPUのグループにUSBコントローラーやPCIブリッジなど、4〜5つの見慣れないデバイスが含まれている場合、間違いなくACSパッチが必要になります。

詳細設定:ACS Override Patchの適用

技術的には、このパッチはLinuxカーネルがハードウェアのセキュリティチェックをバイパスし、デバイスの分離を強制することを可能にします。ProxmoxやZen kernelなどのカスタムカーネルでは、この機能は通常あらかじめ組み込まれています。起動パラメータを介して有効にするだけです。

ステップ1:GRUB設定の編集

以下のコマンドで設定ファイルにアクセスします。

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT の行に、pcie_acs_override パラメータを追加します。主に3つのオプションがあります:

  • downstream:PCIeスイッチの後ろにあるデバイスを分離します。
  • multifunction:多機能デバイス(例:オーディオ機能内蔵のGPU)を分離します。
  • id:xxxx:yyyy:安全性を確保するため、特定のデバイスIDにのみ適用します。

私の経験上、BシリーズやZシリーズのマザーボードで問題を根本的に解決するには、以下の強力なコンボがおすすめです:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"

ヒント:Ryzen CPUを使用している場合は、intel_iommu=onamd_iommu=on に書き換えてください。

ステップ2:システムの更新

ファイルを保存し、次回の起動時に変更を反映させるために更新コマンドを実行します。

sudo update-grub
sudo update-initramfs -u

結果の確認と重要な注意点

再起動後、再びIOMMUグループをリストアップするスクリプトを実行してください。この時、あなたのGPUは独立したグループに堂々と存在しているはずです。

システムログでの確認

コマンド dmesg | grep -i acs を入力して、カーネルがコマンドを受け取ったか確認します。forced into separate group というメッセージが表示されていれば、90%成功です。

セキュリティリスク(現実的な警告)

ACS Overrideの使用は、ハードウェアのセキュリティロックを無理やりこじ開けるようなものです。エンタープライズ環境では、これにより仮想マシン間でのPeer-to-Peer DMA攻撃を招く可能性があります。しかし、ホームラボ愛好家にとっては、安価なハードウェアでGPUのパフォーマンスを最大限に引き出すための、価値のあるトレードオフと言えるでしょう。

パッチ適用後によくあるエラーとして、AER (Advanced Error Reporting) がシステムログを埋め尽くすことがあります。もしdmesgにログが絶え間なく流れる場合は、GRUBに pci=noaer パラメータを追加して抑制してください。設定の成功と、IOMMUエラーで夜更かししなくて済むようになることを願っています!

Share: