Como você não desligou a VM, o processo que usa esse arquivo de imagem ainda tem o arquivo aberto e ainda não foi realmente excluído. Enquanto o processo continuar em execução, você poderá recuperá-lo.
Para esta resposta eu tenho uma imagem kvm chamada testdelete
. A VM está ativa, mas eu deletei o arquivo.
Primeiro você precisa encontrar o processo usando o arquivo. A maneira mais fácil é com lsof
.
# lsof | grep /var/lib/libvirt/images/testdelete.img
qemu-kvm 29627 qemu 9u REG 9,0 2147483648 399357 /var/lib/libvirt/images/testdelete.img (deleted)
Isso me diz que é o processo 29627 e o descritor de arquivo 9. Vamos dar uma olhada nisso
# cd /proc/29627/fd
# ls -l 9
lrwx------ 1 qemu qemu 64 Jul 21 18:13 9 -> /var/lib/libvirt/images/testdelete.img (deleted)
OK, bom. Que corresponde. Agora vamos recuperá-lo! Você precisa de um disco com espaço livre suficiente para armazenar toda a imagem
Idealmente, sua VM deve ser tão inativa quanto possível; porque estamos copiando a imagem de disco bruta corremos o risco de corrupção se alguns processos estiverem gravando no disco. Podemos tentar minimizar esse risco enviando um sinal STOP.
# kill -STOP 29627
Isso efetivamente "congela" o processo. O backup que estamos fazendo agora seria o equivalente ao que acontece depois de uma falha grave; ao reiniciar o SO, o fsck
(ou equivalente) será recuperado.
Agora podemos copiar os dados
# dd if=9 of=/home/sweh/recovered.img bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 5.74931 s, 374 MB/s
Isso parece perfeito; a imagem do disco tinha 2Gb e foi isso que copiou.
Esta imagem parece boa?
# cd /home/sweh
# sfdisk -l recovered.img
Disk recovered.img: cannot get geometry
Disk recovered.img: 261 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
recovered.img1 0+ 65- 66- 524288 82 Linux swap / Solaris
recovered.img2 * 65+ 261- 196- 1571840 83 Linux
recovered.img3 0 - 0 0 0 Empty
recovered.img4 0 - 0 0 0 Empty
Sim, parece a minha tabela de partições. Neste ponto, você pode fazer outros testes para verificar se a imagem parece boa.
E é isso! Você recuperou seu arquivo de imagem.
NOTA: Neste exemplo, vou matar o processo qemu
existente. Essa etapa é irrevogável porque faz com que o disco seja liberado. Se você quiser fazer um teste de "execução paralela", poderá criar um novo arquivo de imagem e virsh define
uma nova VM para usá-lo.
Vamos fazer com que a VM seja reiniciada com isso. Destrua a VM antiga, copie o arquivo de dados para o local e reinicie-o.
# virsh destroy testdelete
# cp -v recovered.img /var/lib/libvirt/images/testdelete.img
'recovered.img' -> '/var/lib/libvirt/images/testdelete.img'
# virsh start testdelete
Domain testdelete started
Podemos nos conectar ao console?
# virsh console testdelete
Connected to domain testdelete
Escape character is ^]
CentOS release 6.8 (Final)
Kernel 2.6.32-642.3.1.el6.x86_64 on an x86_64
dhcp226.spuddy.org login:
Recuperação completa: -)