systemd-tmpfiles-setup: часть каталогов не создана
Служба подготовки создаёт каталоги и файлы времени работы по описаниям из нескольких каталогов. Её отказ означает, что часть каталогов не создана, и службы, рассчитывающие на них, упадут позже — причём с совершенно другими сообщениями.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Два описания задают один путь по-разному
Описания читаются из нескольких каталогов с приоритетом. Конфликт по одному пути даёт ошибку и пропуск строки.
-
Владелец из описания не существует
Описание задаёт владельца по имени. Если пользователь не создан, строка не применяется.
-
Путь ведёт через несуществующий каталог
Служба не создаёт промежуточные каталоги там, где это не задано. Строка отказывает целиком.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Что служба подготовки не смогла создать.
journalctl -u systemd-tmpfiles-setup -b --no-pagerИтоговый набор описаний со всеми переопределениями.
sudo systemd-tmpfiles --cat-config | head -40Прогон без изменений: покажет конфликты и ошибки.
sudo systemd-tmpfiles --create --dry-run 2>&1 | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Описания читаются из нескольких каталогов с приоритетом. Конфликт по одному пути даёт ошибку и пропуск строки.
- Как проверить
-
Посмотрите конфликтующие описания.
journalctl -u systemd-tmpfiles-setup -b --no-pager | tail -15 sudo systemd-tmpfiles --cat-config 2>/dev/null | grep -n "/run/myapp"
- Как исправить
- Уберите дублирующее описание или переопределите его файлом с большим приоритетом в каталоге настроек администратора.
- Почему происходит
- Описание задаёт владельца по имени. Если пользователь не создан, строка не применяется.
- Как проверить
-
Посмотрите сообщение и наличие пользователя.
journalctl -u systemd-tmpfiles-setup -b --no-pager | grep -iE "unknown user|unknown group" getent passwd myapp
- Как исправить
- Создайте пользователя до подготовки каталогов, объявив его в описании пользователей. Тогда порядок будет верным при каждой загрузке.
- Почему происходит
- Служба не создаёт промежуточные каталоги там, где это не задано. Строка отказывает целиком.
- Как проверить
-
Посмотрите путь и его родителей.
journalctl -u systemd-tmpfiles-setup -b --no-pager | grep -iE "Failed to create" namei -l /var/lib/myapp/data 2>/dev/null
- Как исправить
- Опишите промежуточные каталоги отдельными строками или используйте параметры службы вместо описаний подготовки: для каталогов службы это проще и надёжнее.
Пример вывода
Два описания задают один каталог с разными правами. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd-tmpfiles[640]: /usr/lib/tmpfiles.d/myapp.conf:1: Duplicate line for path "/run/myapp", ignoring.
systemd-tmpfiles[640]: Failed to create directory or subvolume "/var/lib/myapp/data": No such file or directory
systemd[1]: systemd-tmpfiles-setup.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- status=238/STATE_DIRECTORY в systemd Код 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Failed with result 'exec-condition' и condition failed Состояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
Источники
-
tmpfiles.d(5)
Описания подготовки каталогов и приоритет файлов. -
systemd-tmpfiles(8)
Прогон без изменений и просмотр итогового набора. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено двумя описаниями на один путь и владельцем, которого нет.