削除されたファイルの復元について話しているのではなく、上書き ファイル。つまり、次の方法で:
# move
mv new_file old_file
# copy
cp new_file old_file
# edit
vi existing_file
> D
> i new_content
> :x
Linuxマシンに特別なプログラムがインストールされていないと仮定して、上記の3つのアクションのいずれかを実行した場合、何かを取得することは可能ですか?
承認された回答:
答えは「おそらくそうですが、ファイルシステムの種類とタイミングによって異なります。」
これらの3つの例はいずれも、偶然を除いて、old_fileまたはexisting_fileの物理データブロックを上書きしません。
-
mv new_file old_file
。これにより、old_fileのリンクが解除されます。 old_fileへの追加のハードリンクがある場合、それらの残りのリンクのブロックは変更されません。それ以外の場合、ブロックは通常(ファイルシステムの種類によって異なります)フリーリストに配置されます。次に、mv
(ディレクトリエントリを移動するだけでなく)コピーする必要がある場合、新しいブロックはmv
として割り当てられます。 書き込みます。これらの新しく割り当てられたブロックは、解放されたばかりのブロックと同じである場合とそうでない場合があります 。 UFSのようなファイルシステムでは、可能であれば、ファイルが作成されたディレクトリと同じシリンダーグループからブロックが割り当てられます。したがって、ディレクトリからファイルのリンクを解除し、同じディレクトリにファイルを作成すると、再利用される可能性があります(と上書き)解放されたばかりの同じブロックのいくつか。これが、誤ってファイルを削除した人への標準的なアドバイスが、誰かがファイルの回復を試みることができるまで、ディレクトリツリー内のファイルに(できればファイルシステム全体に)新しいデータを書き込まないことである理由です。
-
cp new_file old_file
次のことを行います(strace
を使用できます システムコールを確認するには):open("old_file", O_WRONLY|O_TRUNC) = 4
O_TRUNCフラグを使用すると、
mv
と同様に、すべてのデータブロックが解放されます。 上記を行いました。そして、上記のように、それらは通常フリーリストに追加され、cp
によって行われる後続の書き込みによって再利用される場合とされない場合があります。 コマンド。 -
vi existing_file
。vi
の場合 実際にはvim
、:x
コマンドは次のことを行います:unlink("existing_file~") = -1 ENOENT (No such file or directory)
rename("existing_file", "existing_file~") = 0
open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3
したがって、古いデータも削除されません。データはバックアップファイルに保存されます。
FreeBSDでは、
vi
open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
を実行します 、cp
と同じセマンティクスを持ちます 、上記。
特別なプログラムなしで、データの一部またはすべてを回復できます。必要なのはgrep
だけです およびdd
、およびrawデバイスへのアクセス。
小さなテキストファイルの場合、単一のgrep
リンクした質問の@StevenDからの回答のコマンドが最も簡単な方法です:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
ただし、複数の連続していないブロックにある可能性のある大きなファイルの場合は、次のようにします。
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
これにより、一致する行のバイト単位のオフセットが得られます。これに続いて一連のdd
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
また、そのブロックの前後にいくつかのブロックを読みたいと思うでしょう。 UFSでは、ファイルブロックは通常8KBであり、通常はかなり連続して割り当てられます。単一のファイルのブロックは、他のファイルまたは空き領域からの8KBブロックと交互にインターリーブされます。 UFS上のファイルの末尾は、最大7つの1KBフラグメントであり、連続している場合と隣接していない場合があります。
関連:特定のファイルを1つのファイルに連結しますか?もちろん、データを圧縮または暗号化するファイルシステムでは、リカバリはこれほど簡単ではない場合があります。
Unixには、既存のファイルのデータブロックを上書きするユーティリティは実際にはほとんどありません。頭に浮かぶのはdd conv=notrunc
です。 。もう1つはshred
です 。