status=228/SECCOMP в systemd
Код 228/SECCOMP значит, что systemd не сумел установить фильтр системных вызовов. Обычно в SystemCallFilter= есть имя, которого ядро не знает, либо фильтрация недоступна в этом окружении.
Что это значит
Важно отличать этот код от ситуации, когда фильтр применился, но убил процесс в работе: тогда служба падает по сигналу SYS (обычно 31/SYS) и в журнале ядра видна запись audit о заблокированном вызове. Код 228 — это неудача самой установки фильтра, до запуска программы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В списке есть неизвестный системный вызов или набор
Имена проверяются при применении. Опечатка в имени вызова или в названии набора (
@system-service,@network-io) даёт отказ. -
Ядро без поддержки seccomp или её запрещает контейнер
На ядре, собранном без seccomp, и в части контейнеров установка фильтра невозможна.
-
Фильтр противоречит архитектурам из
SystemCallArchitectures=Если ограничить архитектуры и при этом фильтровать вызовы, специфичные для исключённой архитектуры, применение фильтра может не пройти.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает шаг SECCOMP и причину отказа.
journalctl -xeu myapp.service --no-pager -n 20Содержимое стандартного набора: удобно, когда нужно понять, что уже разрешено, а что придётся добавить.
systemd-analyze syscall-filter @system-service | head -30Записи ядра о работе фильтра: они отличают неудачу установки от блокировки вызова в работе.
journalctl -k -b --no-pager | grep -i seccompРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Имена проверяются при применении. Опечатка в имени вызова или в названии набора (
@system-service,@network-io) даёт отказ.
- Как проверить
-
Посмотрите действующий фильтр и сверьте имена с доступными наборами.
systemctl show myapp.service -p SystemCallFilter systemd-analyze syscall-filter | head -40
- Как исправить
-
Исправьте имена. Полный перечень наборов и вызовов показывает
systemd-analyze syscall-filter.
- Почему происходит
- На ядре, собранном без seccomp, и в части контейнеров установка фильтра невозможна.
- Как проверить
-
Проверьте поддержку в ядре.
grep -i seccomp /boot/config-$(uname -r) 2>/dev/null systemd-detect-virt
- Как исправить
-
Уберите
SystemCallFilter=для такого окружения или запускайте службу там, где seccomp доступен.
SystemCallArchitectures=- Почему происходит
- Если ограничить архитектуры и при этом фильтровать вызовы, специфичные для исключённой архитектуры, применение фильтра может не пройти.
- Как проверить
-
Посмотрите оба параметра.
systemctl show myapp.service -p SystemCallFilter -p SystemCallArchitectures
- Как исправить
-
Согласуйте списки либо оставьте только
SystemCallArchitectures=native.
Пример вывода
В фильтре опечатка в имени набора. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-14 22:30:58 MSK; 1s ago
Process: 22900 ExecStart=/usr/local/bin/myapp (code=exited, status=228/SECCOMP)
systemd[22900]: myapp.service: Failed to apply system call filters: Invalid argument
systemd[22900]: myapp.service: Failed at step SECCOMP spawning /usr/local/bin/myapp: Invalid argument
Связанные ошибки
- status=244/BPF в systemd Код 244/BPF: не удалось применить ограничения через BPF, например RestrictFileSystems=. В man-странице systemd этот код указан неверно.
- status=227/NO_NEW_PRIVILEGES в systemd Код 227/NO_NEW_PRIVILEGES: не удалось включить запрет получения новых привилегий. Редкий код, обычно из-за окружения.
- signal=SYS (status=31/SYS) в systemd Процесс службы убит сигналом SYS: фильтр системных вызовов запретил вызов. Как найти запрещённый вызов и исправить SystemCallFilter.
- status=232/ADDRESS_FAMILIES в systemd Код 232/ADDRESS_FAMILIES: не удалось применить ограничение семейств адресов из RestrictAddressFamilies=.
- Function not implemented в контейнере Ошибка 38 при системном вызове: вызов запрещён фильтром или отсутствует в окружении. Разбор для контейнеров.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- Operation not permitted в журнале службы Операция запрещена: не хватает возможностей процесса, мешает seccomp или модуль безопасности. Отличие от Permission denied.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
Где встречается чаще всего
Источники
-
systemd.exec(5)
228 EXIT_SECCOMP: не удалось применить фильтры системных вызовов, см. SystemCallFilter=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено с опечаткой в наборе @system-servce и на ядре без seccomp.