Eu resolvi da seguinte maneira:
Como eu precisava do endereço IP atribuído à VM, e como o libvirt não oferece meios para recuperá-lo (ao contrário de VMWare, que oferece o conjunto de ferramentas VMWare para tais operações), terminei de configurar uma serial ( no guest) para o canal tcp (no host) entre a VM e o Host, usando o suporte a dispositivos virtuais da .
Um script de shell simples no convidado aguarda até que um endereço IP seja atribuído a uma determinada interface e o grave no dispositivo serial. Quando o servidor TCP instalado no host recebe o endereço IP, ele envia de volta a chave pública, que o script no convidado lê (novamente, a partir da porta serial) e grava novamente no arquivo authorized_keys
correto.
Esta solução pode ser usada sem a parte de troca de IP, com apenas o convidado lendo a chave da porta serial na inicialização. As vantagens dessa solução são que o sistema operacional convidado não precisa ser personalizado com uma determinada chave (portanto, diferentes pares de chaves podem ser usados para diferentes "partições" do sistema) e que ele pode gerenciar onde colocá-lo; a desvantagem é que o convidado precisa estar configurado para executar o script.
Outra solução seria montar a imagem do disco antes da inicialização da VM usando algo como libguestfs
, copiar a chave pública, desmontá-la e inicialize o convidado. Essa solução é preferível ao TCP < - > SerialPort, mas como precisei do endereço IP, continuei o contrário.
A terceira solução, como sugerido por ErikA em seu primeiro comentário, seria deixar o usuário criar a imagem fazendo toda a configuração, dando a ela sua chave pública. Esta é provavelmente a melhor (mais limpa e mais elegante) solução para o caso mais genérico.