Como reparar uma imagem de disco qcow2 de tamanho reduzido para libvirt / kvm?

4

Hoje eu quis aumentar o tamanho de uma VM, então fiz o que sempre faço (já fiz isso antes):

qemu-img resize diskimage.qcow2 +22GB

Em seguida, o arquivo quebrou e a VM não inicia mais. Tentei inicializar a VM a partir do CD para ajustar o particionamento, mas o sistema não lerá mais o disco:

qemu-img check -r all diskimage.qcow2
tcmalloc: large alloc 389841715200 bytes == (nil) @  0x7fdb4ea66bf3 0x7fdb4ea88488 0x7fdb4e5674a6 0x7fdb50236a37 0x7fdb50236bc8 0x7fdb50237011 0x7fdb5023941e 0x7fdb5023d891 0x7fdb5027848b 0x7fdb5027c196 0x7fdb491efb35 0x7fdb5021ee4d (nil)
No errors were found on the image.

Sem erros? Soa bem, mas virsh start vm não funciona e os logs dizem:

2017-05-21T10:02:30.755824Z qemu-system-x86_64: -drive file=/.../diskimage.qcow2,format=qcow2,if=none,id=drive-virtio-disk0: could not open disk image /.../diskimage.qcow2: qcow2: Image is corrupt; cannot be opened read/write

Eu tentei converter para raw, mas a conversão falha (saída 1):

qemu-img convert -f qcow2 diskimage.qcow2 -O raw diskimage.raw
qcow2: Image is corrupt: L2 table offset 0x2d623039326500 unaligned (L1 index: 0); further non-fatal corruption events will be suppressed
qemu-img: error while reading block status of sector 0: Input/output error

O processo cria um arquivo de byte 354334801920 (muito maior do que deveria ter sido com + 22GB), mas aparentemente é inutilizável - quando tento convertê-lo de volta em qcow2, recebo um arquivo de 200kB.

Existe uma maneira de extrair dados do arquivo qcow2 ou montá-lo de leitura / gravação de alguma forma, mesmo se houver corrupção? Eu não tenho o módulo do kernel nbd na máquina.

    
por Ned64 21.05.2017 / 16:04

2 respostas

3

Você executou o "qemu-img resize diskimage.qcow2 + 22GB" enquanto o processo do QEMU ainda estava sendo executado com o mesmo disco aberto? Se assim for, isso certamente explicaria a corrupção de dados, já que você teria potencialmente dois processos gravando no arquivo qcow2 ao mesmo tempo e se ambas as gravações exigissem alocações de metadados qcow2 que pudessem corromper estruturas de dados de arquivos internos.

O resultado "qemu-img check" parece muito falso. Em particular, tcmalloc está reclamando que não pode alocar um bloco de memória de 360 GB. Parece qemu-img está interpretando mal este erro como sucesso, imprimindo a mensagem falsa "Nenhum erro encontrado". Este é um bug que você deve reportar ao QEMU.

O erro 'convert' parece ser uma continuação do mesmo erro que tcmalloc atingiu.

Infelizmente eu não tenho nenhuma sugestão para consertar o problema - eu estava apenas recomendando "check-r" para tentar consertá-lo. Sua única possibilidade de chance é enviar o qemu-devel e ver se algum dos mantenedores do qcow2 tem sugestões.

    
por 22.05.2017 / 10:45
1

Trate a corrupção do qcow2 como um disco rígido com blocos defeituosos.

Desligue essa VM.

Então faça:

modprobe nbd
qemu-nbd --connect=/dev/nbd0 diskimage.qcow2
ddrescue /dev/nbd0 new_diskimage.raw
qemu-nbd --disconnect /dev/nbd0
qemu-img convert -O qcow2 new_diskimage.raw new_diskimage.qcow2

Agora tente inicializar e orar, com sorte ele irá levá-lo para o modo de recuperação, onde você pode executar o fsck nesse disco.

    
por 06.06.2017 / 18:52