Pregunta ¿Es posible recuperar archivos eliminados por rm en Linux?


En ventanas archivadas eliminadas se puede encontrar en la papelera si no presionó cambio,

¿Qué pasa con los archivos eliminados por rm -f en linux


8
2017-08-04 02:15


origen


Windows lo ha llamado una Papelera de reciclaje por más de 10 años; y cuando presiona eliminar, explícitamente dice que está moviendo el archivo, no eliminándolo. rm Desvincula los i-nodos asociados con el archivo. - Chris S
Estrechamente relacionada: Sobrescribí un archivo grande con uno en blanco en un servidor Linux. ¿Puedo recuperar el archivo existente? - Warner


Respuestas:


Lo primero que debe recordar es: deje de hacer más actividades de escritura en el sistema de archivos.

Luego, puede probar algunas herramientas que examinarán el sistema de archivos e intentar localizar los datos en el nodo eliminado. 'extundelete' es una de esas herramientas en sourceforge.

extundelete es una utilidad que puede recuperar archivos borrados de una ext3 o ext4 dividir. El sistema de archivos ext3 es el sistema de archivos más común cuando se usa Linux, y ext4 es su sucesor. extundelete utiliza la información almacenada en el diario de la partición para intentar recuperar un archivo que se ha eliminado de la partición. No hay garantía de que ningún archivo en particular pueda recuperarse, por lo tanto, ¡siempre intente tener un buen sistema de respaldo en su lugar, o al menos coloque uno en su lugar después de recuperar sus archivos!


13
2017-08-04 02:24



Las no más escrituras no pueden enfatizarse lo suficiente. No está incorporado, por lo que "recuperar" es una cuestión de que el software de recuperación vuelva a ensamblar las piezas restantes antes de que el sistema de archivos sobrescriba los datos con escrituras futuras. - Jeremy M


El primer paso sería probar una herramienta de recuperación para el sistema de archivos utilizado para su unidad raíz.

Como se mencionó, ext3grep y extundelete son las herramientas para la familia de sistemas de archivos ext.

Otra opción que depende del tipo de archivo que intenta recuperarse es ejecutar un tallador de archivos en la unidad. Esto llevará más tiempo que las utilidades anteriores.

Principal Es una opción que he usado para esto.

La opción final, si conoce alguna cadena dentro del archivo, es abrir la unidad en un editor hexadecimal y buscar esa cadena.

Dependiendo de su configuración, su administrador de ventanas puede proporcionar una papelera de reciclaje / papelera.

Al final del día, no hay absolutamente ningún sustituto para tener una buena configuración del sistema de respaldo. Encuentra uno que haga su trabajo sin que lo toques y configúralo. Te ahorrarás mucho tiempo, problemas y dolor a largo plazo.


2
2017-08-04 13:39





Daré una oportunidad a esta, ext3grep:
http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html
Tienes que desmontar la partición antes de comenzar.

HTH


1
2017-08-04 08:27





Como undelete_ext3 parece haberse ido, aquí hay un humilde script de bash, que me ayudó a recuperar algunos archivos que no se podían obtener usando extundelete o debugfs. Solución compartida.

Puede preestablecer una lista de bloques para ver, vea PRESEED. Se necesita un número de bloque por línea. Si no presedes, se buscarán todos los bloques, el valor predeterminado.

  • Para cada bloque, los primeros bytes sondeados para el contenido gzip.
  • Si tiene éxito, el bloqueo en cuestión es gunzip'd para sondear aún más la cadena "ustar" en el byte 257, lo que marca un archivo tar.
  • Finalmente, se extraen los datos que coinciden con un patrón de archivo (estilo de ruta de sufijo mediante la opción de comodín de tar) y se repiten para una cadena determinada. Ver variables FILE_IN_TAR y FIT_CONTENT para esto.
  • Si lo encuentra, guarde el archivo.

Como es probable que tenga un caso de uso diferente, esto podría darle un marco para basar su propio filtrado. Definitivamente necesitarás modificar los valores cuando busques otros tipos de archivos.

Ejemplo de invocación: ./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
  • Deje de usar el sistema de archivos en cuestión después de notar una eliminación errónea lo antes posible.
  • Este script probablemente fallará en archivos grandes, no analiza las estructuras de nivel superior del sistema de archivos.
  • Básicamente, los sistemas de archivos modernos no están diseñados para recuperar de forma robusta datos no vinculados, por lo que no hay garantías para recuperar datos perdidos.
  • Operar en una imagen de copia de seguridad del sistema de archivos.

0
2017-12-18 02:47



Si el archivo tiene más de 12 bloques, creo que es probable que encuentre bloques de direccionamiento indirecto entre los bloques de datos. En ese caso, simplemente la lectura secuencial producirá una salida de basura. Pero si puede encontrar los bloques de direccionamiento indirecto, puede recuperar el resto del archivo (a menos que, por supuesto, se haya sobrescrito). - kasperd