Linux削除ファイルの復元サーバ & UNIX
大切な…てか自作スクリプトを間違えて削除してしまった。
("rm 20*"とすべきところを"rm 20"まで打ってTAB補完をしてしまい対象ファイルが1つしかなかったために"rm 20hoge.hoge *"となってしまったのだ…。)
さて、LinuxではTestDiskの様なツールとしてdebugfsやmcがある…のだが、ext3ファイルシステムは対応していない。
(ext3はinodeからデータブロックをたどれない。)
んで、調べているとこんなページを発見した。
「Ext3 ファイルシステムで削除したファイルを復元について」
「Ext3 ファイルシステムで削除したファイルを復元について (2)」
そこで、上記ページを参考に以下のようなスクリプトを書いてみた。
salvage.pl
#!/usr/bin/perl
if ($ARGV[2] eq ''){
print "usage: $0 {DEVICE} {BLOCK_SIZE} {SEARCH_KEY}\n";
exit;
} # if
$dev = $ARGV[0];
$blksz = $ARGV[1];
$key = $ARGV[2];
print `df $dev`;
$blkno = 0;
open(FH, "< $dev") or die "can't open $!";
while (read(FH, $block, $blksz)) {
if ($block =~ m|\#!/usr/bin/perl|) {
print "$blkno -> $blkno.data\n";
`dd if=$dev of=$blkno.data bs=$blksz count=1 skip=$blkno`;
}
else {print "$blkno\r";}
$blkno += 1;
}
exit;
見たまんまだが、デバイスとブロックサイズと検索キーを指定して走らせる。
スクリプトなんかのテキスト系ファイルでブロックサイズ以下のものであればヒットさせられるはずだ。
バイナリファイルでもブロックサイズ以下ならファイル特有のヘッダでどうにかなるのではないかな?
…ということで、どうにか消してしまったファイルもサルベージ出来た。
ちなみに、どうしてもファイルシステムをリードオンリーで再マウントするわけにいかなかったので、マウントについては特にナニもせずそのまま実施した。
本来ならリードオンリーで再マウントすべき。

コメント
一応補足。
ブロックサイズは
tune2fs -l {DEVICE}
でわかる。
投稿者: tak | 2009年07月03日 00:57