Unit is masked: служба запрещена к запуску
Маскировка — это самый жёсткий способ запретить службу: её unit-файл подменяется ссылкой на /dev/null, и запустить её нельзя ни вручную, ни по зависимости. Сообщение Unit is masked означает именно это состояние, а не обычное отключение.
Что это значит
Отличие от отключения важно. Отключённая служба (disable) не запускается сама, но её можно запустить руками и она поднимется по зависимости. Замаскированная (mask) не запустится ни при каких условиях, и попытки дают ошибку.
Маскировку часто ставят установщики пакетов и средства управления конфигурацией, а потом о ней забывают. Поэтому при непонятном отказе запуска её стоит проверять одной из первых.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Службу замаскировали вручную и забыли
Команду
systemctl maskприменяют, чтобы точно исключить запуск на время работ. Через месяц причина забывается, а запрет остаётся. -
Маскировку поставил пакет или средство управления конфигурацией
Некоторые пакеты маскируют конкурирующие службы (например apache при установке nginx). Ansible и подобные средства делают это по описанию состояния.
-
Замаскирована зависимость, а не сама служба
Тогда сообщение относится к другому unit, и ваша служба не запускается по цепочке. В журнале это видно как неудача зависимости.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Полный список замаскированных unit на машине — обычно в нём и находится ответ.
systemctl list-unit-files --state=masked --no-pagerПечатает «masked» одним словом, без разбора вывода status.
systemctl is-enabled myapp.serviceПоказывает ссылку на /dev/null — это и есть маскировка.
ls -l /etc/systemd/system/myapp.serviceРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Команду
systemctl maskприменяют, чтобы точно исключить запуск на время работ. Через месяц причина забывается, а запрет остаётся.
- Как проверить
-
Посмотрите состояние unit-файла.
systemctl is-enabled myapp.service systemctl list-unit-files | grep myapp
- Как исправить
-
Снимите маскировку и включите службу заново.
sudo systemctl unmask myapp.service && sudo systemctl enable --now myapp.service
- Почему происходит
- Некоторые пакеты маскируют конкурирующие службы (например apache при установке nginx). Ansible и подобные средства делают это по описанию состояния.
- Как проверить
-
Найдите ссылку маскировки и посмотрите её время создания.
ls -l /etc/systemd/system/myapp.service /run/systemd/system/myapp.service 2>/dev/null
- Как исправить
- Если маскировка не нужна — снимите её. Если её ставит средство управления конфигурацией, правьте описание состояния, иначе она вернётся при следующем прогоне.
- Почему происходит
- Тогда сообщение относится к другому unit, и ваша служба не запускается по цепочке. В журнале это видно как неудача зависимости.
- Как проверить
-
Посмотрите состояния всех зависимостей.
systemctl list-dependencies myapp.service --no-pager | head -20 systemctl list-unit-files --state=masked --no-pager
- Как исправить
- Снимите маскировку с нужной зависимости. Список всех замаскированных unit показывает вторая команда.
Пример вывода
Попытка запустить замаскированную службу. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl start apache2.service
Failed to start apache2.service: Unit apache2.service is masked.
$ ls -l /etc/systemd/system/apache2.service
lrwxrwxrwx 1 root root 9 Sep 10 11:20 /etc/systemd/system/apache2.service -> /dev/null
Связанные ошибки
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Operation refused, unit may be requested by dependency only systemd отказывается запускать unit вручную из-за RefuseManualStart=yes. Что это значит и как запустить службу правильно.
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- 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-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
Где встречается чаще всего
Источники
-
systemctl(1)
Команды mask, unmask и отличие от disable. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на службе apache2, замаскированной вручную.