読者です 読者をやめる 読者になる 読者になる

TECHLOGICS

HYLOGICS分室。作業メモやガジェットのレビューなど、主に技術系のエントリを取り扱います。

CentOS 7におけるGPU Passthroughについてざっくりとしたまとめ

Linux

長いこと放置していたGTX970絡みの作業が一段落したので書く。

最初に

ホストのPCIeに刺したグラフィックカードをゲストOSに割り当てて利用する。

ここではHWについては深く触れないが、前提としてIOMMU(Intel VT-dもしくはAMD I/O)に対応したCPUとM/B、動作実績のあるVGAを揃えること。GTX900シリーズはWeb上で確認した限り一通り動作するようだが最近出てきたGTX10シリーズやRX480などはまだ同じように動作するかは判らない。

SW側で押さえておく必要があるのはkernel(KVM), QEMU, libvirtの3つ。また、GUIクライアントとしてvirt-managerがある。

kernel(KVM)

GPUパススルーするためにはkernelでvfio-pciと恐らくvfio-vgaを有効にすることが必要(pci-stubでも代用出来るらしい)で、この二つはkernel 3.9から利用出来るようになっている。ただ、CentOS 7の標準パッケージではvfio-vgaCONFIG_VFIO_PCI_VGA)は無効となっているためvfio-vgaを有効にするためにはkernelを自前でビルドする必要がある。

【 2016/07/25 追記 】

vfio-vgaを有効にしなくてもパススルーには成功する。CentOS 7の標準カーネル( 3.10.0-327.22.2.el7.x86_64 )でVGAパススルーしてGTA Vの動作に問題ないことを確認済み。

【追記ここまで】

kernel 4.4およびQEMU 2.5でvirtual GPUによる3Dサポートが追加されたのでkernelを更新するなら4.4以上にしておくとよいかもしれない。

The Linux Kernel Archives

QEMU

古いVGAであれば問題なく使えても、比較的新しいVGAだとゲストOS上でエラーを吐いたりする。手元で確認したのはGTX970だけなのだが、NVIDIAの最近のVGAで発生する特に面倒くさい問題としてゲストOSのドライバで発生するコード43問題がある。

NVIDIA: Code 43 Driver detects KVM hypervisor, fails to initialize* Nvidia - "Accidental" breakage, won't fix, unsupported We can't solve it, but we can work around it Hide the hypervisor

http://www.linux-kvm.org/images/b/b3/01x09b-VFIOandYou-small.pdf

上記の資料にもある通り"KVMハイパーバイザを検知すると初期化に失敗する"というクソ仕様で、回避策はゲストPCのオプションでkvmをhiddenにするというものだが、これはQEMU 2.1以降が必要となる。

CentOS 7のQEMUは1.5.3と古いためこれもビルドが必要。ただビルドするだけなら簡単だがconfigureのオプション次第で作業量が増える。

余談だが、最近2.5から2.6.50にVerUPしてみたところブロックデバイスの取り扱いに変更があったようなので2.5にロールバックした。

QEMU

libvirt

実はQEMU/KVMでゲストを動かすだけならlibvirtは不要で、コンソールからqemuバイナリを直接叩いてゲスト起動すればOK(私自身つい先日までこの形で運用していた)だが、特にHW周りの管理が非常に面倒なのでlibvirt上でゲストを管理が出来るようにしておくとよい。

古いバージョンだと新しいQEMUの機能に対応していなかったりするので適宜更新すること。関連パッケージの数が多いのでつい腰が引けるが、まとめてビルド出来るのでやってみると実はそこまで面倒でもない。

libvirt: The virtualization API

virt-manager

virshlibvirt-clientに含まれている)があれば大抵なんとかなるものの、GUIで設定できると楽なのでぜひ使いたい。これも適宜更新すること。取り扱いは一番楽。

Virtual Machine Manager Home

その他(OVMF)

OVMFはUEFIエミュレータなのでなくても動作には問題ないはず。ただ、HDDをゲストに直接割り当てた上でOVMFを導入しておくとホスト起動時にHDDから直接ブートすることが可能になるので便利といえば便利かもしれない。

OVMF - KVM

まとめ

やっておくべきこと

  • kernelをリビルドする(CONFIG_VFIO_PCI_VGAの有効化)
  • IOMMUの有効化
  • VFIO-PCIの有効化 および VGAのVFIO-PCIへの割り当て
  • QEMUのVerUP( over 2.1 )

やっておくとよいこと