Linuxでrmによって削除されたファイルを復元することは可能ですか?


8

あなたがシフトを押さなかった場合、削除されたファイルされたウィンドウでゴミ箱に見つけることができます、

rm -fLinuxで削除されたファイルはどうですか


3
Windowsはこれを10年以上の間ごみ箱と呼んでいます。削除を押すと、ファイルを削除するのではなく、ファイルを移動することを明示的に示します。rmファイルに関連付けられているiノードのリンクを解除します。
Chris S、

回答:


13

最初に覚えておかなければならないのは、ファイルシステムでそれ以上の書き込みアクティビティを行わないようにすることです。

次に、ファイルシステムを調べ、削除されたノード内のデータを検索するいくつかのツールを試すことができます。' extundelete'はsourceforgeでのそのようなツールの1つです。

extundeleteは、ext3またはext4パーティションから削除されたファイルを回復できるユーティリティです。Linuxを使用する場合、ext3ファイルシステムは最も一般的なファイルシステムであり、ext4はその後継です。extundeleteは、パーティションのジャーナルに格納されている情報を使用して、パーティションから削除されたファイルの回復を試みます。特定のファイルを元に戻すことができるという保証はありません。そのため、常に適切なバックアップシステムを用意するか、ファイルを回復した後で少なくとも1つは設置してください。


3
これ以上の書き込みは十分に強調することはできません。これは組み込みではないため、「削除解除」とは、ファイルシステムが将来の書き込みでデータを上書きする前に、残りの部分を再構築するリカバリソフトウェアの問題です。
ジェレミーM

2

最初のステップは、ルートドライブに使用されているファイルシステムの削除取り消しツールを試すことです。

前述のように、ext3grepとextundeleteはextファイルシステムファミリのツールです。

回復しようとしているファイルの種類に応じた別のオプションは、ドライブでファイルカーバーを実行することです。これは、上記のユーティリティよりも時間がかかります。

何よりも、私はこのために使用されてきた一つの選択肢です。

最後のオプションは、たまたまファイル内の特定の文字列を知っている場合、ドライブを16進エディタで開いてその文字列を検索することです。

設定によっては、ウィンドウマネージャーがごみ箱やゴミ箱を提供している場合があります。

結局のところ、適切なバックアップシステムをセットアップすることに勝るものはありません。あなたがそれに触れずにそれを設定することなくその仕事をするものを見つけ、それをセットアップします。長い目で見れば、時間、トラブル、苦痛を大幅に軽減できます。


1

これを試してみましょう。ext3grep:
http ://www.xs4all.nl/~carlo17/howto/undelete_ext3.html
開始する前にパーティションをアンマウントする必要があります

HTH


0

undelete_ext3がなくなったように見えるので、ここに控えめなbashスクリプトがあります。これは、extundeleteまたはdebugfsを使用して取得できなかったいくつかのファイルを復元するのに役立ちました。ソリューションを共有しました。

確認するブロックのリストをプレシードすることができます。「プレシード」を参照してください。1行に1つのブロック番号が必要です。シードしない場合は、すべてのブロックが検索されます(デフォルト)。

  • 各ブロックについて、最初のバイトがgzipコンテンツについて調べられます。
  • 成功した場合、問題のブロックはgunzipされて、257バイト目の「ustar」文字列をさらに調査し、tarアーカイブを示します。
  • 最後に、ファイルパターンに一致するデータが抽出され(tarのワイルドカードオプションを使用したサフィックスパススタイル)、特定の文字列がgrepさ​​れます。これについては、変数FILE_IN_TARおよびFIT_CONTENTを参照してください。
  • 見つかった場合は、ファイルを保存します。

おそらく別のユースケースになるので、これにより、独自のフィルタリングのベースとなるフレームが提供される可能性があります。他のファイルタイプを探すときは、必ず値を微調整する必要があります。

呼び出し例: ./ext-undelete-tar-gz.sh devimage found_files/

#!/bin/bash

# Brute force (linear) search specific tar files with
# certain contents on ext2 / ext3 / ext4 devices or files
#
# .. this is a last resort if extundelete and/or debugfs
#    did not find what you were looking for and limited
#    in that recoverable data must not have been stored
#    in fragments, i.e. non-sequentially

[[ -n "$2" ]] || {
    echo "usage: $0 [ device | imagefile ] "\
    "[ destdir_for_recovered_data ] "\
    "[ max_blocks_to_search (optional) ]" 
    exit 1
}

IMG=$1
DEST=$2
TMP=/dev/shm/cand.tmp
PRESEED=/dev/shm/cand.list

GZMAGIC=$(echo -e "\x1f\x8b\x08")
TARMAGIC=$(echo -e "ustar")

# max bytes to read into $TMP when a .tar.gz has been found
LEN=$((160*1024))

# pick $TMP for recovery based on matched strings..
FILE_IN_TAR="debian/rules" # ..in the tar index (suffix-search)
FIT_CONTENT="link-doc="    # ..within FILE_IN_TAR matches

# determine FS parameters
BLOCKS=$(tune2fs -l $IMG | grep -Po "(?<=^Block count:).*" | xargs)
    BS=$(tune2fs -l $IMG | grep -Po "(?<=^Block size:).*"  | xargs)
LEN=$((LEN/BS))

function _dd     { dd     $@ 2>/dev/null ; }
function _gunzip { gunzip $@ 2>/dev/null ; }
function _tar    { tar    $@ 2>/dev/null ; }

function inspect_block {
    bnum=$1

    if _dd if="$IMG" skip=$bnum bs=$BS count=1 | tee "$TMP" \
    | _dd bs=1 count=3 \
    | grep -qF "$GZMAGIC" 
    then
        if _gunzip -c "$TMP" \
        | _dd bs=1 count=5 skip=257 \
    | grep -qF "$TARMAGIC"
        then
            _dd if="$IMG" skip=$((bnum+1)) bs=$BS count=$((LEN-1)) >> "$TMP"
            echo -n found $bnum.tar.gz

            if _tar xzf "$TMP" -O --wildcards *"$FILE_IN_TAR" \
            | grep -qF "$FIT_CONTENT"
            then
                echo " ..picked, stripping trailing garbage:"
                exec 3>&1
                gunzip -c "$TMP" 2>&3 | gzip > $DEST/$bnum.tar.gz
                exec 3>&-
            else
                echo
            fi
        fi
    fi

    echo -ne "$((bnum+1)) / $BLOCKS done.\r" >&2
}


if [[ -f "$PRESEED" ]]
then
    while read bnum
    do inspect_block $bnum
    done <"$PRESEED"
else
    for (( bnum = 0 ; bnum < ${3:-$BLOCKS} ; bnum++ ))
    do inspect_block $bnum
    done
fi | gzip >"$PRESEED.log.gz"

echo
  • 誤った削除に気づいたら、問題のファイルシステムの使用を停止してください。
  • このスクリプトは大きなファイルではおそらく失敗し、ファイルシステムのより高いレベルの構造体を解析しません。
  • 基本的に、最新のファイルシステムはリンクされていないデータを確実に回復するように設計されていないため、失われたデータを回復することは保証されません。
  • ファイルシステムのバックアップイメージを操作します。

ファイルが12ブロックよりも大きい場合、データブロック間に間接ブロックが見つかる可能性が高いと思います。その場合、単純に連続して読み取るとガベージ出力が生成されます。ただし、インダイレクションブロックを見つけることができれば、ファイルの残りの部分を復元できます(もちろん、上書きされていなければ)。
kasperd 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.