誤って/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 の取り消し/削除されたファイルの回復