如何修复libvirt / kvm的碎大小的qcow2磁盘映像?

今天我想增加虚拟机的大小,所以我做了我以前做的事情(之前做过):

qemu-img resize diskimage.qcow2 +22GB 

然后文件破坏,虚拟机无法启动。 我尝试从CD启动虚拟机来调整分区,但系统不会再读取磁盘:

 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 

我试图转换为原始的,但转换失败(退出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 

这个过程创build了一个354334801920字节文件(比+ 22GB要大得多),但显然不可用 – 当我尝试将其转换回qcow2时,我得到一个200kB的文件。

有没有办法从qcow2文件中提取数据,或者以某种方式挂载它,即使存在损坏? 我在机器上没有nbd内核模块。

你运行“qemu-img resize diskimage.qcow2 + 22GB”时,QEMU进程仍在运行,同一个磁盘打开吗? 如果是这样,这肯定会解释数据损坏,因为您可能有两个进程同时写入qcow2文件,如果两个写入都需要qcow2元数据分配,可能会损坏内部文件数据结构。

“qemu-img检查”结果看起来非常虚假。 特别是tcmalloc抱怨说,它不能分配一个360 GB的内存块。 它看起来像qemu-img误解成这个错误,打印伪造消息“没有发现错误”。 这是您应该向QEMU报告的错误。

“转换”错误只是看到tcmalloc命中的错误。

不幸的是,我没有任何build议来解决这个问题 – 我只是推荐“check -r”来解决这个问题。 您唯一可能的剩余机会是邮寄qemu-devel,看看是否有任何qcow2维护者有build议。

把qcow2腐败视为坏块的硬盘。

closuresVM。

然后做:

 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。