web-dev-qa-db-ja.com

libvirt / kvmのサイズ変更されたqcow2ディスクイメージを修復する方法

今日、私は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

私は生に変換しようとしましたが、変換は失敗します(出口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バイトのファイル(+ 22GBの場合よりもはるかに大きい)を作成しますが、明らかに使用できません。それをqcow2に変換しようとすると、200kBファイルが表示されます。

Qcow2ファイルからデータを抽出する方法、または破損している場合でも何らかの方法で読み取り/書き込みでマウントする方法はありますか?マシンにnbdカーネルモジュールがありません。

6
Ned64

QEMUプロセスが同じディスクを開いたまま実行されているときに、「qemu-img resize diskimage.qcow2 + 22GB」を実行しましたか?その場合、2つのプロセスが同時にqcow2ファイルに書き込む可能性があり、両方が内部ファイルのデータ構造を破損する可能性のあるqcow2メタデータ割り当てを書き込む場合、データの破損を確実に説明します。

「qemu-imgチェック」の結果は非常に偽に見えます。特にtcmallocは、360 GBのメモリブロックを割り当てることができないと不満を言っています。 qemu-imgがこのエラーを成功と誤って解釈し、「エラーが見つかりません」という偽のメッセージを出力しているようです。これは間違いなくQEMUに報告すべきバグです。

「変換」エラーは、tcmallocがヒットしたのと同じエラーのフォローアップのようです。

残念ながら、この問題を解決するための提案はありません。「check -r」を実行して問題を修正することをお勧めします。残っている可能性が最も高いのは、qemu-develにメールを送り、qcow2メンテナのいずれかが提案を持っているかどうかを確認することです。

3
DanielB

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を実行できます。

1
Danila Ladner