Tenho um dispositivo Linux com vários serviços meus.
Kernel: 4.14.151
systemd
:systemd 249 (249.11-0ubuntu3.12)
Meus serviços são escritos como sysvinit
serviços e gerados automaticamente como systemd
serviços usando o /run/systemd/generator.early
.
Tudo funcionava bem até que eu quis chamar /usr/bin/ssh-keygen -t ed25519 ...
de um dos meus serviços.
Naquele momento, minha chamada para ssh-keygen
é bloqueada até que systemd-random-seed.service
seja feita. Mas não é feita, chega ao tempo limite. Então, toda a inicialização leva muito tempo.
- Entendo
systemd-random-seed.service
que ele é responsável por iniciar o pool de entropia para aleatoriedade, por issossh-keygen
está bloqueado. - Mas, por que eles entram em dead lock? Eu esperaria
systemd-random-seed.service
terminar sem relação comssh-keygen
. - Antes das minhas alterações,
systemd-random-seed.service
demorava cerca de 16 segundos. (Posso ver usandosystemd-analyze blame
esystemd-analyze plot > chain.svg
. - Após minhas alterações, o tempo limite pode chegar a 10 minutos.
- Independentemente da minha mudança. Ou seja, sem adicionar
ssh-keygen
chamada a um dos meus serviços, tentei remover um dos meussysvinit
serviços. Fazer isso tornasystemd-random-seed.service
ainda mais imprevisível - termina após 2-6 minutos. - Meu propósito era reescrever meu
sysvinit
serviço como umsystemd
serviçoAfter=systemd-random-seed.service
, então ele certamente passará.
O ponto principal systemd-random-seed.service
não está claro para mim.
Você pode explicar o comportamento dele? Por que ele não inicia independentemente de ssh-keygen
?
Como posso iniciar outro serviço depois que ele termina?
systemd-random-seed
carrega uma semente de um arquivo/var/lib/systemd/random-seed
, o que é quase instantâneo, a menos que seu sistema de arquivos não esteja montado ou conectado à rede ou esteja muito lento por outros motivos.O arquivo é posteriormente substituído por uma nova semente para ser usada na próxima reinicialização do sistema.
E é aqui que
systemd-random-seed
ele pode travar, porque ele espera que o pool aleatório seja totalmente inicializado antes de gravar uma nova semente.homem 8 systemd-random-seed.service:
Isso geralmente é um problema apenas com kernels mais antigos. Kernels mais novos não bloqueiam mais random graças a uma inicialização e algoritmo de dispositivo random reformulados.
Se não for possível executar uma versão mais recente do kernel, você pode tentar provedores de entropia alternativos como o haveged , talvez ajude.
coloque um "/var/lib/systemd/random-seed" no seu initrd manualmente.
Ou faça alguns ajustes nas ferramentas responsáveis por criar o initrd para adicioná-lo automaticamente.