今天我想增加虚拟机的大小,所以我做了我以前做的事情(之前做过):
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。