systemd-random-seed.service требует много времени для запуска / превышен таймаут

Вопрос или проблема

У меня есть устройство на 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, это приводит к блокировке.

Применение: Для решения этой проблемы необходимо принять меры по улучшению генерации и доступа к энтропии на вашей системе:

  1. Обновление ядра: Если возможно, обновите ядро до более новой версии. Последние версии ядра Linux включают улучшенные механизмы работы с случайными числами, устраняющие блокировку рандомизации, которая происходит в предыдущих версиях ядра.

  2. Установка дополнительных энтропийных демонов: Используйте утилиты, такие как haveged или rng-tools, которые генерируют дополнительные случайные числа, что особенно полезно на виртуализированных или оборудованных слабой аппаратной поддержкой генерации случайности системах. Эти утилиты могут существенно помочь ускорить процесс инициализации пула случайности.

  3. Изменение порядка загрузки сервиса: Перепишите ваши sysvinit скрипты в виде systemd юнитов с параметром After=systemd-random-seed.service, чтобы гарантировать, что ваши криптографические операции запускаются только после завершения инициализации пула случайных чисел.

  4. Анализ производительности: Используйте systemd-analyze blame и systemd-analyze plot для более глубокого анализа времени загрузки и определения, какие еще сервисы могут вызывать задержку. Это поможет выявить узкие места и потенциальные блокировки.

  5. Конфигурация системы: Проверьте, не подключены ли у вас замедляющие процесс файловые системы или сетевые точки монтирования, которые могут влиять на скорость загрузки семени.

В заключение, учитывая ограничения существующей конфигурации инфраструктуры и системного окружения, важно системно оценивать и адаптировать систему к современным требованиям генерации случайности, чтобы исключить задержки, препятствующие бесперебойной работе ваших сервисов.

Оцените материал
Добавить комментарий

Капча загружается...