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つです。
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では動かないので注意(一度やらかしました)