SystemdDoctor
служба не работает seccomp изоляция системные вызовы

status=228/SECCOMP в systemd

Код 228/SECCOMP значит, что systemd не сумел установить фильтр системных вызовов. Обычно в SystemCallFilter= есть имя, которого ядро не знает, либо фильтрация недоступна в этом окружении.

Что это значит

Важно отличать этот код от ситуации, когда фильтр применился, но убил процесс в работе: тогда служба падает по сигналу SYS (обычно 31/SYS) и в журнале ядра видна запись audit о заблокированном вызове. Код 228 — это неудача самой установки фильтра, до запуска программы.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. В списке есть неизвестный системный вызов или набор

    Имена проверяются при применении. Опечатка в имени вызова или в названии набора (@system-service, @network-io) даёт отказ.

  2. Ядро без поддержки seccomp или её запрещает контейнер

    На ядре, собранном без seccomp, и в части контейнеров установка фильтра невозможна.

  3. Фильтр противоречит архитектурам из 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

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. В списке есть неизвестный системный вызов или набор
Почему происходит
Имена проверяются при применении. Опечатка в имени вызова или в названии набора (@system-service, @network-io) даёт отказ.
Как проверить
Посмотрите действующий фильтр и сверьте имена с доступными наборами.
systemctl show myapp.service -p SystemCallFilter
systemd-analyze syscall-filter | head -40
Как исправить
Исправьте имена. Полный перечень наборов и вызовов показывает systemd-analyze syscall-filter.
2. Ядро без поддержки seccomp или её запрещает контейнер
Почему происходит
На ядре, собранном без seccomp, и в части контейнеров установка фильтра невозможна.
Как проверить
Проверьте поддержку в ядре.
grep -i seccomp /boot/config-$(uname -r) 2>/dev/null
systemd-detect-virt
Как исправить
Уберите SystemCallFilter= для такого окружения или запускайте службу там, где seccomp доступен.
3. Фильтр противоречит архитектурам из 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
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено с опечаткой в наборе @system-servce и на ядре без seccomp.
    собственная проверка, systemd 255
    сверено 15 сентября 2026