構築中のホストはGPUサーバとして使う予定なんだけど、自宅用のサーバで専用ホストなんて立てる余裕はないから、今までCentOSが担ってきた録画サーバとしての機能も移植する予定。録画サーバで問題になるのがハードウェアエンコード。特にQSVエンコードの設定が一番厄介。GPUサーバなんで当然ビデオカードは刺すつもりだから、QSVエンコードでなくてNVENCを使うという手もある。はっきり言ってNVENCの方が設定そのものは楽だし、最新のIntel Media Server Studio 2017 R3でもGeneric Installの対象はubuntu 14.04のままだし。
今回は今までの省スペースPCと違って大きい筐体を選択して電源ユニットやマザーボードも個別に購入しての完全自作。あんまり言いたくないけど20年振りくらいな気がする。そして当然CPUも最新のものを買ったんだけど、これが最初のハマり。そう、最新のCPUは第7世代のKaby Lake。これがIntel Media Server Studio 2017 R3ではサポート対象外。前にceleron買って対象外だったときの二の舞。LinuxでQSVやるときはとにかくSkylakeのi3買っておこう。。。
日本語のページはないんだけど、USやChinaでubuntu 16.04のQSVを成功させたという手順があり、それらを参考に作業を進めてみる。MediaServerStudioEssentials2017R3.tar.gzをダウンロードして/usr/local/srcに配置したと家庭。まずはlibdrmやlibva関連のファイルを削除。次にQSVに必要なパッケージをインストール。そして、libdrmとlibvaをmake install。その後、install_media.shでドライバ等をインストール。ここで一旦rebootして動作確認。vainfoを実行して、正常に結果が返って来れば成功だ。
find /usr -name "libdrm*" | xargs rm -rf
find /usr -name "libva*" | xargs rm -rf
rm -rf /opt/intel/mediasdk
rm -rf /opt/intel/common
rm -rf /opt/intel/opencl
apt install gcc pkg-config libpthread-stubs0-dev libpciaccess-dev bc libssl-dev
cd /usr/local/src
tar xf MediaServerStudioEssentials2017R3.tar.gz
cd MediaServerStudioEssentials2017R3
tar xf SDK2017Production16.5.2.tar.gz
cd /usr/local/src/MediaServerStudioEssentials2017R3/SDK2017Production16.5.2/Generic
cd opt/intel/mediasdk/opensource/libdrm/2.4.67-64009
tar xf libdrm-2.4.67.tar.bz2
cd libdrm-2.4.67
./configure
make
make install
cd /usr/local/src/MediaServerStudioEssentials2017R3/SDK2017Production16.5.2/Generic/opt/intel/mediasdk/opensource/libva/1.67.0.pre1-64009
tar xf libva-1.67.0.pre1.tar.bz2
cd libva-1.67.0.pre1
./configure
make
make install
cd ~/work/MediaServerStudioEssentials2017R3/SDK2017Production16.5.2/Generic
./install_media.sh
reboot
vainfo
これでvainfoまではうまくいった。何となくinstall_media.shの動作がうまくいっていないような気もするんだけど。。。続いて、最難関のkernelリビルド。debパッケージをビルドする形でQSV対応のkernelを作ろうと思ったんだけど、ubuntu側にもpatchがあり、それがMSSのpatchともろにバッティング。がんばって手動でマージしてビルドしてみたんだけど、結局動かなかったのでお蔵入り。おとなしく単純にlinux-4.4にMSSのpatchを当ててmake installする。これだとubuntu側のpatchが無条件に上書きされる訳で、やはり心配なんだけどね。
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.tar.xz
tar xf linux-4.4.tar.xz
tar xf /opt/intel/mediasdk/opensource/patches/kmd/4.4/intel-kernel-patches.tar.bz2
cd linux-4.4
for i in ../intel-kernel-patches/*.patch; do patch -p1 < $i; done
make olddefconfig
make
time make modules_install
time make install
reboot
これでkernelの準備もできたので、ドキドキしながらMSSのサンプルを実行してみる。今までの経験だと、vainfoが通っていればサンプルも大抵は実行できる。サポート対象外のCPUを使ったりしていない限り。。。
cd /usr/local/src/MediaServerStudioEssentials2017R3
tar xf MediaSamples_Linux_2017R3_b698.tar.gz
cd /usr/local/src/MediaServerStudioEssentials2017R3/MediaSamples_Linux_2017R3_b698/samples/_bin/x64
./sample_multi_transcode -i::h264 ../content/test_stream.264 -o::h264 test_out.h264 -hw -la
:
Multi Transcoding Sample Version 8.0.24.698
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
Pipeline surfaces number (DecPool): 59
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), Init, m_pmfxDEC->Init failed at /home/lab_msdk/buildAgentDir/buildAgent_MediaSDK1/git/mdp_msdk-lib/samples/sample_multi_transcode/src/pipeline_transcode.cpp:3336
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), Init, pThreadPipeline->pPipeline->Init failed at /home/lab_msdk/buildAgentDir/buildAgent_MediaSDK1/git/mdp_msdk-lib/samples/sample_multi_transcode/src/sample_multi_transcode.cpp:348
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), main, transcode.Init failed at /home/lab_msdk/buildAgentDir/buildAgent_MediaSDK1/git/mdp_msdk-lib/samples/sample_multi_transcode/src/sample_multi_transcode.cpp:750
久々の玉砕。このあともいろいろ試行錯誤してみたんだけど、このエラーが出たまま変わらず。既にPCIeスロットにはGeForceが刺さっているので、そこまで執着せずに次回はNVENCを試してみる。ubuntuでMSS対応させようと思うと、kernelリビルドとかドライバ周りとか気になることが多いので、次回のversion upでGeneric Installの対象が16.04になってくれることを祈る方が早いかもしれない。ただ、その割には成功したみたいに言ってる手順の存在がなあ。嘘かもしれないけど。時間のあるときにリトライしてみよう。