Загрузка задерживается на ожидании случайных чисел
Программы, запрашивающие качественные случайные числа при старте, блокируются до готовности генератора. В виртуальных машинах без источника энтропии это ожидание растягивается на минуты и выглядит как зависание службы при загрузке.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Генератор не инициализирован при старте
До инициализации запросы качественных случайных чисел блокируются. Служба ждёт молча.
-
Нет источника энтропии в виртуальной машине
Без проброшенного источника энтропия набирается медленно, из прерываний.
-
Служба сама запрашивает больше, чем нужно
Часть программ запрашивает качественные случайные числа там, где достаточно обычных. Это их дефект, а не проблема системы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения ядра о готовности генератора.
journalctl -k -b --no-pager | grep -i "random:" | headДоступная энтропия прямо сейчас.
cat /proc/sys/kernel/random/entropy_availКакие службы дольше всего стартуют.
systemd-analyze blame --no-pager | head -10Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- До инициализации запросы качественных случайных чисел блокируются. Служба ждёт молча.
- Как проверить
-
Посмотрите сообщения ядра о генераторе и время загрузки служб.
journalctl -k -b --no-pager | grep -iE "random: crng init|random: .*initialized" | head systemd-analyze blame --no-pager | head -5
- Как исправить
- Добавьте виртуальный источник энтропии от гипервизора. Это штатное решение для виртуальных машин, а не обход.
- Почему происходит
- Без проброшенного источника энтропия набирается медленно, из прерываний.
- Как проверить
-
Определите окружение и наличие источника.
systemd-detect-virt; ls /dev/hwrng 2>/dev/null || echo источника нет
- Как исправить
- Пробросьте источник энтропии в описании виртуальной машины на стороне гипервизора. Для современных ядер этого достаточно.
- Почему происходит
- Часть программ запрашивает качественные случайные числа там, где достаточно обычных. Это их дефект, а не проблема системы.
- Как проверить
-
Посмотрите, на чём висит процесс.
ps -o pid,stat,wchan:24,cmd -C myapp 2>/dev/null cat /proc/sys/kernel/random/entropy_avail
- Как исправить
- Обновите программу или сообщите разработчикам. Внешние обходы вроде подмены источника ослабляют качество случайных чисел и небезопасны.
Пример вывода
Служба ждёт инициализации генератора в виртуальной машине. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: random: crng init done (trusting CPU's manufacturer)
systemd[1]: Still waiting for job myapp.service (running for 1min 12s)
myapp[10200]: generating server key (this may take a while)...
Связанные ошибки
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Job for … failed because a timeout was exceeded Задание на запуск прервано по таймауту. Как отличить медленный старт от заблокированного и правильно настроить TimeoutStartSec.
- Host key verification failed при подключении к серверу Клиент отказывается подключаться: ключ хоста изменился. Когда это переустановка, а когда повод насторожиться.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Failed with result 'exec-condition' и condition failed Состояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Mount process exited, code=exited, status=32: не найдено устройство Монтирование не проходит: устройство или UUID не найдены, неверная файловая система, недоступен сетевой ресурс. Код 32 от команды mount.
Где встречается чаще всего
Источники
- Документация ядра: подсистема случайных чисел
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Наблюдалось на виртуальной машине без проброшенного источника энтропии.