マルチユーザー、マルチタスクのオペレーティング システムである Linux では、ファイルが削除されると復元するのが困難になります。 delete コマンドはファイル ノードに削除のマークを付けるだけで、実際にはファイルの内容を消去しませんが、ディスクに書き込む他のユーザーや一部のプロセスはデータをすぐに上書きします。
1. Ext2 ファイル システムの構造の簡単な説明
Linux で使用される Ext2 ファイル システムでは、ファイルはデフォルトでブロックに格納され、各ブロックのサイズは 1K であり、異なるブロックはブロック番号によって区別されます。各ファイルにはノードもあり、ファイル所有者、読み取りおよび書き込み権限、ファイル タイプ、その他の情報が含まれます。 12 ブロック未満のファイルの場合、ファイル データ ブロックのブロック番号はノードに直接保存されます。ファイルが 12 ブロックより大きい場合、ノードは 12 ブロック番号の後に間接ブロックのブロック番号を格納します。この間接ブロック番号に対応するブロックには、256 個のファイル データ ブロックのブロック番号が格納されます (Ext2fs の各ブロック)。この番号は 4 バイトを占めるため、1 つのブロックに格納できるブロック番号は 1024/4=256) となります。より大きなファイルがある場合は、2 次間接ブロックと ** 間接ブロックもノードに表示されます。
2. 誤って削除したファイルを復元する方法
ほとんどの Linux ディストリビューションには、Ext2 ファイル システムの編集に使用できる debugfs ツールが提供されています。ただし、このツールを使用する前に、行うべき作業がまだいくつかあります。
まず、誤って削除したファイルが存在するパーティションを読み取り専用モードで再マウントします。次のコマンドを使用します: (ファイルが /usr パーティションにあると仮定します)
mount -r -n -o remount /usr -r は読み取り専用マウントを示し、-n は /etc/mtab にファイルを復元しないことを示します。 xxx パーティションがビジーであるとシステムが示した場合は、fuser コマンドを使用して、どのプロセスがこのパーティション上のファイルを使用しているかを確認できます。
フューザー –v –m /usr
重要なプロセスがない場合は、次のコマンドを使用してプロセスを停止します。
フューザー -k –v –m /usr
これらのファイル システムは再マウントできます。
すべてのファイルが大きな / パーティションにインストールされている場合は、Linux Single を使用してブート プロンプトでシングル ユーザー モードに入り、システム プロセスがハードディスクにデータを書き込む可能性を最小限に抑えるか、単にハードディスクを別の場所にハングすることができます。マシン上で。また、有用なデータの損傷を避けるために、復元されたデータを / 上に書き込まないでください。マシン上に dos/windows がある場合は、次のパーティションに書き込むことができます。
mount –r –n /dev/hda1 /mnt/had
次に、debugfs を実行できます (Linux が /dev/hda5 にあると仮定します)。
#debugfs /dev/hda5
debugfs プロンプト debugfs が表示されます。
lsdel コマンドを使用して、削除された多数のファイルに関する情報を一覧表示します。
debugfs:lsdel debugfs: 2692 個の削除された i ノードが見つかりました。 Inode 所有者モードのブロック サイズ 削除された時間 164821 0 100600 8192 1/ 1 2001 年 5 月 13 日日曜日 19:22:46 36137 0 100644 4 1/ 1 火曜日 2001 年 4 月 24 日 10:11:15 196829 0 100644 149500 38/ 38 2001 年 5 月 27 日月曜日 13:52:04 |
多くのファイルがリストされています (ここでは 2692 が表示されます)。最初のフィールドはファイル ノード番号、2 番目のフィールドはファイル所有者、3 番目のフィールドは読み取りおよび書き込み権限、その後にファイル サイズ、占有ブロック数、および削除時間。
次に、ファイル サイズと削除日に基づいてどれが必要かを判断できます。たとえば、ノード 196829 のファイルを復元したいとします。
まず、ファイル データのステータスを確認します。
debugfs:stat <196829> i ノード: 196829 タイプ: 通常 モード: 0644 フラグ: 0x0 バージョン: 1 ユーザー: 0 グループ: 0 サイズ: 149500 ファイル ACL: 0 ディレクトリ ACL: 0 リンク数: 0 ブロック数: 38 フラグメント: アドレス: 0 番号: 0 サイズ: 0 ctime: 0x31a9a574 -- 2001 年 5 月 27 日月曜日 13:52:04 atime: 0x31a21dd1 -- 2001 年 5 月 21 日火曜日 20:47:29 mtime: 0x313bf4d7 -- 2001 年 3 月 5 日火曜日 08:01:27 dtime: 0x31a9a574 -- 2001 年 5 月 27 日月曜日 13:52:04 ブロック: 594810 594811 594814 594815 594816 594817 合計: 38 |
その後、dump コマンドを使用してファイルを復元できます。
debugfs: ダンプ <196829> /mnt/hda/01.sav
これによりファイルが復元されます。 debugfs を終了します。
debugfs:終了
もう 1 つの方法は、i ノードを手動で編集することです。
debugfs:mi <196829> モード [0100644] ユーザーID[0] グループID[0] サイズ [149500] 作成時間 [0x31a9a574] 変更時刻 [0x31a9a574] アクセス時間 [0x31a21dd1] 削除時刻 [0x31a9a574] 0 リンク数 [0] 1 ブロック数 [38] ファイルフラグ [0x0] 予約済み1[0] ファイル acl [0] ディレクトリ acl [0] フラグメントアドレス[0] フラグメント番号 [0] フラグメントサイズ [0] ダイレクトブロック #0 [594810] トリプル間接ブロック [0] |
mi コマンドを使用した後、編集のために一度に 1 行の情報が表示されます。他の行については、Enter キーを直接押して確認し、削除時間を 0 (削除されない) に変更し、リンク数を 1 に変更します。変更を加えた後、debugfs を終了します。
debugfs:終了
次に、fsck で /dev/hda5 を確認します。
fsck /dev/hda5
プログラムは、紛失したデータ ブロックを見つけて、それを Lost+found に置いたと報告します。このディレクトリ内のファイルが私たちが必要とするものです。