Назад | Перейти на главную страницу

Как восстановить образ диска qcow2 со сломанным размером для libvirt / kvm?

Сегодня я хотел увеличить размер виртуальной машины, поэтому сделал то, что делал всегда (делал это раньше):

qemu-img resize diskimage.qcow2 +22GB

Потом файл сломался и ВМ больше не запускается. Я попытался загрузить виртуальную машину с компакт-диска, чтобы настроить разбиение на разделы, но система больше не будет читать диск:

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.

Ошибок нет? Звучит хорошо, но virsh start vm не работает и в журналах написано:

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

Я попытался преобразовать в raw, но преобразование не удалось (выход 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

Процесс создает файл размером 354334801920 байт (намного больше, чем он должен был быть с + 22 ГБ), но он явно непригоден для использования - когда я пытаюсь преобразовать его обратно в qcow2, я получаю файл размером 200 КБ.

Есть ли способ извлечь данные из файла qcow2 или как-то смонтировать его для чтения-записи, даже если есть повреждения? У меня нет nbd модуль ядра на машине.

Вы запускали qemu-img resize diskimage.qcow2 + 22GB, когда процесс QEMU все еще работал с тем же открытым диском? Если это так, это, безусловно, объясняет повреждение данных, поскольку у вас потенциально может быть 2 процесса, записывающих в файл qcow2 одновременно, и если для обеих записей требуется выделение метаданных qcow2, что может повредить внутренние структуры данных файла.

Результат проверки qemu-img выглядит очень надуманным. В частности, tcmalloc жалуется, что не может выделить блок памяти на 360 ГБ. Похоже, qemu-img неверно интерпретирует эту ошибку как успешную, выводя фальшивое сообщение «Ошибок не обнаружено». Об этой ошибке обязательно следует сообщить в QEMU.

Ошибка «convert» выглядит как продолжение той же ошибки, что и tcmalloc.

К сожалению, у меня нет предложений по устранению проблемы - я просто собирался порекомендовать "check -r", чтобы попытаться исправить это. Ваш единственный вероятный оставшийся шанс - отправить qemu-devel по электронной почте и посмотреть, есть ли у кого-нибудь из сопровождающих qcow2 предложения.

Относитесь к повреждению qcow2 как к жесткому диску с плохими блоками.

Выключите эту виртуальную машину.

Затем сделайте:

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

Теперь попробуйте загрузиться и помолитесь, надеюсь, это приведет вас в режим восстановления, где вы сможете запустить fsck на этом диске.