Linux上でファイルを削除してしまった際にさっくり復活できるextundelete | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

ファイルを操作ミスで削除してしまうってことは誰しも経験したことではないでしょうか。

バックアップは・・・取ってない、バージョン管理にも登録していない・・・みたいなときには絶望に打ちひしがれる状況になるのですが、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が激しいデバイス上のファイルの場合は、気が付いた頃には手遅れということもあるかもしれません。

コマンド自体は簡単に使えるためサーバーに用意しておき、まずはやってみるということで準備しておいて損はないかと思います。