Transaction for default.target is destructive — Сбой загрузки systemd
Архитектура ошибки и симптомы сбоя
Критическая ошибка менеджера инициализации «Failed to start default target: Transaction for default.target/start is destructive» (или «Transaction contains conflicting jobs») возникает при загрузке Linux или смене таргет-юнита (systemctl isolate). Ошибка означает, что транзакционный планировщик systemd Transaction Engine обнаружил неразрешимый циклический конфликт зависимостей (Ordering / Dependency Loop) между юнитами с директивами Requires=, Wants=, Conflicts=, Before=, After=. Для предотвращения повреждения системы systemd аварийно останавливает транзакцию и переводит хост в Emergency Mode.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| default.target | Boot Goal Target | Главная цель загрузки (обычно симлинк на multi-user.target или graphical.target). |
| Destructive Transaction | Dependency Collision | Транзакция требует одновременного запуска и остановки конфликтующих юнитов. |
| Ordering Cycle | A -> B -> A Loop | Кольцевая зависимость между службами: Юнит A должен стартовать до B, а B — до A. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Локализация циклов зависимостей в журнале загрузки
Перезагрузитесь в Emergency Shell или используйте LiveCD для анализа логов:
# Поиск циклов зависимостей systemd в journalctl:
journalctl -b -p err..emerg | grep -i -E "(cycle|destructive|conflicts)"
# Просмотр графической цепочки зависимостей дефолтного таргета:
systemd-analyze verify default.targetСценарий 2: Поиск циклов через systemd-analyze plot / dot
# Анализ циклов порядка запуска (Ordering Cycles):
systemd-analyze dot default.target | grep -E "color=red"
# Проверка валидности всех установленных юнитов:
systemd-analyze verify /etc/systemd/system/*.serviceСценарий 3: Сброс или исправление битого default.target
Если симлинк default.target был поврежден или указывает на несуществующую цель:
# Принудительная установка базового текстового режима загрузки (Multi-User):
sudo systemctl set-default multi-user.target
# Ручная проверка симлинка:
ls -la /etc/systemd/system/default.targetСценарий 4: Загрузка в Rescue Mode через параметры ядра в GRUB
Если сервер не может загрузиться штатно:
- В меню загрузчика GRUB нажмите
eдля редактирования параметров ядра. - Добавьте в конец строки
linux ...параметр:systemd.unit=rescue.target(илиinit=/bin/bash). - Нажмите
Ctrl+Xдля загрузки, затем отключите сбойный сервис:systemctl disable bad_service.
ITSTM выполнит экстренное восстановление загрузки серверов через IPMI KVM, распутывание графов зависимостей systemd и аудит стабильности инициализации.
Частые вопросы (FAQ)
Почему директивы Requires= и Conflicts= вызывают destructive transaction?
Если Unit 1 имеет директиву Requires=Unit2, а Unit 2 содержит Conflicts=Unit1 (или юнит из той же транзакции требует его остановки), транзакционный движок не может удовлетворить оба условия одновременно и отклоняет всю транзакцию.
Чем DefaultDependencies=no может навредить сервису?
Отключение дефолтных зависимостей убирает автоматические привязки к basic.target и sysinit.target. Если юнит не настроит зависимости вручную, он может попытаться стартовать до монтирования /var или инициализации сети, разрушив порядок загрузки.
Как переключить режим загрузки на лету?
Используйте команду: sudo systemctl isolate multi-user.target (для консольного режима) или sudo systemctl isolate graphical.target (для графического).
Что означает директива OnFailure= в юнитах systemd?
Она указывает резервный юнит, который будет запущен systemd в случае, если текущая служба перейдет в состояние failed.