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 Group:19 Generation Id:2771183319 uid / gid:1000/1000 mode:rrwxr-xr-x size:0 num of links:0セクタ: 0(-> 0間接ブロック)。
Inode Times:Accessed:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deletion time: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間接ブロック)。
Inode Times:Accessed:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deletion time: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ノードのみを出力します(ご存知のとおり、各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間接ブロック)。
Inode Times:Accessed:1202350961 = Thu Feb 7 03:22:41 2008 File Modified:1202351093 = Thu Feb 7 03:24:53 2008 Inode Modified:1202351093 = Thu Feb 7 03:24:53 2008 Deletion time: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&
回復した!」