Вопрос или проблема
У меня есть устройство на Linux с несколькими собственными службами.
Ядро: 4.14.151
systemd
: systemd 249 (249.11-0ubuntu3.12)
Мои службы написаны как службы sysvinit
и автоматически генерируются как службы systemd
с использованием /run/systemd/generator.early
.
Все работало хорошо, пока я не захотел вызвать /usr/bin/ssh-keygen -t ed25519 ...
из одной из моих служб.
В этот момент мой вызов ssh-keygen
блокируется, пока не завершится systemd-random-seed.service
. Но он не завершен, он ждет завершения. Так что вся загрузка занимает много времени.
- Я понимаю, что
systemd-random-seed.service
отвечает за запуск пула энтропии для генерации случайных данных, поэтомуssh-keygen
блокируется. - Но почему возникает дедлок? Я ожидал бы, что
systemd-random-seed.service
завершится независимо отssh-keygen
. - До моих изменений
systemd-random-seed.service
занимал ~16 секунд. (Я могу это видеть с помощьюsystemd-analyze blame
иsystemd-analyze plot > chain.svg
.) - После моих изменений это может занять до 10 минут тайм-аута.
- Независимо от моего изменения. То есть без добавления вызова
ssh-keygen
в одну из моих служб, я пытался удалить одну из моих службsysvinit
. После этогоsystemd-random-seed.service
становится еще более непредсказуемым – он завершает работу через 2-6 минут. - Моя цель была переписать мою службу
sysvinit
как службуsystemd
After=systemd-random-seed.service
, чтобы она точно прошла.
В итоге systemd-random-seed.service
не ясен для меня.
Не могли бы вы объяснить его поведение? Почему он не запускается независимо от ssh-keygen
?
Как я могу запустить другую службу после его завершения?
systemd-random-seed
загружает семя из файла /var/lib/systemd/random-seed
, что занимает почти мгновенно, если ваша файловая система не смонтирована, не подключена к сети или действительно медленная по другим причинам.
Файл затем перезаписывается новым семенем, которое будет использоваться при следующей перезагрузке системы.
И вот где systemd-random-seed
может зависнуть, потому что он ждет полного инициализации случайного пула перед записью нового семени.
man 8 systemd-random-seed.service:
Это новое семя извлекается синхронно из ядра, что означает, что служба не завершит запуск, пока пул случайных данных не будет полностью инициализирован. На системах с дефицитом энтропии это может занять некоторое время.
Обычно это проблема только старых ядер. Благодаря обновленной инициализации и алгоритму случайного устройства, новые ядра больше не блокируют случайные данные.
Если невозможно использовать более новую версию ядра, вы можете попробовать альтернативные источники энтропии, такие как haveged, возможно, это поможет.
.
Ответ или решение
Ваша ситуация с затруднительным запуском systemd-random-seed.service
свидетельствует о более глубокой проблеме с нехваткой энтропии в системе на вашем устройстве. Эта проблема может быть связана как с характеристиками используемого оборудования, так и с конкретной версией ядра Linux и конфигурацией вашего окружения.
Теория: systemd-random-seed.service
отвечает за загрузку случайного стартового семени из файла /var/lib/systemd/random-seed
во время загрузки системы, чтобы инициировать пул энтропии для генерации случайных чисел. Это важно для криптографических операций, таких как создание ключей SSH с помощью ssh-keygen
, которые требуют высокого уровня случайности. После этого сервиса происходит запись нового семени, чтобы оно было готово для следующей перезагрузки.
На старых и неадаптированных к новым стандартам системах, как ваша с ядром 4.14.151, может возникать проблема с нехваткой начальной энтропии. Это ведет к тому, что systemd-random-seed.service
ждет инициализации пула случайных чисел, что может занять значительное время на маломощных или виртуализированных системах.
Пример: на вашем устройстве задержка увеличивается из-за вызова ssh-keygen
, который ожидает, пока пул случайных чисел полностью инициализируется. Поэтому, когда вы пытаетесь сгенерировать ключи SSH в своих сервисах до завершения работы systemd-random-seed.service
, это приводит к блокировке.
Применение: Для решения этой проблемы необходимо принять меры по улучшению генерации и доступа к энтропии на вашей системе:
-
Обновление ядра: Если возможно, обновите ядро до более новой версии. Последние версии ядра Linux включают улучшенные механизмы работы с случайными числами, устраняющие блокировку рандомизации, которая происходит в предыдущих версиях ядра.
-
Установка дополнительных энтропийных демонов: Используйте утилиты, такие как
haveged
илиrng-tools
, которые генерируют дополнительные случайные числа, что особенно полезно на виртуализированных или оборудованных слабой аппаратной поддержкой генерации случайности системах. Эти утилиты могут существенно помочь ускорить процесс инициализации пула случайности. -
Изменение порядка загрузки сервиса: Перепишите ваши
sysvinit
скрипты в видеsystemd
юнитов с параметромAfter=systemd-random-seed.service
, чтобы гарантировать, что ваши криптографические операции запускаются только после завершения инициализации пула случайных чисел. -
Анализ производительности: Используйте
systemd-analyze blame
иsystemd-analyze plot
для более глубокого анализа времени загрузки и определения, какие еще сервисы могут вызывать задержку. Это поможет выявить узкие места и потенциальные блокировки. -
Конфигурация системы: Проверьте, не подключены ли у вас замедляющие процесс файловые системы или сетевые точки монтирования, которые могут влиять на скорость загрузки семени.
В заключение, учитывая ограничения существующей конфигурации инфраструктуры и системного окружения, важно системно оценивать и адаптировать систему к современным требованиям генерации случайности, чтобы исключить задержки, препятствующие бесперебойной работе ваших сервисов.