Consegui encontrar uma solução alternativa executando uma "captura instantânea" intermediária e um blockpull nesse instantâneo antes de excluí-lo dos metadados e executar a captura instantânea "real", resultando na volta da imagem de sobreposição e os dados estando na pasta de instantâneos. Isso é um pouco trabalhoso e esperamos que haja uma solução nativa melhor no futuro, no entanto, eu detalhei os passos abaixo, se você gosta de mim, não pode esperar.
Etapas
Primeiro defina suas configurações adequadamente:
# Your settings may vary
DOMAIN="guest1"
SNAPSHOT_NAME="base-installation"
VMS_DIR="/vms"
Agora, criamos o diretório em que armazenaremos os dados do instantâneo.
mkdir -p $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME
Agora, criamos nosso instantâneo intermediário, que criará uma imagem de superposição no diretório de instantâneos que acabamos de criar.
virsh snapshot-create-as \
--domain $DOMAIN intermediary_snapshot \
--diskspec vda,file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2,snapshot=external \
--memspec file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \
--atomic
Observação: tive ping em execução na VM e pareceu pausar por apenas um segundo quando esse comando foi executado.
Agora usamos blockpull para mover os dados do arquivo de apoio para a imagem de sobreposição ativa no diretório de snapshots.
virsh blockpull \
--domain $DOMAIN \
--path $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2 \
--wait \
--verbose
Nota: você deve não fornecer o argumento --base
para esse comando, caso contrário você não fará nada porque se você especificar --base
, o comando deixará o comando especificado base como o diretório base e só irá mesclar as camadas intermediárias (que não temos nenhum) e não o próprio diretório base.
O comando anterior demorou cerca de 30 segundos, mas o vm estava felizmente executando ping durante esse tempo.
ls -alh
mostra que a imagem disk.qcow2
do diretório de instantâneos agora é de 2,2 GB, mas o mais importante é que qemu-img info disk.qcow2
não mostra nenhum arquivo de backup agora, por isso sabemos que todos os dados estão no diretório de instantâneos é uma "imagem autônoma".
Agora, limpamos os metadados removendo o conhecimento dessa etapa de instantâneos intermediários.
virsh snapshot-delete \
--domain $DOMAIN \
intermediary_snapshot \
--metadata
Agora também removemos o arquivo de apoio original de que não precisamos mais, bem como o arquivo memspec intermediário que nunca usaremos.
rm $VMS_DIR/$DOMAIN/disk.qcow2
rm $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem
Neste ponto, testei o encerramento e, em seguida, iniciei manualmente a instância para verificar se estava tudo feliz e tudo funciona.
Neste ponto, você pode pensar em ter terminado toda a "preparação" agora simplesmente tiramos o instantâneo, mas estamos especificando que a imagem de superposição está no diretório $ DOMAIN de nível superior, e o arquivo memspec entra na pasta instantânea ao lado imagem de disco.
virsh snapshot-create-as \
--domain $DOMAIN $SNAPSHOT_NAME \
--diskspec vda,file=$VMS_DIR/$DOMAIN/disk.qcow2,snapshot=external \
--memspec file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \
--atomic
É isso!
Impacto de armazenamento
É importante notar que, se você continuasse repetindo as etapas acima para fazer muitos snapshots, acabaria com snapshots totalmente restauráveis que não dependem de nenhum outro arquivo em cada pasta de snapshots, mas isso desperdiçará muitos espaço. Para capturas instantâneas subseqüentes, você provavelmente desejaria alterar o comando blockpull
com o argumento --base
, para que cada captura instantânea use a captura instantânea anterior como uma imagem de apoio e não a mescle.
Restaurando o instantâneo
Se você executar uma lista de instantâneos, verá seu novo instantâneo. No entanto, você não poderá executar o comando virsh snapshot-revert
, já que reverter instantâneos externos ainda não é suportado (pelo menos não no ubuntu 16.04 que estou usando), portanto, precisamos fazer isso manualmente destruindo a imagem de sobreposição ativa atual. ..
rm $VMS_DIR/$DOMAIN/disk.qcow2
Em seguida, crie uma nova imagem de sobreposição a partir da imagem base do instantâneo que desejamos restaurar:
qemu-img create \
-b $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2 \
-f qcow2 \
$VMS_DIR/$DOMAIN/disk.qcow2
Agora você pode simplesmente iniciar o convidado.
sudo virsh start $DOMAIN
Eu ainda não descobri como usar os arquivos memspec, infelizmente, e é a maior coisa que falta nesta resposta.
Referências
Ao tentar descobrir tudo isso, havia um ótimo post fedorapeople.org que explica como mesclar instantâneos externos que achei mais úteis.