Unit … has no installation config: не включается автозапуск
Сообщение «The unit files have no installation config (WantedBy=, RequiredBy=, Also=, Alias= settings in the [Install] section)» значит, что systemd не знает, куда поставить ссылку автозапуска. Служба работает при ручном запуске, но после перезагрузки не поднимается.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В unit-файле нет секции [Install]
Именно она говорит, в какую цель включать службу. Без неё команда включения не имеет смысла, и systemd честно об этом сообщает.
-
WantedBy=указан, но в секции [Unit]В [Unit] этот параметр не применяется: systemd отбросит его как незнакомый, и секция [Install] окажется фактически пустой.
-
Служба запускается сокетом или таймером, и включать надо их
Для сокет-активации в автозапуск ставится
.socket, для расписания —.timer. Сама служба при этом секции [Install] не имеет — и это правильно. -
Unit шаблонный, и включать нужно экземпляр
Файл вида
myapp@.serviceсам по себе не включается: у него нет конкретного экземпляра. Нужно имя с частью после символа @.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает действующее описание: сразу видно, есть ли [Install] и что в ней.
systemctl cat myapp.serviceПечатает состояние одним словом: static означает отсутствие секции [Install].
systemctl is-enabled myapp.serviceПоказывает рядом службу, сокет и таймер — помогает понять, что именно включать.
systemctl list-unit-files "myapp*"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Именно она говорит, в какую цель включать службу. Без неё команда включения не имеет смысла, и systemd честно об этом сообщает.
- Как проверить
-
Посмотрите файл целиком.
systemctl cat myapp.service
- Как исправить
-
Добавьте секцию с указанием цели и включите службу заново.
[Install] WantedBy=multi-user.target
WantedBy= указан, но в секции [Unit]- Почему происходит
- В [Unit] этот параметр не применяется: systemd отбросит его как незнакомый, и секция [Install] окажется фактически пустой.
- Как проверить
-
Посмотрите, в какой секции стоит параметр.
systemctl cat myapp.service | grep -n -A2 -B2 WantedBy
- Как исправить
-
Перенесите
WantedBy=в секцию [Install], выполните перезагрузку конфигурации и включите службу.
- Почему происходит
- Для сокет-активации в автозапуск ставится
.socket, для расписания —.timer. Сама служба при этом секции [Install] не имеет — и это правильно.
- Как проверить
-
Посмотрите, есть ли рядом сокет или таймер.
systemctl list-unit-files "myapp*"
- Как исправить
-
Включайте нужный unit:
systemctl enable --now myapp.timerилиmyapp.socket. Служба будет запускаться по их сигналу.
- Почему происходит
- Файл вида
myapp@.serviceсам по себе не включается: у него нет конкретного экземпляра. Нужно имя с частью после символа @.
- Как проверить
-
Посмотрите имя файла.
ls -l /etc/systemd/system/ | grep myapp
- Как исправить
-
Включите конкретный экземпляр:
systemctl enable --now myapp@prod.service. Для шаблона можно задатьDefaultInstance=в секции [Install].
Пример вывода
Попытка включить службу без секции [Install]. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl enable myapp.service
The unit files have no installation config (WantedBy=, RequiredBy=, Also=, Alias=
settings in the [Install] section, and DefaultInstance= for template units).
This means they are not meant to be enabled using systemctl.
Связанные ошибки
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Таймер не работает после перезагрузки Таймер работал, пока его запускали вручную, но после перезагрузки не активен: не выполнено включение или нет WantedBy=timers.target.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Service has more than one ExecStart= setting Несколько команд запуска допустимы только при Type=oneshot. Как правильно заменить команду в переопределении.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
Источники
-
systemd.unit(5)
Секция [Install]: WantedBy=, RequiredBy=, Also=, Alias=, DefaultInstance=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit без [Install] и на шаблонном unit без экземпляра.