Function not implemented в контейнере
Сообщение Function not implemented (номер 38, ENOSYS) означает, что системный вызов недоступен. У служб это почти всегда следствие фильтрации: seccomp в контейнере или SystemCallFilter= с возвратом ошибки вместо завершения.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Вызов запрещён фильтром с возвратом ошибки
При
SystemCallErrorNumber=ENOSYSзапрещённый вызов не убивает процесс, а возвращает эту ошибку. Программа сообщает о ней своими словами. -
Профиль контейнера запрещает вызов
Среды исполнения контейнеров применяют свой фильтр. Часть вызовов там недоступна, и программы из новых версий языков иногда упираются в это.
-
Ядро старее, чем требует программа
Новые вызовы появляются в новых версиях ядра. Программа, собранная под свежее ядро, на старом получает эту ошибку.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Фильтр вызовов службы.
systemctl show myapp.service -p SystemCallFilter -p SystemCallErrorNumberРаботает ли служба в контейнере.
systemd-detect-virt --containerВерсия ядра.
uname -rРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При
SystemCallErrorNumber=ENOSYSзапрещённый вызов не убивает процесс, а возвращает эту ошибку. Программа сообщает о ней своими словами.
- Как проверить
-
Посмотрите фильтр службы.
systemctl show myapp.service -p SystemCallFilter -p SystemCallErrorNumber
- Как исправить
-
Добавьте нужные вызовы в фильтр. Набор
@system-serviceпокрывает обычные потребности, но не всё.
- Почему происходит
- Среды исполнения контейнеров применяют свой фильтр. Часть вызовов там недоступна, и программы из новых версий языков иногда упираются в это.
- Как проверить
-
Определите окружение и посмотрите профиль.
systemd-detect-virt --container journalctl -u myapp.service -n 20 --no-pager | grep -i "not implemented"
- Как исправить
- Обновите среду исполнения контейнеров: профили расширяются вслед за новыми вызовами ядра. Отключать фильтр целиком — последняя мера.
- Почему происходит
- Новые вызовы появляются в новых версиях ядра. Программа, собранная под свежее ядро, на старом получает эту ошибку.
- Как проверить
-
Посмотрите версию ядра и требования программы.
uname -r journalctl -u myapp.service -n 20 --no-pager | tail -5
- Как исправить
- Обновите ядро или используйте сборку программы под вашу версию.
Пример вывода
Вызов запрещён фильтром с возвратом ошибки. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[1200]: error: clone3 failed: function not implemented
myapp[1200]: falling back to clone()
Связанные ошибки
- signal=SYS (status=31/SYS) в systemd Процесс службы убит сигналом SYS: фильтр системных вызовов запретил вызов. Как найти запрещённый вызов и исправить SystemCallFilter.
- status=228/SECCOMP в systemd Код 228/SECCOMP: не удалось применить фильтр системных вызовов из SystemCallFilter=. Причины: неизвестное имя вызова, отсутствие поддержки в ядре.
- Служба падает после обновления ядра: модуль не собран Служба зависит от модуля ядра, который не собран под новую версию. Разбор для сторонних драйверов и виртуализации.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Failed to connect to bus: No such file or directory Команды systemctl отказывают с этой ошибкой: нет шины сеанса, нет менеджера пользователя или это контейнер без systemd.
- Failed to connect to bus: подключение к шине недоступно Команды systemctl не работают: нет подключения к шине. Разбор для контейнеров, сеансов по ssh и служб пользователя.
- Hardware Error / EDAC: ошибки памяти в журнале Ядро сообщает об ошибках памяти. Что считать безобидным, а что поводом менять модуль.
- I/O error, dev sda, sector N: ошибка носителя Ядро сообщает об ошибке чтения или записи на устройстве. Что делать со службой и данными.
Где встречается чаще всего
Источники
-
systemd.exec(5)
SystemCallFilter= и SystemCallErrorNumber=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено фильтром с возвратом ошибки вместо завершения.