ファイル復元方法(Linux編)


カテゴリー: Tips | 投稿日: | 投稿者: -->

Linuxでファイルをrmで削除しちゃったときの復元方法メモ。
ホントはddとかしてimgファイル作ったり、リードオンリーでmountしたりするのが正解。
今回は、そのまま稼動させながら、というやり方。なので、復元率下がります。
もっと簡単にできるのある気がする。(mcコマンドで、とか)

環境は以下のとおり。
CentOS 5.4

▼前提
・TSK(The Sleuth Kit)がインストール済みであること(blklsコマンド(旧dls)が使用可能であること)
http://www.sleuthkit.org/
・Foremostがインストール済みであること
http://foremost.sourceforge.net/
・がんばって作ったシェルスクリプトを削除しちゃった、という前提

▼ファイルを作成する
ストーリー:これから削除してしまう運命など知る由もなく、シェルスクリプトをもくもくと作成する

[root@localhost ~]# pwd
/root
[root@localhost ~]#
[root@localhost ~]# mkdir TEST
[root@localhost ~]# vi TEST/test.sh
(省略:がんばってシェルスクリプトを作成する)
[root@localhost ~]# cat TEST/test.sh

#!/bin/bash

while [ ${i:=1} -le $1 ]
do
  while [ ${j:=1} -le $1 ]
  do
    line="${line} `expr ${i} * ${j}`"
    j=`expr ${j} + 1`
  done
  echo ${line}
  line=
  i=`expr ${i} + 1`
  j=1
done

#EOF

[root@localhost ~]#

▼ファイルを削除する
ストーリー:がんばって作ったスクリプトを、ぼーっとしてたら削除してしまった!うぉーー最悪だ。

[root@localhost ~]# rm TEST/test.sh
rm: remove regular file `TEST/test.sh’? y
[root@localhost ~]# ls TEST/
[root@localhost ~]#

▼復元の準備をする
削除しちゃったファイルの「inode番号」「保存されているブロックの場所」「1グループあたりのブロック数」を確認する。

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
18G 4.1G 13G 25% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 125M 0 125M 0% /dev/shm
[root@localhost ~]#
[root@localhost ~]# debugfs /dev/mapper/VolGroup00-LogVol00
debugfs 1.39 (29-May-2006)
debugfs: cd /root/TEST
debugfs: ls -d
1769539 (12) . 1245185 (4084) .. (28) .delete-test.sh.swp
(4044) delete-test.sh
debugfs: imap
Inode 1769543 is part of block group 54
located at block 1769476, offset 0x0300
debugfs: stats
(省略)
Blocks per group: 32768
(省略)
debugfs: q
[root@localhost ~]#

▼ここでいったん整理する
・inode番号:1769541
・ブロックグループ番号:54番目
・グループごとのブロック数:32768
つまり、削除したファイルのinode番号が含まれるブロック範囲は
(32768×54)から(32768×55-1)までの間
計算すると、「1769472~1802239」

▼復元の最終準備をする
bashスクリプトであるため、それを抽出できるように、「#!/bin/bash」から始まり、「#EOFn」で終わるデータを抜き出すように設定する。

[root@localhost ~]# vi /usr/local/etc/foremost.conf
(省略:bashスクリプトを抽出する設定を書く)
[root@localhost ~]# cat /usr/local/etc/foremost.conf
(省略)
bash y 20000 #!/bin/bash #EOFn

▼復元する

[root@localhost ~]# mkdir RECOVERY
[root@localhost ~]#
[root@localhost ~]# blkls /dev/mapper/VolGroup00-LogVol00 1769472-1802239 > RECOVERY/block.dat
[root@localhost ~]#
[root@localhost ~]# foremost -dv -i RECOVERY/block.dat -o RECOVERY/OUTPUT/
Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus
Audit File

Foremost started at Sat Jul 31 17:17:49 2010
Invocation: foremost -dv -i RECOVERY/block.dat -o RECOVERY/OUTPUT/
Output directory: /root/RECOVERY/OUTPUT
Configuration file: /usr/local/etc/foremost.conf
Processing: RECOVERY/block.dat
|——————————————————————
File: RECOVERY/block.dat
Start: Sat Jul 31 17:17:49 2010
Length: 107 MB (112414720 bytes)

Num Name (bs=512) Size File Offset Comment

0: 00023687.bash 16 KB 12128244
1: 00023720.bash 200 B 12144640
**|
Finish: Sat Jul 31 17:17:51 2010

2 FILES EXTRACTED

bash:= 2
——————————————————————

Foremost finished at Sat Jul 31 17:17:51 2010
[root@localhost ~]#
[root@localhost ~]# cat RECOVERY/OUTPUT/bash/00023720.bash

#!/bin/bash

while [ ${i:=1} -le $1 ]
do
  while [ ${j:=1} -le $1 ]
  do
    line="${line} `expr ${i} * ${j}`"
    j=`expr ${j} + 1`
  done
  echo ${line}
  line=
  i=`expr ${i} + 1`
  j=1
done

#EOF

[root@localhost ~]#

復元できた。

参考:http://www.symantec.com/connect/ja/articles/data-recovery-linux-and-ext3

コメントを残す

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