status=217/USER в systemd
Код 217/USER systemd выдаёт до запуска программы, когда не смог получить или применить учётные данные пользователя из User=. Чаще всего такого пользователя просто нет в системе — например, он создаётся установщиком, который ещё не выполнялся.
Что это значит
Определение пользователя идёт до вызова программы, поэтому ни одной строки от службы в журнале не будет. Проверять надо не программу, а систему: есть ли пользователь, разрешимо ли имя, не мешает ли другой параметр unit-файла.
Сюда же systemd относит неудачу с пользовательскими пространствами имён: если в unit-файле задан PrivateUsers=, а ядро или контейнер такого не позволяют, код будет тем же 217.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Пользователя из
User=нет в системеПакет не создал пользователя, его удалили, или в unit-файле опечатка. systemd не заводит пользователей сам, кроме случая
DynamicUser=yes. -
Пользователь есть только в сетевом каталоге, который недоступен на момент запуска
При LDAP, SSSD или FreeIPA имя разрешается через сеть. Если служба стартует раньше готовности сети и nss-модулей, пользователь «не существует» именно в этот момент.
-
Имя пользователя недопустимо для systemd
systemd строже обычного useradd: имя с точкой, пробелом, символами в верхнем регистре в некоторых версиях или длиннее 31 символа будет отвергнуто ещё при разборе.
-
User=задан вместе сDynamicUser=yesЭти настройки противоречат друг другу: временного пользователя systemd создаёт сам, и явно заданное имя ломает схему.
-
Пользовательские пространства имён недоступны
При
PrivateUsers=yesв контейнере без нужных прав или на ядре с отключёнными user namespaces подготовка не проходит, и systemd сообщает тот же 217.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
systemd пишет, какое именно имя не удалось разобрать: «Failed to determine user credentials» с указанием имени.
journalctl -xeu myapp.service --no-pager -n 30Показывает пользователя так, как его видит система целиком, включая сетевые источники. Пустой вывод — пользователя нет.
getent passwd appДействующие значения после всех drop-in: бывает, что пользователь задан в двух местах и применилось не то, что ожидалось.
systemctl show myapp.service -p User -p Group -p DynamicUserРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
User= нет в системе- Почему происходит
- Пакет не создал пользователя, его удалили, или в unit-файле опечатка. systemd не заводит пользователей сам, кроме случая
DynamicUser=yes.
- Как проверить
-
Проверьте наличие пользователя.
id app getent passwd app
- Как исправить
-
Создайте системного пользователя без оболочки и домашнего каталога, если он служебный.
sudo useradd --system --no-create-home --shell /usr/sbin/nologin app
- Почему происходит
- При LDAP, SSSD или FreeIPA имя разрешается через сеть. Если служба стартует раньше готовности сети и nss-модулей, пользователь «не существует» именно в этот момент.
- Как проверить
-
Сравните, разрешается ли имя после загрузки, и посмотрите, когда стартовала служба относительно сети.
getent passwd app systemctl status sssd.service nss-user-lookup.target
- Как исправить
-
Добавьте ожидание готовности разрешения имён:
After=nss-user-lookup.targetи, при необходимости, зависимость от службы каталога.[Unit] After=nss-user-lookup.target sssd.service Wants=nss-user-lookup.target
- Почему происходит
- systemd строже обычного useradd: имя с точкой, пробелом, символами в верхнем регистре в некоторых версиях или длиннее 31 символа будет отвергнуто ещё при разборе.
- Как проверить
-
Посмотрите точное значение и сообщение в журнале: при недопустимом имени systemd пишет про invalid user name.
systemctl show myapp.service -p User
- Как исправить
- Переименуйте пользователя в допустимое имя: строчные буквы, цифры, дефис и подчёркивание.
User= задан вместе с DynamicUser=yes- Почему происходит
- Эти настройки противоречат друг другу: временного пользователя systemd создаёт сам, и явно заданное имя ломает схему.
- Как проверить
-
Поищите оба параметра в действующей конфигурации.
systemctl show myapp.service -p User -p DynamicUser
- Как исправить
-
Оставьте одно: либо
DynamicUser=yesбезUser=, либо явного пользователя без динамического.
- Почему происходит
- При
PrivateUsers=yesв контейнере без нужных прав или на ядре с отключёнными user namespaces подготовка не проходит, и systemd сообщает тот же 217.
- Как проверить
-
Проверьте, задан ли параметр и разрешены ли пространства имён ядром.
systemctl show myapp.service -p PrivateUsers sysctl kernel.unprivileged_userns_clone 2>/dev/null
- Как исправить
-
Уберите
PrivateUsers=yesили запускайте службу в окружении, где пространства имён разрешены.
Пример вывода
В unit-файле указан пользователь, которого нет в системе. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-14 13:04:55 MSK; 1s ago
Process: 6410 ExecStart=/usr/local/bin/myapp (code=exited, status=217/USER)
systemd[6410]: myapp.service: Failed to determine user credentials: No such process
systemd[1]: myapp.service: Main process exited, code=exited, status=217/USER
systemd[1]: myapp.service: Failed with result 'exit-code'.
Приписка «No such process» тут сбивает с толку: речь не о процессе, а о том, что запись о пользователе не найдена.
Связанные ошибки
- status=216/GROUP в systemd Код 216/GROUP: systemd не смог определить или сменить группу из Group= или SupplementaryGroups=. Причины и как проверить.
- status=203/EXEC в systemd Код 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
- status=200/CHDIR в systemd Код 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
- status=224/PAM в systemd Код 224/PAM: не удалось открыть сеанс PAM для службы. Обычно нет нужного файла настроек в /etc/pam.d.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
Где встречается чаще всего
Источники
-
systemd.exec(5)
217 EXIT_USER: не удалось определить или сменить учётные данные пользователя, либо настроить user namespace. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с User=nonexistent и на связке User= + DynamicUser=yes.