Est-il possible de récupérer des fichiers supprimés par rm sous Linux?

8

Dans les fenêtres déposées supprimées peuvent être trouvées dans la corbeille si vous n'avez pas appuyé sur Maj ,

Qu'en est-il des fichiers supprimés par rm -fsous Linux

wamp
la source
3
Windows l'appelle une corbeille depuis plus de 10 ans maintenant; et lorsque vous appuyez sur supprimer, il indique explicitement qu'il déplace le fichier, pas le supprimer. rmdissocie le ou les nœuds i associés au fichier.
Chris S

Réponses:

13

La première chose à retenir est - arrêtez de faire d'autres activités d'écriture sur le système de fichiers.

Ensuite, vous pouvez essayer certains outils qui examineront le système de fichiers et tenteront de localiser les données dans le nœud supprimé. ' extundelete' est l'un de ces outils chez sourceforge.

extundelete est un utilitaire qui peut récupérer des fichiers supprimés d'une partition ext3 ou ext4 . Le système de fichiers ext3 est le système de fichiers le plus courant lors de l'utilisation de Linux, et ext4 est son successeur. extundelete utilise les informations stockées dans le journal de la partition pour tenter de récupérer un fichier qui a été supprimé de la partition. Il n'y a aucune garantie qu'un fichier particulier pourra être restauré, alors essayez toujours d'avoir un bon système de sauvegarde en place, ou au moins en mettre un en place après avoir récupéré vos fichiers!

nik
la source
3
On ne peut pas assez insister sur les autres écritures. Ce n'est pas intégré, donc la "suppression" est une question de logiciel de récupération qui rassemble les morceaux restants avant que le système de fichiers n'écrase les données avec les futures écritures.
Jeremy M
2

La première étape consiste à essayer un outil de suppression du système de fichiers utilisé pour votre lecteur racine.

Comme mentionné, ext3grep et extundelete sont les outils de la famille de systèmes de fichiers ext.

Une autre option, selon le type de fichier à récupérer, consiste à exécuter un découpeur de fichiers sur le lecteur. Cela prendra plus de temps que les utilitaires ci-dessus.

Avant tout, c'est une option que j'ai utilisée pour cela.

La dernière option, si vous connaissez une certaine chaîne dans le fichier, est d'ouvrir le lecteur dans un éditeur hexadécimal et de rechercher cette chaîne.

Selon votre configuration, votre gestionnaire de fenêtres peut fournir une corbeille / poubelle.

À la fin de la journée, rien ne peut remplacer une bonne configuration du système de sauvegarde. Trouvez celui qui fait son travail sans que vous le touchiez et configurez-le. Vous vous épargnerez beaucoup de temps, de problèmes et de douleur à long terme.

dpflug
la source
0

Comme undelete_ext3 semble avoir disparu, voici un humble script bash, qui m'a aidé à récupérer certains fichiers qui n'étaient pas disponibles en utilisant extundelete ou debugfs . Solution partagée.

Vous pouvez préconfigurer une liste de blocs à consulter, voir PRESEED. Il faut un numéro de bloc par ligne. Si vous ne préconfigurez pas, tous les blocs seront recherchés, par défaut.

  • Pour chaque bloc, les premiers octets sont sondés pour le contenu gzip.
  • En cas de succès, le bloc en question est gunzipé pour rechercher davantage la chaîne "ustar" à l'octet 257, démarquant une archive tar.
  • Enfin, les données correspondant à un modèle de fichier sont extraites (style de chemin de suffixe en utilisant l'option générique de tar) et recherchées pour une certaine chaîne. Voir les variables FILE_IN_TAR et FIT_CONTENT pour cela.
  • S'il est trouvé, enregistrez le fichier.

Comme vous aurez probablement un cas d'utilisation différent, cela pourrait vous donner un cadre sur lequel baser votre propre filtrage. Vous aurez certainement besoin de modifier les valeurs lorsque vous recherchez d'autres types de fichiers.

Exemple d'appel: ./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
  • Arrêtez d'utiliser le système de fichiers en question après avoir remarqué une suppression erronée dès que possible.
  • Ce script échouera probablement sur des fichiers volumineux, il n'analyse pas les structures de niveau supérieur du système de fichiers.
  • Fondamentalement, les systèmes de fichiers modernes ne sont pas conçus pour récupérer de manière robuste des données non liées, il n'y a donc aucune garantie sur la récupération de données perdues.
  • Opérez sur une image de sauvegarde du système de fichiers.
Chef Meister
la source
Si le fichier est supérieur à 12 blocs, je pense qu'il est probable que vous trouverez des blocs d'indirection entre les blocs de données. Dans ce cas, une simple lecture séquentielle produira une sortie poubelle. Mais si vous pouvez trouver les blocs d'indirection, vous pouvez récupérer le reste du fichier (sauf s'il a été écrasé bien sûr).
kasperd