LANDISKから削除したファイルを復元 (PC )

先週、自宅にあるアイオーデータ社製のNAS「LANDISK HDL-160U」をdebian化し、家庭内WEBサーバを構築しようとしたところ、誤って共有フォルダを削除しちゃいました。
数年分のデジカメ画像と、リッピングした音楽データが一瞬のうちに消滅(>_<)
LANDISKハックはtelnetを介したCUIのみで、コテコテのWindowsユーザには危険な火遊びだったのかも…。

音楽データの方はまたリッピングすれば済むけど、問題はデジカメの画像。
思い出深い画像も含まれているわけで。
そこで、削除したファイルの復元方法を必死になって検索。
Windowsなら復元ソフトは結構あるんだけど、LANDISKのファイルシステムはLinux。
これがなかなか見つからない。
調査の結果、たどり着いたのが、以下の三つの方法。

■FINALDATA Linux Lite
■Moonlight Commander(mc)
■i-nodeからの復元

FINALDATAはWindowsでも有名な市販の復元ソフト。
ワラにもすがるような思いで、ネット上で同製品をダウンロード購入。
Lite版とLimited版があったんだけど、Limited版は94,500円とかなり高額なため、18,900円のLite版に妥協する。
がしかし、復元されたファイルの中には画像らしきものが見あたらず…(>_<)
わずかなお小遣いから捻出した18,900円が無駄になった模様。

次にトライしたのがmcことMoonlight Commander。
こちらはLinux用のファイラでありがたいことにフリーである。
がしかし、結果はFINALDATA同様、画像ファイルらしきものが見あたらず。

最後に残ったのがi-nodeからの復元。
こちらはLinuxのコマンドを駆使する方法。
Linuxど素人のσ(^^)としてはちょっと敬遠してたものの、もはや方法は残されていないため、ダメもとでトライしてみた。
i-nodeとは、ファイルに対し一意に割り振られる情報らしい。
debugfsというファイルシステムデバッガを使うことで、最近削除されたi-nodeを調べることができる。
debugfsのlsdelコマンドで削除されたinodeを検索し、dumpコマンドでinodeに対応するファイルを別の場所にコピーする。
この処理を繰り返すことで削除した複数のファイルの復元が実現するらしい。

下記書き込みを参考に上記処理を行うシェルスクリプトを作ってみた。
Aaron Crane氏、WATANABE Takashi氏に感謝である。
【Linux Ext2fs Undeletion mini-HOWTO】
http://www.linux.or.jp/JF/JFdocs/Ext2fs-Undeletion/index.html
【[debian-users:38231] (ほぼ解決 済) 削除してしまったファイル の復旧(undelete) について】

さて、復元作業に取りかかる。
まずLinuxがインストールされたデスクトップを用意。
今回使ったデスクトップは、Vine Linux3.1がインストールされたもの。

次にLANDISKからハードディスクを取り出す。
方法については以下サイトを参照。

【LANDISK HACKING DIARY】

思ってたより難なく取り外すことができた。
LANDISKのハードディスクと同容量のハードディスクも用意。
二つのハードディスクをデスクトップに追加。

これによりドライブ構成は以下のようになる。
/dev/hda:作業用マシン
/dev/hdb:復元先ドライブ
/dev/hdc:復元元ドライブ

作業用のマシンを起動し、以下のシェルスクリプトを実行。
ただし、シングルユーザモードで起動する必要がある模様。
LILOの画面が出ている間にESCを押し、"linux 1"を入力して起動する。
そして、以下スクリプトを実行。

#!/bin/sh
##################################################
# Linuxど素人作成のスクリプトです
# σ(^^)の環境では動きましたが、
# 必ず動くとは保証しかねます
# あらかじめご容赦ください
##################################################

# 復元したいファイルがあるドライブ(hdc3)をマウント
mount -t ext2 /dev/hdc3 /mnt/landisk3
# hdc3を読み取り専用に再マウント
mount -o remount,ro /dev/hdc3
# 復元したファイルを保存するドライブ(hdb3)をマウント
mount -t ext2 /dev/hdb3 /mnt/temp

# 最近削除されたinodeを検索し、lsdel.outファイルに書き出し
echo lsdel | debugfs /dev/hdc3 > lsdel.out
# lsdel.outからinodeだけを抜き出し、inodesファイルに書き出し
cut -c1-8 lsdel.out | grep "[0-9]" | tr -d " " > /home/hoge/inodes

# 復元したいファイルがあるドライブ(hdc3)
targetDevice='/dev/hdc3'

# 1 行に 1 つの inode 番号だけが納められているファイル名
inodeFile='/home/hoge/inodes'

# ダンプ開始
counter=0
for inode in $(cat ${inodeFile})
do
dumpDir="`expr ${counter} / 1000`"
# 復元ファイルが大量にあるため、
# 1000ファイルごとにディレクトリに振り分ける
dumpDir=/mnt/temp/dum${dumpDir}
if [ -d ${dumpDir} ]; then
place=$(printf "${dumpDir}/recovered.%03d" $counter)
dumpCommand=$(echo ${inode} | sed -e "s/^.*$/dump <>/")
dumpCommand=$(echo "${dumpCommand} ${place}")
echo ${dumpCommand} | debugfs ${targetDevice}
else
mkdir ${dumpDir}
counter=0
fi

counter=$(( ${counter} + 1 ))
done

exit 0

画面になにやら処理をしてるような文字が流れ出し、4時間ほどその状態が続く。
処理終了後、Linuxを通常起動し、/dev/tempの中を覗くと、13万もの復元ファイルが!
感動の瞬間である(T_T)
13万ものファイルから、画像ファイルを探し出し、WindowsPCに移動。
いくつか復元できなかった画像はあるものの、9割は復元できたようだ。
約1週間の死闘。なんとか目的を達成することができた。

今回の件での教訓として、大事なファイルはバックアップしておくってことと、ハードディスクを捨てる時はファイルを完全に削除すること。
削除はフォーマットだけじゃなく、その手の削除ソフトが必要。
σ(^^)のような素人でも、こうやって復元できるわけだから、精通してる人間ならきっと容易に情報を引き出せると思う。
コワイ、コワイ。

LINEで送る
Pocket

u1kuni
  • u1kuni

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-spam image

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください