[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:38231] (ほぼ解決済) 削除してしまったファイルの復旧(undelete)について



渡辺です。こんちは。

1. mc

先日、意図せずにファイルを削除してしまい、そのファ
イルはバージョン管理システムの管理下になかったもの
ですから、復活させるのは無理かと思ったのですが、検
索してみたところ、まず mc (Midnight Commander)なる
プログラムが出てきたので試してみました。
(Linux Ext2fs Undeletion mini-HOWTO に従い、適度に
(アン)マウントし、)
# mc
F9 でプルダウンメニューから Undelete blah blah..を
選ぶと...
...数時間経っても、実行が終わりませんでした。

~$ mc -V
GNU Midnight Commander 4.5.55
Edition: テキストモード
仮想ファイルシステム: tarfs, extfs, ftpfs, mcfs, undelfs
内蔵エディタ使用
Using S-Lang library with terminfo database
With subshell support as default
バックグラウンド操作のサポート
With mouse support on xterm and Linux console
ロカール "ja_JP.eucJP" を利用します (環境変数 LANG より)

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=88862
にある出力と異なり、undelfs が有効にはなっているよ
うにみえます。

>>>>>>>>>>>>>>>>>>>>>>>>WT<<<<<<<<<<<<<<<<<<<<<<<<
2. recover

mc の使い方が間違っているのかと思い、"Midnight Commander" "undelete"
で、検索し直してみると、お仲間が居ました。
http://lists.debian.org/debian-user/2001/debian-user-200103/msg00620.html
(Ext2fs-Undeletion を試して、inode candidates を持っ
ているところまで同じですわ (^^;)
この follow-ups の一つで紹介されている recover を
試してみることにしました。

(Linux Ext2fs Undeletion mini-HOWTO に従い、適度に
(アン)マウントし、)
# recover
(対象のパーティションを選ぶと、debugfs が実行され、
しばらくすると、)
Out of Memory: Killed process 1638 (recover).
Terminated
# 
となりました。パーティションのサイズは、3.6GB 程あ
ります。

>>>>>>>>>>>>>>>>>>>>>>>>WT<<<<<<<<<<<<<<<<<<<<<<<<
3. 手動

とりあえず、debugfs での dump コマンドを試してみる
ことにしました。

まず、Linux Ext2fs Undeletion mini-HOWTO の 9 章に
従い、適度に(アン)マウントし、inodes を抜き出します。

そして、次のシェルスクリプトを実行して、dump して
行きます。

================== チョキチョキ ==================
#!/bin/sh

##################################################
# このプログラムは***無保証***です。
#
# 必ず、Linux Ext2fs Undeletion mini-HOWTO を一読
# してください。
#
# プログラム実行前に、必ず、グローバル変数を適切に
# 設定してください。
##################################################

##################################################
# Global Variables Part

# 既にリードオンリーで再マウントされているパーティ
# ション名(ここにかつて存在したファイルを復活させたい)
targetDevice='/dev/hda10'

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

# ダンプする場所の名前(ディレクトリ名)
dumpDir='dumpPlace'

##################################################
# Execution Part

# ダンプする場所の確保
if [ -d ${dumpDir} ]; then
	printf "%s: リカバリーファイルをダンプするためのディレクトリを作成しようとしましたが、既にディレクトリがあります。\n" $0
	exit 1
elif [ -f ${dumpDir} ]; then
	printf "%s: 同名のファイルが既に存在するため、リカバリーファイルをダンプするためのディレクトリを作成できません。\n" $0
	exit 1
else
	mkdir ${dumpDir}
fi

# inodes ファイルの確認
if [ ! -r ${inodeFile} ];then
	printf "%s: %s ファイルが見つかりません。\n" $0 ${inodeFile}
	exit 1
fi


# ダンプ開始
counter=0
for inode in $(cat ${inodeFile})
do
	place=$(printf "${dumpDir}/recovered.%03d" $counter)
	dumpCommand=$(echo ${inode} | sed -e "s/^.*$/dump <\0>/")
	dumpCommand=$(echo "${dumpCommand} ${place}")
	echo ${dumpCommand} | debugfs ${targetDevice}

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

exit 0
================== チョキチョキ ==================

これで、難無くファイル群を復旧(undelete)することが
できてしまいました。

なんか、Undeletion mini-HOWTO の説明と食い違ってい
るように見える(=12 ブロックを超えているのにナゼか
ふつーに dump でオッケー)のですが、debugfs の dump
まわりの機能に変更があったのでしょうか?

$ dpkg -l e2fsprogs
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)維持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール
|/ エラー=(空欄)無/(H)維持/(R)要再インストール/X=両方(状態,エラーの大文字=異常)
||/ 名前           バージョン     説明
+++-==============-==============-============================================
ii  e2fsprogs      1.27-2         The EXT2 file system utilities and libraries

---
渡辺崇史(lieuML@xxxxxxxxxxx)
Woody にて。
$ uname -a
Linux mojo 2.4.20 #1 SMP 2003年 8月 28日 木曜日 23:00:28 JST i686 unknown