web-dev-qa-db-ja.com

ファイルが不思議なほど空です。回復するオプション?

削除されたファイルの回復に関するいくつかの投稿を見てきましたが、この状況は異なります。妻にはJournal.odtというファイルがあり、子供たちに関する特別な思い出など、多くの重要な個人情報が保存されていました。先日彼女がOpenOfficeでそれを開こうとしたとき、それはフォーマットについて文句を言いました。私は彼女のヒットキャンセルとバックアウトをさせました。ファイルをcatすると完全に空になります。 lsは、ファイルが0バイトであることを示しています。

彼女が誤ってファイル内のすべてのテキストを選択し、バックスペースを押してそれを保存した場合でも、ファイルにはOpenOfficeメタ情報が残っています。

私はすぐに彼女のラップトップをシャットダウンして、何かを思いつくまでディスクに変更を加えないようにしました。

私は過去にddを使用してディスクから未加工のテキストを復元するなど、いくつかの複雑なことを行いましたが、ここで何をすべきかわかりません。 odtファイルはフラットテキストではないため、ディスク全体をgrepでパイプ処理することはできません。

任意の提案をいただければ幸いです。

また、何が問題だったのかについて誰かが洞察を持っている場合は、それを聞いてみたいと思います。

ありがとう

9
jcbwlkr

Ext3ファイルシステムを使用している場合は、 Carlo WoodのHOWTO に従ってください。

一言で言えば、

  • Ext3grep $ IMAGE --ls --inode 2を使用します| grep your_fileを使用して、uが探しているファイルを見つけます($ IMAGEは、/ dev/sda2などのurパーティションです)。
  • 未割り当て領域のジャーナルを含むファイルシステムブロックを見つけます。
  • 以前に見つかったブロックを参照するすべてのジャーナル記述子を見つけます。
  • Ddでブロックをコピーします。
  • ファイルを編集して、末尾のゼロを削除します。
  • どこにいてもファイルを猫

ソースから:

"手動回復の例の章

次の例では、小さなファイルを手動で復元します。スペースを節約し、例を読みやすくするために、部分的な出力のみが示されています。

Ext3grep $ IMAGE --ls --inodeを使用して、回復するファイルの名前を見つけます。

$ ext3grep $ IMAGE --ls --inode 2 | grep carlo 3 end d 195457 D 1202352103 Thu Feb 7 03:41:43 2008 drwxr-xr-x carlo

$ ext3grep $ IMAGE --ls --inode 195457 | grep 'bin $' | head -n 1 34 35 d 309540 D 1202352104 Thu Feb 7 03:41:44 2008 drwxr-xr-x bin

$ ext3grep $ IMAGE --ls --inode 309540 | grep start_azureus 9 10 r 309631 D 1202351093 Thu Feb 7 03:24:53 2008 rrwxr-xr-x start_azureus

明らかに、iノード309631は消去され、このファイルのブロック番号はありません。

$ ext3grep $ IMAGE --print --inode 309631 [...] Inode is Unallocatedグループ:19世代ID:2771183319 uid/gid:1000/1000モード:rrwxr-xr-xサイズ:0リンクの数:0セクター: 0(-> 0間接ブロック)。

Iノード時間:アクセス済み:1202350961 = 2月7日03:22:41 2008ファイル変更:1202351093 = 2月7日03:24:53 2008 iノード変更:1202351093 = 2月7日03:24:53 2008削除時間:1202351093 = Thu 2008年2月7日03:24:53

直接ブロック:

したがって、ジャーナルで古いコピーを探すようにします。最初に、このiノードを含むファイルシステムブロックを見つけます。

$ ext3grep $ IMAGE --inode-to-block 309631 | grepは、Inode 309631がブロック622598のオフセット0xf00に常駐します。

次に、ブロック622598を参照するすべてのジャーナル記述子を見つけます。

$ ext3grep $ IMAGE --journal --block 622598 [...]ブロック622598を参照するジャーナル記述子:4381294 26582 4381311 28693 4381313 28809 4381314 28814 4381321 29308 4381348 30676 4381349 30986 4381350 31299 4381374 32718 4381707 1465 4381709 2132 4381755 2945 4381961 4382137 6672 4382138 7536 4382139 7984 4382140 8931

つまり、シーケンス番号4381294のトランザクションには、ブロック26582にブロック622598のコピーがあり、以下同様です。一番下にある最大のシーケンス番号は、ディスクに書き込まれた最後のデータである必要があります。したがって、ブロック8931は現在のブロック622598と同じである必要があります。最後の削除されていないコピーを見つけるには、一番下から始めて作業する必要があります上向き。

