Сегодня я хотел увеличить размер виртуальной машины, поэтому сделал то, что делал всегда (делал это раньше):
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 на этом диске.