CentOS7 VAAPIでHWエンコード

リポジトリの追加

# yum -y install yum-utils epel-release
# yum-config-manager --disable epel-release
# yum-config-manager --add-repo=http://negativo17.org/repos/epel-multimedia.repo
# yum-config-manager --disable epel-multimedia

・インストール

# yum --enablerepo=epel,epel-multimedia install libva libva-devel libva-intel-driver libva-utils

# vainfo
※利用可能なプロファイル一覧が表示されればOK

ffmpegのインストール
https://trac.ffmpeg.org/wiki/CompilationGuide/Centos

ffmpegで動作確認

※vaapi_device で指定するHWエンコードバイスは ls -n /dev/dri で確認

# ffmpeg -vaapi_device /dev/dri/card0 \
  -hwaccel vaapi \
  -hwaccel_output_format vaapi \
  -i input.mp4 \
  -c:v h264_vaapi  -profile:v 100 -level 40 -qp 22 \
  -c:a copy \
  output.mp4

・TSのエンコード

# ffmpeg \
  -vaapi_device /dev/dri/card0 \
  -hwaccel vaapi \
  -hwaccel_output_format vaapi \
  -i input.ts \
  -analyzeduration 30M -probesize 30M \
  -vf 'format=nv12|vaapi,hwupload,scale_vaapi=w=720:h=480' \
  -c:v h264_vaapi -profile:v 77 -level 31 -qp 22 -quality 0 -aspect 16:9 \
  -c:a libfdk_aac  -ac 2 -ab 96k -ar 48000 \
  output.mp4

hwaccel vaapi
 → HWデコードする
hwaccel_output_format vaapi
 → HWデコード結果をそのままHWエンコーダに渡す
   ※ソフトウェアフィルタを使う場合はyuv420p等を指定する
analyzeduration、probesize
 → TSなどのフォーマットでは読み込みのために動画ストリームの解析が必要
   デフォルトの解析時間・解析サイズでは動画を読み込めない場合があるため、長めに修正する
   analyzeduration:デフォルト 5秒(5Mマイクロ秒)
   probesize:デフォルト 5Mバイト
scale_vaapi
 → HWエンコーダでリサイズ
profile:v
 → h.264のプロファイル
   High:100 Main:77 Baseline:66
level 
 → h.264のレベル
   4.0 → 40 3.1 → 31 1.3 → 13
qp
 → 画質
   デフォルト20
   数値が低いほど高画質、高ビットレート
quality
 → 品質
   デフォルト0
   数値が低いほど高画質、低速

・VAAPIの情報
https://wiki.libav.org/Hardware/vaapi
https://gist.github.com/Brainiarc7/95c9338a737aa36d9bb2931bed379219
https://trac.ffmpeg.org/wiki/Hardware/VAAPI

CentOS7 HandBrakeを野良リポジトリからインストールする

リポジトリの追加

# yum -y install yum-utils epel-release
# yum-config-manager --disable epel-release
# yum-config-manager --add-repo=http://negativo17.org/repos/epel-multimedia.repo
# yum-config-manager --disable epel-multimedia

・インストール

# yum --enablerepo=epel install libmfx
# yum --enablerepo=epel-multimedia install HandBrake-cli

CentOS7 KVMでNVIDIAのGPUをWindowsにパススルーする

WindowsNVIDIAドライバはOSがKVMハイパーバイザー環境で動作していることを検知すると error 43 で動作停止するという仕様のため、回避するために以下の対策が必要。
1. libvirtドメイン設定でハイパーバイザーのベンダーIDを偽装する
2. libvirtドメイン設定で hidden state を on にする

詳細は下記
 https://wiki.archlinuxjp.org/index.php/OVMF_による_PCI_パススルー
 9.1	Windows仮想マシンNVIDIAGPU をパススルーした場合に "Error 43 : Driver failed to load"

上記対策はUEFIモードでインストールしたWindowsのみで有効。
BIOSモードでインストールしたWindowsではエラーが出る)

UEFIモードでインストールできるようにするために、OVMF(Open Virtual Machine Firmware)のインストール・設定を行う。

・OVMFのインストール

