web-dev-qa-db-ja.com

誤ってlibvirtイメージファイルを削除しましたが、再作成できますか?

/ var/lib/libvirt/imagesディレクトリにある誤ったイメージファイルを誤って削除してしまいました。再作成する方法や、削除を元に戻す方法がわかりません。ヒントはありますか?

5
PolkaRon

VMをシャットダウンしていないため、そのイメージファイルを使用するプロセスではファイルが開いたままであり、実際にはまだ削除されていません。プロセスが実行され続ける限り、プロセスを回復できるはずです。

この回答には、testdeleteというkvmイメージがあります。 VMは稼働していますが、ファイルを削除しました。

まず、ファイルを使用してプロセスを見つける必要があります。最も簡単な方法は、lsofを使用することです。

# lsof | grep /var/lib/libvirt/images/testdelete.img
qemu-kvm  29627      qemu    9u      REG                9,0  2147483648     399357 /var/lib/libvirt/images/testdelete.img (deleted)

これは、プロセス29627とファイル記述子9であることを示しています。これを見てみましょう。

# cd /proc/29627/fd
# ls -l 9
lrwx------ 1 qemu qemu 64 Jul 21 18:13 9 -> /var/lib/libvirt/images/testdelete.img (deleted)

ようし。いいぞ。それは一致します。それを回復しましょう!画像全体を保持するのに十分な空き容量のあるディスクが必要です

理想的には、VMは可能な限り静止している必要があります。未加工のディスクイメージをコピーしているため、一部のプロセスがディスクに書き込んでいる場合、破損のリスクがあります。これを最小限に抑えることができます。 STOP信号を送信することによるリスク。

# kill -STOP 29627

これにより、プロセスが効果的に「フリーズ」されます。現在作成しているバックアップは、ハードクラッシュ後に発生するものと同等です。再起動すると、OSはfsck(または同等のもの)で回復します。

これでデータをコピーできます

# dd if=9 of=/home/sweh/recovered.img bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 5.74931 s, 374 MB/s

それは完璧に見えます。ディスクイメージは2Gbで、それがコピーされたものです。

この画像はよく見えますか?

# cd /home/sweh
# sfdisk -l recovered.img 
Disk recovered.img: cannot get geometry

Disk recovered.img: 261 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
recovered.img1          0+     65-     66-    524288   82  Linux swap / Solaris
recovered.img2   *     65+    261-    196-   1571840   83  Linux
recovered.img3          0       -       0          0    0  Empty
recovered.img4          0       -       0          0    0  Empty

うん、それは私のパーティションテーブルのように見えます。この時点で、他のテストを実行して、画像が適切に見えることを確認できます。

以上です!イメージファイルを復元しました。

注:この例では、既存のqemuプロセスを強制終了します。この手順は、ディスクが解放されるため、取り消すことができません。 「並列実行」テストを実行する場合は、新しいイメージファイルを作成し、それを使用するためにvirsh define新しいVM)を作成できます。

VMこれで再起動します。古いVMを破棄し、データファイルを所定の場所にコピーして再起動します。

# virsh destroy testdelete
# cp -v recovered.img /var/lib/libvirt/images/testdelete.img
`recovered.img' -> `/var/lib/libvirt/images/testdelete.img'
# virsh start testdelete
Domain testdelete started

コンソールに接続できますか?

# virsh console testdelete
Connected to domain testdelete
Escape character is ^]

CentOS release 6.8 (Final)
Kernel 2.6.32-642.3.1.el6.x86_64 on an x86_64

dhcp226.spuddy.org login: 

回復完了:-)

13
Stephen Harris