Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Failed to start default target: Transaction for default.target/start is destructive Linux / DevOps

Transaction for default.target is destructive — Сбой загрузки systemd

Обновлено: 18.08.2026  ·  Официальная база знаний

Архитектура ошибки и симптомы сбоя

Критическая ошибка менеджера инициализации «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.targetBoot Goal TargetГлавная цель загрузки (обычно симлинк на multi-user.target или graphical.target).
Destructive TransactionDependency CollisionТранзакция требует одновременного запуска и остановки конфликтующих юнитов.
Ordering CycleA -> 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

Если сервер не может загрузиться штатно:

  1. В меню загрузчика GRUB нажмите e для редактирования параметров ядра.
  2. Добавьте в конец строки linux ... параметр: systemd.unit=rescue.target (или init=/bin/bash).
  3. Нажмите Ctrl+X для загрузки, затем отключите сбойный сервис: systemctl disable bad_service.
Сервер Linux завис на этапе загрузки с ошибкой Transaction Destructive?
ITSTM выполнит экстренное восстановление загрузки серверов через IPMI KVM, распутывание графов зависимостей systemd и аудит стабильности инициализации.
Практический опыт инженера: При разработке собственных systemd-юнитов никогда не комбинируйте Before=local-fs.target с After=network.target — это классическая ошибка создания циклической зависимости, гарантированно подвешивающая загрузку хоста.

Частые вопросы (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.