« 25cmキューブの超小型カラシン | メイン | シガーソケット → USB 5V »

2009年06月21日(日)

Linux削除ファイルの復元

大切な…てか自作スクリプトを間違えて削除してしまった。
("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;

見たまんまだが、デバイスとブロックサイズと検索キーを指定して走らせる。
スクリプトなんかのテキスト系ファイルでブロックサイズ以下のものであればヒットさせられるはずだ。
バイナリファイルでもブロックサイズ以下ならファイル特有のヘッダでどうにかなるのではないかな?
…ということで、どうにか消してしまったファイルもサルベージ出来た。

ちなみに、どうしてもファイルシステムをリードオンリーで再マウントするわけにいかなかったので、マウントについては特にナニもせずそのまま実施した。
本来ならリードオンリーで再マウントすべき。

トラックバック

このエントリーのトラックバックURL:
http://www.okubo.tk/blog/mt-tb.cgi/7284

コメント

一応補足。

ブロックサイズは
tune2fs -l {DEVICE}
でわかる。

コメントを投稿

« 25cmキューブの超小型カラシン | メイン | シガーソケット → USB 5V »

«  2009年06月  »

123456
78910111213
14151617181920
21222324252627
282930

アーカイブ

2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
2002年
2001年
2000年
1978年
Total 3131 Entries.

カテゴリー

Powered by
Movable Type 3.2-ja-2

38.107.179.210

38.107.179.210