# vi /etc/yum.repos.d/kraxel.repo
include=https://www.kraxel.org/repos/firmware.repo

# yum install edk2.git-ovmf-x64

virt-installの設定

vert-install で --boot uefi オプションを指定できるようにするために、下記設定を追加する
# /usr/local/etc/libvirt/qemu.conf 
nvram = [
    "/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd:/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd",
    "/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw:/usr/share/edk2.git/aarch64/vars-template-pflash.raw"
]

virt-installUEFI を指定してインストール

# virt-install \
   --boot uefi \
  <省略>

※virt-manager でインストールする場合はファームウェアの指定でUEFIを選択する
※OVMFは virtioで接続したディスクからOS起動できないため、IDE もしくは virtio-scsi での接続が必要

CentOS7 KVM virt-installで仮想マシンをインストールする一例

・仮想ディスク作成

# qemu-img create -f qcow2 /usr/local/var/lib/libvirt/images/vm1.qcow2 8G

virt-install

# virt-install \
 --connect qemu:///system \
 --boot uefi \  ← UEFIモードでインストールしたい場合は指定する。OVMFの事前設定が必要。
 --name vm1 \
 --vcpus=1 \
 --cpu host \
 --ram=1024 \
 --os-type=linux \
 --os-variant=rhel7.3 \
 --disk=/usr/local/var/lib/libvirt/images/vm1.qcow2 \
 --cdrom=/mnt/storage-1/application_installer/ISO/CentOS-7-x86_64-NetInstall-1611.iso \
 --network bridge=br0 \
 --graphics vnc,password=foobar,port=5910,listen=0.0.0.0,keymap=us

※os-type は linux, windows, unix, other のいずれか
※os-variant で指定できるパラメータは下記コマンドで確認
 # osinfo-query os
※指定できる cpu の種類は下記コマンドで確認
 # virsh cpu-models x86_64
※使用できるCPU機能は下記で確認
 # cat /usr/share/libvirt/cpu_map.xml

VNC仮想マシンに接続

上記の例では <ホストのIP>:5910 にアクセスし、パスワード:foobar を入力

各種パラメータについては下記を参照。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/

CentOS7 KVM ksmdを停止する

ksm は複数のVMが持っている同一メモリーページを集約してメモリー使用量を減らすことができる。
ただしCPUリソースをそれなりに食うのと、十分なメモリーがあればあまり恩恵がないので、不要であれば無効化する。

# systemctl stop ksmtuned
# systemctl disable ksmtuned

# systemctl stop ksm
# systemctl disable ksm

CentOS7 KVMをネストする

・状態確認

# cat /sys/module/kvm_intel/parameters/nested 
N
※無効化されている

・有効化

# vi /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1

# modprobe -r kvm_intel 
# modprobe kvm_intel仮想マシンはすべて停止しておくこと

# cat /sys/module/kvm_intel/parameters/nested 
Y

・CPUのパススルー設定

# virsh edit centos7

パススルーした仮想マシン上でKVM環境を構築する

CentOS7 最新の安定板カーネルへの更新方法

・最新カーネルyumで追加できるようにする

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

・通常時は epel を無効化する

# yum -y install yum-utils
# yum-config-manager --disable elrepo-kernel

・最新カーネルのインストール

# yum -y --enablerepo=elrepo-kernel install kernel-ml

・起動するカーネルの変更

# rpm -qa | grep "^kernel" | sort
# grub2-editenv list
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
# grub2-set-default 0
 ※デフォルトにしたいkernelの番号を指定
# grub2-editenv list
# reboot
# uname -a

・関連パッケージの入れ替え

# rpm -qa | grep "^kernel" | sort
# yum -y --enablerepo=elrepo-kernel swap kernel-headers -- kernel-ml-headers
# yum -y --enablerepo=elrepo-kernel swap kernel-tools-libs -- kernel-ml-tools-libs
# yum -y --enablerepo=elrepo-kernel swap kernel-tools kernel-ml-tools
# yum -y --enablerepo=elrepo-kernel swap kernel-devel -- kernel-ml-devel
# rpm -qa | grep "^kernel" | sort

・旧カーネルの削除

# yum -y remove kernel
# rpm -qa | grep "^kernel" | sort