status=226/NAMESPACE в systemd
Код 226/NAMESPACE systemd выдаёт, когда не сумел собрать изолированное представление файловой системы для службы. Это самый частый код среди «параметров безопасности»: обычно в ReadWritePaths=, ReadOnlyPaths= или BindPaths= указан путь, которого нет.
Что это значит
Перед запуском службы systemd создаёт для неё отдельное пространство имён монтирования и раскладывает в нём то, что описано параметрами изоляции: ProtectSystem=, ProtectHome=, PrivateTmp=, списки путей для чтения и записи. Любая невозможность выполнить один из шагов даёт 226.
Отдельно стоит помнить про порядок: сначала строится пространство имён, потом открывается вывод и запускается программа. Поэтому 226 приходит раньше, чем ошибки доступа к файлам внутри программы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Путь из
ReadWritePaths=илиReadOnlyPaths=не существуетsystemd пытается подключить указанный путь внутрь пространства имён. Несуществующий путь даёт отказ, если перед ним не стоит дефис.
-
Ядро или контейнер не позволяют создать пространство имён
Во вложенном контейнере без CAP_SYS_ADMIN построение пространства имён монтирования запрещено. Именно поэтому unit с
ProtectSystem=strictработает на обычной машине и падает в контейнере. -
Противоречие между параметрами изоляции
Например
ProtectSystem=strictвместе с записью в /usr, илиProtectHome=yesприWorkingDirectory=в домашнем каталоге. Собрать такое пространство имён нельзя. -
Указано
PrivateTmp=yes, а /tmp занят своим монтированиемЕсли /tmp примонтирован особым образом (например только для чтения), подменить его на приватный каталог не получается.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
systemd называет проблемный путь прямо в сообщении — это самый быстрый способ найти виновника.
journalctl -xeu myapp.service --no-pager -n 30Все параметры изоляции в одном выводе, включая пришедшие из drop-in.
systemctl show myapp.service | grep -E "Protect|Private|Paths|Temporary"Показывает, какие настройки изоляции действуют у службы, и помогает понять, какую из них добавили последней.
sudo systemd-analyze security myapp.service | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
ReadWritePaths= или ReadOnlyPaths= не существует- Почему происходит
- systemd пытается подключить указанный путь внутрь пространства имён. Несуществующий путь даёт отказ, если перед ним не стоит дефис.
- Как проверить
-
Посмотрите списки путей и проверьте каждый.
systemctl show myapp.service | grep -E "ReadWritePaths|ReadOnlyPaths|InaccessiblePaths|BindPaths"
- Как исправить
-
Создайте каталог или сделайте путь необязательным, поставив перед ним дефис:
ReadWritePaths=-/var/lib/myapp.sudo install -d -o app -g app /var/lib/myapp
- Почему происходит
- Во вложенном контейнере без CAP_SYS_ADMIN построение пространства имён монтирования запрещено. Именно поэтому unit с
ProtectSystem=strictработает на обычной машине и падает в контейнере.
- Как проверить
-
Определите окружение.
systemd-detect-virt systemctl show myapp.service -p ProtectSystem -p PrivateTmp
- Как исправить
-
Ослабьте изоляцию для этого окружения (
ProtectSystem=no,PrivateTmp=no) или дайте контейнеру необходимые права.
- Почему происходит
- Например
ProtectSystem=strictвместе с записью в /usr, илиProtectHome=yesприWorkingDirectory=в домашнем каталоге. Собрать такое пространство имён нельзя.
- Как проверить
-
Сопоставьте параметры изоляции с тем, куда служба обращается.
systemctl show myapp.service | grep -E "Protect|Private|Temporary"
- Как исправить
-
Разрешите нужные пути точечно через
ReadWritePaths=вместо ослабления изоляции целиком.
PrivateTmp=yes, а /tmp занят своим монтированием- Почему происходит
- Если /tmp примонтирован особым образом (например только для чтения), подменить его на приватный каталог не получается.
- Как проверить
-
Посмотрите монтирования /tmp.
findmnt /tmp
- Как исправить
- Исправьте монтирование /tmp или отключите приватный /tmp для этой службы.
Пример вывода
В ReadWritePaths= указан несуществующий каталог. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-14 22:01:37 MSK; 1s ago
Process: 22040 ExecStart=/usr/local/bin/myapp (code=exited, status=226/NAMESPACE)
systemd[22040]: myapp.service: Failed to set up mount namespacing: /var/lib/myapp: No such file or directory
systemd[22040]: myapp.service: Failed at step NAMESPACE spawning /usr/local/bin/myapp: No such file or directory
Частые вопросы
Почему unit работает на сервере, но падает с 226 в контейнере?
Потому что построение пространства имён монтирования требует прав, которых в контейнере обычно нет. Для контейнера параметры изоляции приходится ослаблять: сам контейнер уже даёт изоляцию.
Связанные ошибки
- status=210/CHROOT в systemd Код 210/CHROOT: не удалось сменить корневой каталог из RootDirectory= или подключить образ RootImage=.
- status=225/NETWORK в systemd Код 225/NETWORK: не удалось создать сетевое пространство имён для службы при PrivateNetwork=yes или NetworkNamespacePath=.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- status=209/STDOUT в systemd Код 209/STDOUT: systemd не смог настроить стандартный вывод службы. Чаще всего виноват путь в StandardOutput=append: или file:.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- status=200/CHDIR в systemd Код 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
- status=203/EXEC в systemd Код 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
Где встречается чаще всего
Источники
-
systemd.exec(5)
226 EXIT_NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на ReadWritePaths с несуществующим каталогом и на ProtectSystem=strict внутри контейнера.