Система загружается слишком долго
Долгая загрузка почти всегда объясняется двумя-тремя unit. Найти их можно точно, а не на глаз: systemd измеряет время каждого и умеет показать цепочку, которая определила общий результат.
Что это значит
Важно различать два показателя. Команда blame показывает, сколько запускался каждый unit — но долгий запуск в стороне от основной цепочки общее время не увеличивает. Команда critical-chain показывает именно цепочку ожиданий, и работать надо с ней.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба ожидания сети ждёт таймаут
Самая частая причина ровных задержек в десятки секунд: сеть не поднимается, а служба ждёт.
-
Ожидание устройства или раздела
Отсутствующий диск из fstab добавляет к загрузке минуты.
-
Медленная служба в критической цепочке
Служба, от которой зависят другие, задерживает всю загрузку на своё время запуска.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Общее время загрузки с разбивкой на ядро и пользовательское пространство.
systemd-analyzeСамые долгие unit.
systemd-analyze blame | head -15Цепочка, определившая общее время.
systemd-analyze critical-chainНаглядная схема загрузки: полезна, когда цепочка сложная.
systemd-analyze plot > /tmp/boot.svgРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Самая частая причина ровных задержек в десятки секунд: сеть не поднимается, а служба ждёт.
- Как проверить
-
Посмотрите время запуска служб ожидания.
systemd-analyze blame | grep -i wait-online systemctl status systemd-networkd-wait-online --no-pager | head -8
- Как исправить
- Настройте сеть или ограничьте ожидание конкретным интерфейсом и таймаутом. Отключать службу ожидания стоит только если ни одна служба не требует готовой сети.
- Почему происходит
- Отсутствующий диск из fstab добавляет к загрузке минуты.
- Как проверить
-
Посмотрите время монтирований.
systemd-analyze blame | grep -i mount | head sudo findmnt --verify --verbose
- Как исправить
-
Добавьте
nofailиx-systemd.device-timeout=необязательным разделам.
- Почему происходит
- Служба, от которой зависят другие, задерживает всю загрузку на своё время запуска.
- Как проверить
-
Посмотрите критическую цепочку.
systemd-analyze critical-chain systemd-analyze blame | head -10
- Как исправить
-
Ускорьте службу или уберите её из критического пути: часто достаточно заменить
Requires=наWants=и не держать очередь.
Пример вывода
Основное время съела служба ожидания сети. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemd-analyze
Startup finished in 4.512s (kernel) + 1min 32.104s (userspace) = 1min 36.616s
$ systemd-analyze blame | head -4
1min 30.002s systemd-networkd-wait-online.service
1.402s snapd.service
0.884s systemd-udev-settle.service
Связанные ошибки
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Цель не достигнута: служба ждёт target, который не наступает Служба не запускается, потому что не достигнута цель из After= или Requires=. Разбор целей multi-user, network-online, graphical.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Failed to start … — что делать с общим сообщением Строка Failed to start сообщает только факт. Порядок разбора: найти настоящую причину выше по журналу.
- Failed with result 'exec-condition' и condition failed Состояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
Источники
-
systemd-analyze(1)
Команды blame, critical-chain, plot. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на машине с недоступной сетью: ожидание даёт ровно свой таймаут.