Как восстановить поврежденный образ диска 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 модуль ядра на машине.

2 ответа

Вы запускали "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 на этом диске.

Другие вопросы по тегам