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

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

誤って/var/lib/libvirt/imagesディレクトリから無効なイメージファイルを削除しました。再作成または削除をキャンセルする方法がわかりません。どのようなヒントがありますか?

答え1

仮想マシンをシャットダウンしていないため、イメージファイルを使用するプロセスはまだファイルを開いており、ファイルは実際には削除されませんでした。プロセスが継続して実行されている間は、プロセスを再開できます。

この回答にはというkvmイメージがありますtestdelete。仮想マシンが起動しましたが、ファイルを削除しました。

まず、ファイルを使用するプロセスを見つける必要があります。最も簡単な方法はを使用することです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)

わかりました。一致します。今復元してみましょう!イメージ全体を収めるのに十分な空き容量のあるディスクが必要です。

理想的には、仮想マシンはできるだけ静止している必要があります。生のディスクイメージをコピーしているため、一部のプロセスがディスクに書き込むと破損する危険があります。停止信号を送信して、これらのリスクを最小限に抑えるよう努めます。

# kill -STOP 29627

これはプロセスを効果的に「凍結」させる。今実行するバックアップは、重大なクラッシュ後に発生するものと同じであり、再起動後にオペレーティングシステム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それを使用する新しい仮想マシンを作成します。

これを使って仮想マシンを再起動してみましょう。既存の仮想マシンを削除し、データファイルを所定の場所にコピーして再起動します。

# 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: 

復元が完了しました:-)

答え2

libvirt イメージのデフォルト値は次のとおりです。/var/lib/libvirt/images

一部の元に戻すソフトウェアを使用してファイルを回復する方法を見つける必要があります。この文書は、次の点に役立ちます。Unix/Linux の取り消し/削除されたファイルの回復

関連情報