誤って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: 

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

おすすめ記事