PrivateTmp=yes: свой /tmp для службы
Выдаёт службе собственные каталоги /tmp и /var/tmp, не видимые остальной системе. При остановке службы их содержимое удаляется.
Что делает
Защита от классической проблемы общего /tmp: подмена файлов, чтение чужих временных данных, конфликты имён. Для большинства служб включается безболезненно.
Ломает она обмен файлами через /tmp. Файл, положенный туда вручную, служба не увидит — у неё свой каталог. И наоборот: то, что служба записала в /tmp, вы не найдёте по обычному пути. Настоящий каталог лежит в /tmp/systemd-private-*-имя.service-*/tmp.
Где ставится. В секции [Service]. Включается автоматически при DynamicUser=yes.
Значения
| Значение | Что происходит |
|---|---|
yes | служба получает собственные /tmp и /var/tmp. |
no | по умолчанию: общие каталоги. |
По умолчанию: no, но yes при DynamicUser=yes
Пример
Изолированная служба; обмен данными — через свой каталог, а не через /tmp.
[Service]
PrivateTmp=yes
RuntimeDirectory=myapp
ExecStart=/usr/local/bin/myapp --socket /run/myapp/app.sock
Для обмена с другими службами используйте /run через RuntimeDirectory=: путь предсказуем и права правильные.
Типичные ошибки
Файлы, положенные в /tmp вручную, служба не видит: это самая частая причина «файл есть, а служба его не находит».
Данные в приватном /tmp удаляются при остановке службы — для постоянных данных нужен StateDirectory=.
Заглянуть в приватный каталог можно только по длинному пути в /tmp/systemd-private-*: обычный ls по /tmp ничего не покажет.
Связанные ошибки
- No such file or directory в журнале службыСлужба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- status=226/NAMESPACE в systemdКод 226/NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. Частая причина — путь в ReadOnlyPaths= или ProtectHome=.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)