えぬえす工房
  • Search results
avatar えぬえす工房
2016/12/09

仮想マシンゲストでIntel QSV(2016年版)

はじめに

この記事はDTV Advent Calendar 2016の9日目の記事です。

仮想マシン上でIntel Quick Sync Video(QSV)が使えたらTSのエンコが捗ると思いませんか?

ここでは、物理マシン上で普通に使う分には簡単だけど仮想マシン上で使うと難易度が非常に(?)高くなるIntel QSVについて書きます。

実は昔よりも楽になっている

昔からこの手の話はありますが、大抵Xenを使えって書いてあることが多くKVM+QEMUで実現できた例は多くなかったと思います。

要はIntel HD GraphicsをIntel VT-dで仮想マシンにパススルーできれば勝ちなのですが、ただでさえ難しいVGAパススルーに加え、 対象が内蔵グラフィックスであることも難易度を上げている要因になっています。 通常のVGAパススルーの方法で成功することもあったようですが、環境に大きく左右されるようです。

しかし、現在では新しめのLinuxカーネルとQEMUを使うことで、比較的容易にIntel HD Graphicsを仮想マシンにパススルーし、Intel QSVを利用することができるようになっています。

必要な環境

  • Linuxカーネル 4.6以降
  • QEMU 2.7以降
  • KVM
  • Intel VT-dを利用できる環境

この記事を書いている時点で最新のArch Linuxのパッケージで動作を確認しています。

Intel HD Graphicsをパススルーする

QEMU 2.7以降に搭載された、Intel HD Graphicsのパススルーを支援する機能は、igd-assignなどと呼ばれているようです。

情報源のページは以下の2つです。

QEMUのドキュメント(igd-assign.txt)

Intel Graphics assignment - VFIO tips and tricks

Intel HD Graphicsをパススルー可能な状態にする

まず通常のPCIパススルーのときのように、PCIバスの00:02:00に割り当てられているIntel HD Graphicsをvfio-pciドライバでパススルー可能な状態にします。 ここでは、/etc/modprobe.d/igd.confに以下の内容を記述することで行いました。

blacklist i915
options vfio-pci ids=8086:0412

8086:0412はHaswell世代のIntel HD Graphicsを表すVIDとPIDです。他のIntel HD Graphicsの場合異なるPIDなので注意してください。

さらに、/etc/default/grubなどを編集してカーネルオプションに以下のものを追加します。 これはLinuxカーネルがIntel HD Graphicsを画面表示のために握ってしまうことを防ぐためのオプションです。

video=vesafb:off

QEMUでパススルーして起動

QEMUの起動時に、必要なコマンドラインオプションを渡します。

$ qemu-system-x86_64 -M pc,igd-passthru=on,accel=kvm -cpu Haswell -display none -device vfio-pci,host=00:02.0,id=hostdev1,bus=pci.0,addr=0x2 〜

-Mオプションのigd-passthru=onでパススルーに必要な環境を用意してくれます。 -deviceオプションでホストのPCIバスの00:02:00をゲストのPCIバスの00:02:00へパススルーします。 -displayオプションはパススルーしたIntel HD Graphicsと元々の仮想VGAが競合するのを防ぐためです。

手元の環境ではOVMFを使用してUEFIブートをしていますが、おそらく通常のSeaBIOSでも成功すると思います。 また、q35では起動に失敗したためここではpc(=i440fx)を使用しています。

起動後の話

正常に起動すると、ゲストOSの画面がパススルーしたIntel HD Graphicsを通して出力されると思います。 これ以降は、通常の物理マシンのときと同じようにIntel Media Server Studioを導入すれば環境の構築は完了です。

Haswell向けのIntel Media Server Studioは2016です。2017では動かないので注意(一度やらかしました)

Author

avatar
NV

気づいたら組み込みセキュリティをやっているエンジニア

Comments