Removai acidentalmente um arquivo de imagem libvirt, posso recriá-lo?

5

Eu acidentalmente removi o arquivo de imagem errado no meu diretório / var / lib / libvirt / images. Não sei como recriar um ou desfazer minha remoção. Alguma dica?

    
por PolkaRon 21.07.2016 / 23:00

2 respostas

11

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: -)

    
por 22.07.2016 / 00:25
-2

As imagens da libvirt estão localizadas por padrão em /var/lib/libvirt/images

Você precisará encontrar uma maneira de restaurar o arquivo, com alguns softwares undelete. Este post talvez possa ajudá-lo: Unix / Linux recupera / recupera arquivos apagados

    
por 21.07.2016 / 23:34