Operation not permitted в журнале службы
Сообщение Operation not permitted (номер 1, EPERM) отличается от отказа в доступе к файлу: тут ядро запрещает саму операцию. У служб под systemd причина почти всегда в параметрах изоляции unit-файла, а не в правах на файлы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Не хватает возможности процесса
Операции вроде привязки к порту ниже 1024, изменения приоритета или настройки сети требуют конкретных возможностей. Без них ядро отвечает именно так.
-
Операцию запрещает фильтр системных вызовов
При
SystemCallErrorNumber=EPERMзапрещённый вызов не убивает процесс, а возвращает эту ошибку. Программа сообщает о ней своими словами. -
Запрещает модуль безопасности
SELinux и AppArmor могут запрещать операции при верных правах. Признак — записи в журнале аудита.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Строка с ошибкой и контекст: какая именно операция не прошла.
journalctl -u myapp.service -n 40 --no-pager | grep -iE "not permitted|EPERM"Все параметры, способные запретить операцию.
systemctl show myapp.service | grep -E "^Capability|^Ambient|^SystemCall|^Restrict"Сводка по изоляции службы.
sudo systemd-analyze security myapp.service | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Операции вроде привязки к порту ниже 1024, изменения приоритета или настройки сети требуют конкретных возможностей. Без них ядро отвечает именно так.
- Как проверить
-
Посмотрите набор возможностей службы.
systemctl show myapp.service -p CapabilityBoundingSet -p AmbientCapabilities -p User
- Как исправить
-
Выдайте нужную возможность точечно через
AmbientCapabilities=, не возвращая службу к правам root.
- Почему происходит
- При
SystemCallErrorNumber=EPERMзапрещённый вызов не убивает процесс, а возвращает эту ошибку. Программа сообщает о ней своими словами.
- Как проверить
-
Посмотрите фильтр и записи ядра.
systemctl show myapp.service -p SystemCallFilter -p SystemCallErrorNumber journalctl -k -b --no-pager | grep -i seccomp | tail -5
- Как исправить
- Добавьте нужные вызовы в фильтр или уберите его для разбора, а затем сузьте заново.
- Почему происходит
- SELinux и AppArmor могут запрещать операции при верных правах. Признак — записи в журнале аудита.
- Как проверить
-
Посмотрите отказы модуля.
sudo ausearch -m avc -ts recent 2>/dev/null | tail -10 sudo aa-status 2>/dev/null | head -3
- Как исправить
- Поправьте политику или профиль для нужной операции.
Пример вывода
Служба не может изменить приоритет процесса. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[4100]: warning: setpriority failed: Operation not permitted
myapp[4100]: fatal: cannot apply scheduling policy: Operation not permitted
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=218/CAPABILITIES в systemd Код 218/CAPABILITIES: не удалось применить набор возможностей процесса из CapabilityBoundingSet= или AmbientCapabilities=.
- signal=SYS (status=31/SYS) в systemd Процесс службы убит сигналом SYS: фильтр системных вызовов запретил вызов. Как найти запрещённый вызов и исправить SystemCallFilter.
- status=201/NICE в systemd Код 201/NICE: systemd не смог выставить приоритет процесса из Nice=. Обычно мешает предел LimitNICE или отсутствие прав.
- Read-only file system в журнале службы Служба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
- status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- status=210/CHROOT в systemd Код 210/CHROOT: не удалось сменить корневой каталог из RootDirectory= или подключить образ RootImage=.
- status=229/SELINUX_CONTEXT в systemd Код 229/SELINUX_CONTEXT: не удалось определить или сменить контекст SELinux для процесса службы.
Источники
-
systemd.exec(5)
Возможности процесса и параметры изоляции. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено попыткой повысить приоритет в службе без CAP_SYS_NICE.