Deveria "apenas funcionar". Mesmo que o vm não tenha hardware físico dedicado, ele ainda tem acesso a várias fontes muito boas de aleatoriedade. Por exemplo, ele pode usar o TSC da CPU para cronometrar sua leitura de discos virtuais, o que, por fim, levará o tempo dos discos físicos ao bilionésimo de segundo. Esses tempos dependem do cisalhamento do fluxo de ar turbulento no disco rígido, o que é imprevisível.
Lógica semelhante se aplica ao tráfego de rede. Embora a interface seja virtualizada, desde que o pacote tenha origem em uma rede física (e não seja local para a caixa, digamos originando em outra vm), o tempo do pacote depende do deslocamento de fase entre o oscilador de cristal na placa de rede. e o oscilador de cristal que aciona o TSC. Isso depende das variações microscópicas da temperatura da zona nos dois cristais de quartzo. Isso também é imprevisível.
Se, por alguma razão, não estiver funcionando, a solução mais simples é escrever um programa para minerar entropia e adicioná-lo ao pool do sistema. A interface de rede é a sua fonte mais confiável. Por exemplo, você pode escrever código para:
1) Query the TSC.
2) Issue a DNS query to a server known not to be on the same physical machine.
3) Query the TSC when the query completes.
4) Repeat this a few times, accumulating all the TSC values.
5) Perform a secure hash on the accumulated TSC functions.
6) Pass the secure hash function's output to the system's entropy pool.
7) Monitor the entropy pool level, and wait until it's low. When it is, go back to step 1.
O Linux tem chamadas IOCTL simples para adicionar entropia ao pool, verificar o nível do pool e assim por diante. Você provavelmente tem rngd
, que pode receber entropia de um pipe e alimentá-lo no pool do sistema. Você pode preencher o pipe a partir de qualquer fonte que desejar, seja o TSC ou solicitações de 'wget' de sua própria fonte de entropia.