今天,我想增加VM的大小,所以我做了我一直做的事情(以前做过):
qemu-img resize diskimage.qcow2 +22GB然后文件中断,VM不再启动。我尝试从CD引导VM以调整分区,但系统将不再读取磁盘:
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 get的文件要大得多),但是它显然是不可用的--当我试图将它转换回qcow2时,我得到一个200 it的文件。
是否有一种方法从qcow2文件中提取数据,或者在有损坏的情况下以某种方式挂载它的读写?我在机器上没有nbd内核模块。
发布于 2017-05-22 08:45:14
当QEMU进程仍然在打开相同的磁盘时运行“QEMU调整diskimage.qcow2 +22 was”吗?如果是这样的话,这肯定会解释数据损坏的原因,因为您可能会有两个进程同时写入qcow2文件,如果两种写入都需要可能破坏内部文件数据结构的qcow2元数据分配。
“qemu检查”的结果看起来非常虚假。特别是tcmalloc抱怨它不能分配360 GB的内存块。看起来qemu误解了这个错误为成功,打印了假消息“没有发现错误”。这是一个您肯定应该向QEMU报告的bug。
“转换”错误看起来只是tcmalloc命中的相同错误的后续。
不幸的是,我没有任何解决问题的建议--我只是想推荐"check -r“来解决这个问题。您可能剩下的唯一机会是发送qemu并查看是否有任何qcow2维护人员有建议。
发布于 2017-06-06 16:52:21
将qcow2的腐败处理为带有坏块的硬盘驱动器。
关闭那个VM。
那就做:
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。
https://serverfault.com/questions/851389
复制相似问题