extundeleteでファイル復旧にチャレンジ![raspberry Pi]

それほど重要なファイルというわけではないのですが、
はずみでrmして、うっかりファイルを消してしまいました。
たまにやってしまいますね 汗
こういうときのためにrmは使わないで、
要らないファイルはどこかにmvしておく形式にしたほうが良い、とは思っているものの
またやってしまいました。

そこで、試しに復旧方法を調べてみると、なかなか良さそうなものがありました。

extundeleteで簡単復旧?!

extundeleteというので簡単に復旧できるそうです。
てなわけで、実行してみたいわけですが、コンパイルしないといけません。
本当は復旧したいディスクはリードオンリーにして使わないことが鉄則ですが、
起動ドライブであるためそうは行かず、
それでも一応USBメモリをさして、そこでコンパイルすることにしました。

 

> wget https://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/download
> tar -zxvf extundelete-0.2.4.tar.bz2
> cd extundelete-0.2.4
> sudo ./configure
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library

ext2fsがないのでインストールします。
(実際はこういうことを復旧したいドライブでやるのはNGです)

$ sudo apt-get install ext2fs-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Note, selecting 'e2fslibs-dev' instead of 'ext2fs-dev'
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  dc libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal
  libheimntlm0-heimdal libhx509-5-heimdal libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal
  libxfce4ui-1-0 xfce-keyboard-shortcuts
これを削除するには 'apt-get autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  comerr-dev e2fslibs e2fsprogs libcomerr2
提案パッケージ:
  doc-base gpart e2fsck-static
以下のパッケージが新たにインストールされます:
  comerr-dev e2fslibs-dev
以下のパッケージはアップグレードされます:
  e2fslibs e2fsprogs libcomerr2
アップグレード: 3 個、新規インストール: 2 個、削除: 0 個、保留: 282 個。
1,190 kB のアーカイブを取得する必要があります。
この操作後に追加で 798 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fslibs armhf 1.42.12-2 [173 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fsprogs armhf 1.42.12-2 [728 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ jessie/main libcomerr2 armhf 1.42.12-2 [59.7 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ jessie/main comerr-dev armhf 2.1-1.42.12-2 [37.6 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fslibs-dev armhf 1.42.12-2 [192 kB]
1,190 kB を 2秒 で取得しました (435 kB/s)
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../e2fslibs_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fslibs:armhf (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
e2fslibs:armhf (1.42.12-2) を設定しています ...
libc-bin (2.19-18+deb8u4) のトリガを処理しています ...
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../e2fsprogs_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fsprogs (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
man-db (2.7.0.2-5) のトリガを処理しています ...
e2fsprogs (1.42.12-2) を設定しています ...
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../libcomerr2_1.42.12-2_armhf.deb を展開する準備をしています ...
libcomerr2:armhf (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
libcomerr2:armhf (1.42.12-2) を設定しています ...
libc-bin (2.19-18+deb8u4) のトリガを処理しています ...
以前に未選択のパッケージ comerr-dev を選択しています。
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../comerr-dev_2.1-1.42.12-2_armhf.deb を展開する準備をしています ...
comerr-dev (2.1-1.42.12-2) を展開しています...
以前に未選択のパッケージ e2fslibs-dev を選択しています。
.../e2fslibs-dev_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fslibs-dev (1.42.12-2) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
install-info (5.2.0.dfsg.1-6) のトリガを処理しています ...
comerr-dev (2.1-1.42.12-2) を設定しています ...
e2fslibs-dev (1.42.12-2) を設定しています ...

リベンジ!
prefixでUSBドライブの中を指定しています。

$ sudo ./configure -prefix=/media/usb0/src/extundelete-0.2.4/src
Configuring extundelete 0.2.4
Writing generated files to disk

成功した・・・?!

$ sudo make
make -s all-recursive
Making all in src
extundelete.cc: In function ‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’:
extundelete.cc:1272:29: warning: narrowing conversion of ‘search_flags’ from ‘int’ to ‘ext2_ino_t {aka unsigned int}’ inside { } [-Wnarrowing]
    buf, match_name2, priv, 0};
                             ^

成功したのでしょうか・・・?

$ sudo make install
Making install in src
  /usr/bin/install -c extundelete '/media/usb0/src/extundelete-0.2.4/src/bin'

指示の通り /media/usb0/src/extundelete-0.2.4/src/bin にちゃんとバイナリができてました。
なんとか成功したっぽいです。

2:30頃のエポック時間です。

$ date -d "14:30" +%s
1501997400

指定して実行してみました。

$ ./extundelete --after 1501997400 --restore-all /dev/root
Only show and process deleted entries if they are deleted on or after 1501997400 and before 2147483647.
./extundelete: No such file or directory  /dev/root
./extundelete: No such file or directory when trying to open filesystem /dev/root

ところが「/dev/rootなんかないよ」と言われてしまいます。
どうやら起動しているシステムドライブは対象にできないようです・・・?sudoしてみても同じでした。

試しに接続してるUSBドライブでやってみます。

$ sudo ./extundelete /dev/sda1 --restore-all
./extundelete: Bad magic number in super-block when trying to open filesystem /dev/sda1

FATではだめってことです・・・。

仕方ないので、一度rpi-cloneでクローンドライブを作って、そのドライブに対して実行してみます。

$ sudo ./extundelete --after 1500000400 --restore-all /dev/sdb2
Only show and process deleted entries if they are deleted on or after 1500000400 and before 2147483647.
NOTICE: 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 ... 476 groups loaded.
Loading journal descriptors ... 32574 descriptors loaded.
Searching for recoverable inodes in directory / ...
4 recoverable inodes found.
Looking through the directory structure for deleted files ...
4 recoverable inodes still lost.
Unable to restore inode 3612833 (file.3612833): No undeleted copies found in the journal.
Unable to restore inode 3620865 (file.3620865): No undeleted copies found in the journal.
Unable to restore inode 3620897 (file.3620897): No undeleted copies found in the journal.
Unable to restore inode 3620898 (file.3620898): No undeleted copies found in the journal.

 

実行したドライブにRECOVERED_FILESというフォルダが作られます。
で、その中にファイルが吐き出されるはずなのですが・・・。
残念なことに、復活ならずででした。フォルダは空っぽ・・・。

extundelete というコマンドの有効性については気になりますので、もう一度検証はしたいと思います。