Медиасервер не использует ускорение: нет доступа к устройству
Ускорение перекодирования требует доступа к устройству видеоядра. Служба работает от непривилегированного пользователя, который по умолчанию в нужную группу не входит, а изоляция unit-файла может скрыть устройство целиком. Признак — высокая нагрузка на процессор при работающем сервере.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Пользователь службы не в группе устройства
Файл устройства доступен членам определённой группы. Без членства служба его не откроет.
-
Доступ к устройствам обрезан изоляцией
Параметры приватного каталога устройств и списка разрешённых устройств скрывают файл от процессов службы.
-
Устройство отсутствует в виртуальной машине
Без проброса устройства ускорение невозможно, и перекодирование всегда идёт процессором.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Есть ли устройство ускорения и какой группе доступно.
ls -l /dev/dri/Пользователь, группы и изоляция службы.
systemctl show jellyfin -p User -p SupplementaryGroups -p PrivateDevicesСообщения сервера об ускорении.
journalctl -u jellyfin -n 30 --no-pager | grep -iE "vaapi|qsv|hardware|permission"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Файл устройства доступен членам определённой группы. Без членства служба его не откроет.
- Как проверить
-
Посмотрите права устройства и группы пользователя службы.
ls -l /dev/dri/ 2>/dev/null id jellyfin 2>/dev/null
- Как исправить
- Добавьте пользователя службы в группу устройства и перезапустите её. Группа зависит от дистрибутива, её видно в правах файла устройства.
- Почему происходит
- Параметры приватного каталога устройств и списка разрешённых устройств скрывают файл от процессов службы.
- Как проверить
-
Посмотрите параметры и содержимое каталога устройств изнутри службы.
systemctl show jellyfin -p PrivateDevices -p DeviceAllow -p SupplementaryGroups 2>/dev/null
- Как исправить
-
Разрешите конкретное устройство в списке и отключите приватный каталог устройств. Разрешать все устройства не нужно.
[Service] PrivateDevices=no DeviceAllow=/dev/dri/renderD128 rw SupplementaryGroups=render
- Почему происходит
- Без проброса устройства ускорение невозможно, и перекодирование всегда идёт процессором.
- Как проверить
-
Определите окружение и наличие устройства.
systemd-detect-virt; ls /dev/dri/ 2>/dev/null || echo устройств нет
- Как исправить
- Пробросьте устройство в виртуальную машину или откажитесь от ускорения. Без устройства настройки в самом сервере ничего не меняют.
Пример вывода
Пользователь службы не в группе устройства. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
jellyfin[8100]: [ERR] FFmpeg exited with code 1: Failed to initialise VAAPI connection: -1 (unknown libva error)
jellyfin[8100]: [WRN] Hardware acceleration is not available, falling back to software transcoding
$ ls -l /dev/dri/renderD128
crw-rw---- 1 root render 226, 128 Sep 15 09:12 /dev/dri/renderD128
Связанные ошибки
- openvpn: Cannot open TUN/TAP dev /dev/net/tun Служба не может открыть устройство туннеля: нет модуля, нет устройства в контейнере или мешает изоляция unit-файла.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Служба ждёт устройство: device-unit не появляется Зависимость от .device не выполняется: устройства нет, оно не размечено, или ядро не сообщило о нём.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
Источники
-
systemd.exec(5)
DeviceAllow=, PrivateDevices= и SupplementaryGroups=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено службой от пользователя вне группы устройства.