web-dev-qa-db-fra.com

Comment réparer une image de disque Qcow2 à redimensionnement brisée pour libvirt / kvm?

Aujourd'hui, je voulais augmenter la taille d'un VM, alors j'ai fait ce que je fais toujours (l'avez fait avant):

qemu-img resize diskimage.qcow2 +22GB

Ensuite, le fichier s'est cassé et le VM ne commence plus. J'ai essayé de démarrer le VM à partir du CD pour régler la partition, mais le système ne lit plus le disque:

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.

Pas d'erreurs? Cela semble bien, mais virsh start vm Ne fonctionne pas et les journaux disent:

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

J'ai essayé de convertir en brut mais la conversion échoue (sortie 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

Le processus crée un fichier d'octet 354334801920 (beaucoup plus grand qu'il aurait dû être avec + 22 Go), mais il est apparemment inutilisable - lorsque j'essaie de le convertir à Qcow2, je reçois un fichier de 200 Ko.

Existe-t-il un moyen d'extraire des données du fichier Qcow2 ou de la monter en lecture-écrire en quelque sorte même s'il y a une corruption? Je n'ai pas le module de noyau nbd sur la machine.

6
Ned64

Avez-vous exécuté le "QEMU-img redisize DiskImage.qcow2 + 22GB" tandis que le processus QEMU était toujours en cours d'exécution avec le même disque ouvert? Si tel est le cas, cela expliquerait certainement la corruption de données, car vous auriez potentiellement 2 processus écrivant au fichier QCow2 en même temps et si les deux écrivaient les allocations de métadonnées Qcow2 requises susceptibles de corrompre les structures de données de fichiers internes.

Le résultat "Qemu-img" semble très faux. En particulier, TCMALLALC se plaint de pouvoir attribuer un bloc de mémoire de 360 ​​Go. Il semble que Qemu-img est mal interprété cette erreur comme succès, imprimant le message faux "Aucune erreur trouvée". Ceci est un bug que vous devriez certainement signaler à QEMU.

L'erreur "Convertir" semble simplement être une suivi de la même erreur que TCMALLALC a frappé.

Malheureusement, je n'ai aucune suggestion pour résoudre le problème - je voudrais simplement recommander "Check -R" pour essayer de le réparer. Votre chance seulement restante est de poser le mail Qemu-Devel et de voir si l'un des responsables QCow2 a des suggestions.

3
DanielB

Traitez la corruption Qcow2 comme un disque dur avec de mauvais blocs.

Arrêt que vm.

Alors fais:

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

Maintenant, essayez de démarrer et priez, espérons-le, il vous sera utile du mode de secours, où vous pouvez exécuter FSCK sur ce disque.

1
Danila Ladner