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にパススルーする
WindowsのNVIDIAドライバはOSがKVMハイパーバイザー環境で動作していることを検知すると error 43 で動作停止するという仕様のため、回避するために以下の対策が必要。
1. libvirt のドメイン設定でハイパーバイザーのベンダーIDを偽装する
2. libvirt のドメイン設定で hidden state を on にする
詳細は下記 https://wiki.archlinuxjp.org/index.php/OVMF_による_PCI_パススルー 9.1 Windows の仮想マシンに NVIDIA の GPU をパススルーした場合に "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-install で UEFI を指定してインストール
# 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 \ --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
上記の例では <ホストのIP>:5910 にアクセスし、パスワード:foobar を入力
各種パラメータについては下記を参照。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/
CentOS7 最新の安定板カーネルへの更新方法
# 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