DynamicUser=yes: временный пользователь для службы
Заставляет systemd создать временного пользователя и группу на время работы службы и удалить их после остановки. Пользователь не существует в системе между запусками.
Что делает
Это удобный способ изолировать службу без ручного заведения пользователя: идентификатор выделяется динамически, домашнего каталога нет, доступ к файловой системе ограничен. Вместе с параметром автоматически включается ряд защит: приватный /tmp, запрет записи в системные каталоги.
Главное следствие: у файлов, созданных службой, владелец существует только пока служба работает. Поэтому постоянные данные нужно хранить только в каталогах, которые выдаёт systemd (StateDirectory= и родственные) — он сам следит за их владельцем между запусками.
Где ставится. В секции [Service]. Несовместим с явным User=.
Значения
| Значение | Что происходит |
|---|---|
yes | временный пользователь создаётся на время работы службы. |
no | по умолчанию: пользователь берётся из User= или служба работает от root. |
По умолчанию: no
Пример
Изолированная служба без заведения пользователя вручную.
[Service]
DynamicUser=yes
StateDirectory=myapp
CacheDirectory=myapp
ExecStart=/usr/local/bin/myapp --data /var/lib/myapp
Каталоги выдаёт systemd, и их владелец обновляется при каждом запуске. Без этого данные оказались бы недоступны после смены идентификатора.
Типичные ошибки
Вместе с User= параметры противоречат друг другу: запуск завершится кодом 217/USER.
Файлы вне каталогов службы останутся с владельцем, которого больше нет: доступ к ним пропадёт после перезапуска.
Модули PAM и всё, что ожидает настоящего пользователя, с временным пользователем не работают.
Служба не может обращаться к домашним каталогам и к чужим данным — в этом и смысл, но при переносе существующей службы это неожиданно.
Связанные ошибки
- status=217/USER в systemdКод 217/USER означает, что systemd не смог определить или сменить пользователя из User=. Разбор причин: пользователя нет, имя недопустимо, конфликт с DynamicUser.
- status=238/STATE_DIRECTORY в systemdКод 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)