Intel 내장 GPU 로 영상 트랜스코딩을 돌리려면 VA-API 스택이 필요하다. Debian 계열에는 intel-media-va-driver 패키지가 있지만 RHEL 9 계열(Rocky · AlmaLinux)의 기본 저장소와 EPEL 에는 intel-media-driver 가 없다.
No match for argument: intel-media-driver
Error: Unable to find a match: intel-media-driver
RPM Fusion 에서 받을 수 있는 경우도 있지만 배포판 마이너 버전과 커널에 따라 맞지 않을 때가 있고, N100 같은 비교적 새로운 내장 GPU 는 드라이버가 충분히 최신이어야 한다. 그때는 소스로 빌드한다. Plex · Jellyfin · ffmpeg 어느 쪽이든 필요한 것은 같다.
의존 순서가 정해져 있다. GMMLib 를 먼저 올리지 않으면 media-driver 의 cmake 가 멈춘다.
libva → gmmlib(igdgmm) → media-driver(iHD)
dnf install -y epel-release
dnf install -y gcc gcc-c++ cmake make git pkgconf-pkg-config \
libdrm-devel libva libva-devel libva-utils \
libX11-devel libXext-devel libXfixes-devel libpciaccess-devel mesa-libGL-devel
media-driver 는 igdgmm 이라는 pkg-config 모듈을 요구한다. 이것이 GMMLib 이다.
git clone https://github.com/intel/gmmlib.git
cd gmmlib
mkdir build && cd build
cmake ..
make -j"$(nproc)"
make install
설치하면 /usr/local/lib64/pkgconfig/igdgmm.pc 가 생긴다. 이 경로가 pkg-config 의 기본 검색 경로가 아니므로 다음 단계 전에 알려 줘야 한다.
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
pkg-config --modversion igdgmm
이 확인을 건너뛰면 media-driver 의 cmake 가 다음과 같이 멈춘다.
-- Checking for module 'igdgmm>=12.0.0'
-- Package 'igdgmm', required by 'virtual:world', not found
CMake Error at /usr/share/cmake/Modules/FindPkgConfig.cmake:607 (message):
A required package was not found
make install 을 했는데도 못 찾는다면 .pc 파일이 lib 인지 lib64 인지 확인한다. 배포판에 따라 갈린다.
find / -name 'igdgmm.pc' 2>/dev/null
git clone https://github.com/intel/media-driver.git
mkdir build_media && cd build_media
cmake ../media-driver
make -j"$(nproc)"
make install
결과물은 /usr/lib64/dri/iHD_drv_video.so 여야 한다. 여기 들어가지 않았으면 VA-API 가 찾지 못한다.
ls -l /usr/lib64/dri/ | grep iHD
설치 경로가 /usr/local/lib64/dri 로 잡혔다면 드라이버 검색 경로를 알려 준다.
export LIBVA_DRIVERS_PATH=/usr/local/lib64/dri
동적 링커 경로에 /usr/local/lib64 가 없으면 등록한다.
echo /usr/local/lib64 > /etc/ld.so.conf.d/local-lib64.conf
ldconfig
서버에는 X 세션이 없으므로 vainfo 를 그냥 실행하면 실패한다.
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
DRM 장치를 직접 지정한다.
ls -l /dev/dri
vainfo --display drm --device /dev/dri/renderD128
정상이면 드라이버 이름과 지원 프로파일이 나온다.
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - ...
VAProfileH264Main : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
HEVC 가속 여부만 빠르게 보려면 걸러서 본다.
vainfo --display drm --device /dev/dri/renderD128 | grep -i hevc
/dev/dri/renderD128 은 보통 render 그룹 소유다. 배포판에 따라 video 인 경우도 있으므로 실제 소유 그룹을 보고 서비스 계정을 넣는다.
stat -c '%U:%G %a' /dev/dri/renderD128
usermod -aG render,video <SERVICE_USER>
systemd 서비스로 도는 경우에는 그룹을 바꿔도 서비스 재시작 전까지 반영되지 않는다. 컨테이너로 돌린다면 장치를 넘겨야 한다.
devices:
- /dev/dri:/dev/dri
group_add:
- "<RENDER_GID>"
Plex 는 서버 설정의 Transcoder 항목에서 하드웨어 가속을 켜야 실제로 쓴다. 드라이버만 올려 두면 아무 일도 일어나지 않는다. 동작 여부는 재생 중 대시보드의 세션 표시에서 (hw) 가 붙는지로 확인한다.
기동 시 로케일 관련 오류가 나면 언어 팩과 서비스 환경변수를 맞춘다. 최소 설치 이미지에는 영어 로케일조차 없는 경우가 있다.
dnf install -y glibc-langpack-en
localectl set-locale LANG=en_US.UTF-8
# /etc/systemd/system/plexmediaserver.service.d/override.conf
[Service]
Environment=LANG=en_US.UTF-8
Environment=LC_ALL=en_US.UTF-8
systemctl daemon-reload
systemctl restart plexmediaserver
소스 빌드한 드라이버는 패키지 관리자가 모른다. 배포판 업그레이드나 libdrm 갱신 뒤에 깨질 수 있으므로, 빌드 명령과 커밋 해시를 기록해 두고 커널·libdrm 갱신 후에는 vainfo 로 다시 확인한다.
git clone 을 그냥 하면 최신 main 을 받는다. 재현 가능한 설치가 필요하면 태그를 지정한다.
git clone --branch <TAG> --depth 1 https://github.com/intel/gmmlib.git