KVM - instantâneos externos ao vivo e nomes de discos apropriados

4

Se eu quiser tirar um instantâneo externo de um guest KVM em execução, eu executaria um comando como abaixo:

# create the directory for the snapshot data
mkdir /vms/$DOMAIN/snapshots/$SNAPSHOT_NAME

# create the snapshot
virsh snapshot-create-as \
--domain $DOMAIN $SNAPSHOT_NAME \
--diskspec vda,file=/vms/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2,snapshot=external \
--memspec file=/vms/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \
--atomic

Se minha VM fosse chamada de vm1 e meu instantâneo fosse chamado de base-installation para obter um instantâneo logo após uma nova instalação, talvez eu tivesse uma estrutura de pastas assim:

/
|- vms/
   |- vm1/
      |- disk.qcow2
      |- snapshots/
           |-base-installation/
               |-disk.qcow2
               |-mem

Agora, essa estrutura é o que eu quero que pareça, mas infelizmente os arquivos disk.qcow2 estão incorretos (precisam ser trocados). O arquivo disk.qcow2 na pasta de instantâneos base-installation é, na verdade, a imagem de disco de sobreposição que usa todas as gravações futuras na VM, em vez de ser o arquivo de backup somente leitura que representa o estado do disco no momento em que o instantâneo foi tirado. O arquivo disk.qcow2 diretamente sob a pasta vm1 é o arquivo de backup somente leitura, em vez da última imagem de disco de sobreposição.

Pergunta

Existe uma maneira de alterar o comando virsh snapshot-create-as para que ele armazene o arquivo de backup somente leitura no caminho disk-spec especificado e mantenha o arquivo de disco do ponteiro de sobreposição onde ele já está? Como alternativa, há uma solução alternativa, como "pausar" a VM, trocar os arquivos de disco, atualizar a definição xml do convidado e, em seguida, retomar a VM? Idealmente, não quero ter que desligar o convidado ou causar um período perceptível de inatividade.

    
por Programster 12.03.2017 / 22:05

1 resposta

1

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.

    
por 14.03.2017 / 00:54