Breaking ordering cycle deleting job sysinit.target — Сбой загрузки
Архитектура ошибки и симптомы сбоя
Сообщение «systemd[1]: Breaking ordering cycle by deleting job sysinit.target/start to avoid deadlock» указывает на критическую аварию механизма разрешения зависимостей. sysinit.target отвечает за базовую инициализацию ОС: монтирование виртуальных ФС (/proc, /sys), криптографию, генераторы случайных чисел и udev. Когда пользовательский сервис ошибочно объявляет себя предшественником низкоуровневых служб, systemd удаляет задачу sysinit.target, оставляя хост в полуинициализированном состоянии без сети, сокетов и логов.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| sysinit.target | System Initialization Target | Фундаментальная фаза загрузки Linux, предшествующая всем службам пользователя. |
| Deadlock Avoidance | Job Eviction | Аварийная мера: удаление ключевого таргета ради предотвращения вечного зависания ядра. |
| Consequence | Missing Devices / Sockets | Сетевые карты, диски и сокеты DBus не инициализируются должным образом. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Быстрый поиск виновника цикла в системных логах
# Вывод точной цепочки юнитов, вызвавших петлю вокруг sysinit.target:
sudo journalctl -b | grep -B 5 -A 5 "Breaking ordering cycle"Сценарий 2: Поиск пользовательских unit-файлов с некорректными After/Before
Найдите кастомные службы, в которых директива Before=sysinit.target конфликтует со стандартными зависимостями:
# Поиск подозрительных зависимостей в /etc/systemd/system/:
grep -rn -E "(sysinit.target|basic.target|local-fs.target)" /etc/systemd/system/Сценарий 3: Исправление unit-файла виновной службы
Если службе действительно нужно запускаться на этапе инициализации системы:
[Unit]
Description=Critical Early System Service
DefaultDependencies=no
After=local-fs.target
Before=sysinit.target
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/early-init.sh
[Install]
WantedBy=sysinit.targetСценарий 4: Верификация чистоты дерева инициализации
# Проверка отсутствия ошибок после редактирования:
sudo systemd-analyze verify sysinit.target
sudo systemctl daemon-reloadITSTM локализует скрытые циклические блокировки в пакетах дистрибутивов и восстановит штатную цепочку sysinit -> basic -> multi-user.
Частые вопросы (FAQ)
Почему systemd удаляет именно sysinit.target, а не сбойную службу?
Математический алгоритм разрыва циклов в systemd выбирает ребро графа с наименьшим числом обратных связей. Из-за архитектурных особенностей графа жертвой часто становится именно sysinit.target или basic.target.
Что произойдет, если sysinit.target будет удален во время бута?
Сервер может загрузить ядро, но не настроит сетевые интерфейсы, не применит параметры sysctl из /etc/sysctl.d, не настроит entropy pool и не запустит D-Bus.
Как безопасно добавить скрипт, исполняемый при старте ОС?
Привязывайте скрипты к multi-user.target (WantedBy=multi-user.target) со стандартными зависимостями After=network.target. Не используйте ранние таргеты без крайней необходимости.
Как посмотреть время загрузки каждого таргета?
Используйте команды systemd-analyze time и systemd-analyze critical-chain.