そのようなブロックを印刷しようとすると、ext3grepはそれがiノードテーブルからのブロックであることを認識し、32のiノードすべての内容を出力します。ただし、iノード309631のみを表示したいだけです。したがって、スマートgrepを使用します。

$ ext3grep $ IMAGE --print --block 8931 | grep -A15 'Inode 309631' -------------- Inode 309631 ----------------------- Generation Id:2771183319 uid/gid:1000/1000モード:rrwxr-xr-xサイズ:0リンクの数:0セクター:0(-> 0間接ブロック)。

Iノード時間:アクセス済み:1202350961 = 2月7日03:22:41 2008ファイル変更:1202351093 = 2月7日03:24:53 2008 iノード変更:1202351093 = 2月7日03:24:53 2008削除時間:1202351093 = Thu 2008年2月7日03:24:53

直接ブロック:

これは確かにブロック622598で見たものと同じです。次に、削除時間が0のシーケンス番号が見つかるまで、小さいシーケンス番号を調べます。最初に見つかったもの(ボトムアップ)はブロック6073です。

$ ext3grep $ IMAGE --print --block 6073 | grep -A15 'Inode 309631' -------------- Inode 309631 ----------------------- Generation Id:2771183319 uid/gid:1000/1000モード:rrwxr-xr-xサイズ:40リンク数:1セクター:8(-> 0間接ブロック)。

Inode Times:Accessed:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1189688692 = Thu Sep 13 15:04:52 2007 Inode Modified:1189688692 = Thu Sep 13 15:04:52 2007 Deletion time:0

直接ブロック:645627

上記は自動化されており、コマンドラインオプション--show-journal-inodesを使用すると、はるかに高速に実行できます。このオプションは、iノードが属しているブロックを見つけ、そのブロックのすべてのコピーをジャーナルで見つけ、続いてこれらの各ブロックから要求されたiノードのみを出力します(ご存知のように、それぞれに32のiノードが含まれます)。 :

$ ext3grep $ IMAGE --show-journal-inodes 309631グループの数:75最小/最大ジャーナルブロック:1115/35026ジャーナル記述子を読み込んでいます...完了ジャーナルトランザクション4381435が循環し、一部のデータブロックがこのトランザクションで失われた可能性があります。ジャーナル内の記述子の数:30258;最小/最大シーケンス番号:4379495/4382264ジャーナルで見つかったiノード309631のコピー:

-------------- inode 309631 ----------------------- Generation Id:2771183319 uid/gid:1000/1000モード:rrwxr-xr-xサイズ:0リンクの数:0セクター:0(-> 0間接ブロック)。

Iノード時間:アクセス済み:1202350961 = 2月7日03:22:41 2008ファイル変更:1202351093 = 2月7日03:24:53 2008 iノード変更:1202351093 = 2月7日03:24:53 2008削除時間:1202351093 = Thu 2008年2月7日03:24:53

直接ブロック:

-------------- inode 309631 ----------------------- Generation Id:2771183319 uid/gid:1000/1000モード:rrwxr-xr-xサイズ:40リンクの数:1セクター:8(-> 0間接ブロック)。

Inode Times:Accessed:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1189688692 = Thu Sep 13 15:04:52 2007 Inode Modified:1189688692 = Thu Sep 13 15:04:52 2007 Deletion time:0

直接ブロック:645627

ファイルは実際に小さいです:1ブロックだけ。前に示したように、このブロックをddでコピーします。

$ dd if = $ IMAGE bs = 4096 count = 1 skip = 645627 of = block.645627 1 + 0レコード、1 + 0レコード、4096バイト(4.1 kB)コピー、0.0166104秒、247 kB/s

次に、ファイルを編集して末尾のゼロを削除するか、最初の40バイト(ファイルの指定サイズ)をコピーします。

$ dd if = block.645627 bs = 1 count = 40 of = start_azureus 40 + 0 records in 40 + 0 records out 40 bytes(40 B)copy、0.000105397 seconds、380 kB/s

$ cat start_azureus cd/usr/src/azureus/azureus ./azureus&

回復した!」

3
java_xof

testdisk and photorec を試してみてください。しかし、私があなたの記述を理解する方法は、おそらく定期的なバックアップの価値を知るのが難しい方法です。また、ハードディスクがさらに変更されないようにするために、CDから起動することもできます。私は個人的には System Rescue Disk が好きですが、主にコマンドラインベースです。

2
jippie

デジタルフォレンジック用の特別なLinuxディストリビューションであるCaineを使用します。それはファイルとハードディスクの回復のためのたくさんのツールです。

1
PsyStyle