ファイルを操作ミスで削除してしまうってことは誰しも経験したことではないでしょうか。
バックアップは・・・取ってない、バージョン管理にも登録していない・・・みたいなときには絶望に打ちひしがれる状況になるのですが、extundelete というプログラムを使えばもしかしたら簡単に復活できるかもしれません。
ただし、このプログラムで復活できるはファイルシステムがext3かext4の場合のみです。
extundeleteの使い方
まずはインストール方法ですが、上記のサイトからソースコードをダウンロードし、サーバーに配置します。
あとは、展開してお決まりの手順でインストールができます。
$ tar -jxvf extundelete-0.2.0.tar.bz2 $ cd extundelete-0.2.0 $ ./configure $ make $ su - # make install
インストール完了後は、extundeleteというコマンドが利用可能になっています。
$ which extundelete /usr/local/bin/extundelete
次に、実際にファイルを削除(/tmp/hoge/foo.txt)して復活させてみます。
削除をする前に、復活させたいファイルがどのデバイス上にあるかを確認しておきます。
ちなみにNFSなど外部N/W上にあるファイルは復旧できません。
$ df -k Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/hda2 18222732 3569768 13712360 21% / /dev/hda1 101086 36590 59277 39% /boot tmpfs 254896 0 254896 0% /dev/shm
今回の復旧対象ファイルは/上にあるので、デバイスは「/dev/hda2」が対象となります。
あとは、以下のコマンドオプションを利用して復旧させます。
なお、extundeleteコマンドはrootで実行します。
$ su - # extundelete --restore-file /tmp/hoge/foo.txt /dev/hda2 WARNING: Extended attributes are not restored. WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set. The partition should be unmounted to undelete any files without further data loss. If the partition is not currently mounted, this message indicates it was improperly unmounted, and you should run fsck before continuing. If you decide to continue, extundelete may overwrite some of the deleted files and make recovering those files impossible. You should unmount the file system and check it with fsck before using extundelete. Would you like to continue? (y/n) y Loading filesystem metadata ... 144 groups loaded. Loading journal descriptors ... 28325 descriptors loaded. Writing output to directory RECOVERED_FILES/ Restored inode 2777124 to file RECOVERED_FILES/tmp/hoge/foo.txt
コマンド実行後は、カレントディレクトリ以下にRECOVERED_FILESというディレクトリが作成され、それ以下に対象のファイルのパスのままで復旧ファイルがリストアされます。
# ls -la RECOVERED_FILES/tmp/hoge/foo.txt -rw-r--r-- 1 root root 1552 5月 13 01:04 RECOVERED_FILES/tmp/hoge/foo.txt
ちなみに、root以外で実行してみると以下のようにエラーメッセージが返されます。
$ extundelete --restore-file /tmp/hoge/foo.txt /dev/hda2 extundelete: failed to read-only open device "/dev/hda2": Error code 13
また、上記の復旧方法では--restore-fileオプションを使って特定のファイルを復旧する方法ですが、--restore-allオプションを使えば、そのデバイス上で削除されたファイルの中で、リストア可能なものを全てリストアしてくれます。
# extundelete --restore-all /dev/hda2
ただし、これはシステムが削除したファイルなども含まれるため、非常に多くのファイルが含まれます。
また、ファイル名が不明なものも出てくる可能性があります。
# ls RECOVERED_FILES/ etc file.230284 file.230299 file.327869 file.4607274 file.851050 file.163419 file.230285 file.230300 file.328148 file.4607277 file.980163 file.2063908 file.230286 file.261526 file.328343 file.4608269 file.980165 file.2063940 file.230287 file.261540 file.328349 file.490332 file.980170 file.230273 file.230288 file.261587 file.328369 file.523022 file.98558 file.230274 file.230289 file.261596 file.360942 file.65736 file.99392 file.230275 file.230290 file.261601 file.360943 file.719952 lib file.230276 file.230291 file.264709 file.362035 file.849519 lost+found file.230277 file.230292 file.264731 file.36522 file.849532 sbin file.230278 file.230293 file.2777123 file.36525 file.849721 tmp file.230279 file.230294 file.2777124 file.4149535 file.849722 usr file.230280 file.230295 file.2777130 file.424814 file.850334 var file.230281 file.230296 file.326729 file.457441 file.850398 file.230282 file.230297 file.326739 file.4576487 file.850851 file.230283 file.230298 file.326774 file.4586985 file.850855
この中から対象ディレクトリのパスを絞って、復活したいファイルを探していく必要がでてきます。
--afterや--beforeオプションを組み合わせて使えば、復旧したい時間が指定できる(Unjx時間形式で指定)ので、削除してしまった大体の日時を指定することでリストアするファイルの量を減らすことや絞り込むことができます。
# extundelete --restore-all --after `date -d "2012/05/13 00:00" +%s` /dev/hda2
おそらく、ファイルを復旧する際の正しいやり方としては、レスキューCDなどからデバイスをReadOnlyな状態でマウントし、そこからextundeleteコマンドを使ってリストアさせるのだと思います。
ファイルのI/Oが激しいデバイス上のファイルの場合は、気が付いた頃には手遅れということもあるかもしれません。
コマンド自体は簡単に使えるためサーバーに用意しておき、まずはやってみるということで準備しておいて損はないかと思います。
関連記事
cpコマンドでファイルをバックアップする時に使える便利なオプション
ftpやscp不要でターミナルエミュレータを通してファイル転送ができるlrzszパッケージ
[お名前.com] サービスを構築するまでに行ったサーバー設定作業もろもろ
BOM付きUTF-8のPHPファイルからBOMだけを一度に削除するスクリプト
Webページをコマンドラインから一発でPDFや画像に変換する
inotifyを使ってファイルやディレクトリに起きたイベントを簡単に監視する
不要なファイルやディレクトリを削除できる「tmpwatch」コマンド