status=4/NOPERMISSION в systemd
Код 4 по соглашению LSB означает недостаток прав, и возвращает его сама программа — чаще всего init-скрипты и службы, унаследовавшие их поведение. Разбирать нужно не код, а то, к чему именно не хватило доступа.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба работает от пользователя без нужных прав
В unit-файле задан
User=, а программе нужен доступ к файлу, устройству или привилегированному порту. -
Программа требует именно root
Часть служб проверяет идентификатор пользователя в начале работы и отказывается работать не от root.
-
Мешают параметры изоляции из того же unit-файла
ProtectSystem=,ReadOnlyPaths=,PrivateDevices=закрывают доступ к путям и устройствам, даже когда права на них в порядке.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщение программы о том, чего именно ей не хватило.
journalctl -u myapp.service -n 40 --no-pagerОт кого работает служба и какие возможности ей оставлены.
systemctl show myapp.service -p User -p Group -p AmbientCapabilitiesРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- В unit-файле задан
User=, а программе нужен доступ к файлу, устройству или привилегированному порту.
- Как проверить
-
Посмотрите пользователя службы и сообщение программы.
systemctl show myapp.service -p User -p Group journalctl -u myapp.service -n 40 --no-pager
- Как исправить
-
Дайте доступ точечно: права на файл, членство в группе,
AmbientCapabilities=CAP_NET_BIND_SERVICEдля портов ниже 1024. Запускать от root ради одного доступа — плохой обмен.
- Почему происходит
- Часть служб проверяет идентификатор пользователя в начале работы и отказывается работать не от root.
- Как проверить
-
Поищите в журнале сообщение про root или про недостаток привилегий.
journalctl -u myapp.service -n 30 --no-pager | grep -iE "root|privile|permission"
- Как исправить
-
Уберите
User=для такой службы либо найдите в её настройках способ работать от обычного пользователя.
- Почему происходит
ProtectSystem=,ReadOnlyPaths=,PrivateDevices=закрывают доступ к путям и устройствам, даже когда права на них в порядке.
- Как проверить
-
Посмотрите действующие параметры изоляции.
systemctl show myapp.service | grep -E "Protect|Private|Paths"
- Как исправить
-
Разрешите нужное точечно через
ReadWritePaths=илиDeviceAllow=, не снимая изоляцию целиком.
Пример вывода
Служба от обычного пользователя пытается занять порт 80. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× web.service - Web server
Active: failed (Result: exit-code) since Mon 2026-09-15 11:40:55 MSK; 1s ago
Process: 9100 ExecStart=/usr/local/bin/web --port 80 (code=exited, status=4/NOPERMISSION)
web[9100]: fatal: bind 0.0.0.0:80: permission denied
systemd[1]: web.service: Main process exited, code=exited, status=4/NOPERMISSION
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=217/USER в systemd Код 217/USER означает, что systemd не смог определить или сменить пользователя из User=. Разбор причин: пользователя нет, имя недопустимо, конфликт с DynamicUser.
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- 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)
Класс LSB: код 4 — недостаточно привилегий. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на службе от непривилегированного пользователя с привязкой к порту 80.