GNU/Linux >> Tutoriales Linux >  >> Linux

¿Se pueden recuperar los archivos sobrescritos?

No estoy hablando de recuperar archivos borrados, sino sobrescritos archivos Es decir, por los siguientes métodos:

# move
mv new_file old_file

# copy
cp new_file old_file

# edit
vi existing_file
> D
> i new_content
> :x

¿Es posible recuperar algo si se realiza alguna de las tres acciones anteriores suponiendo que no hay programas especiales instalados en la máquina Linux?

Respuesta aceptada:

La respuesta es "Probablemente sí, pero depende del tipo de sistema de archivos y del tiempo".

Ninguno de esos tres ejemplos sobrescribirá los bloques de datos físicos de archivo_antiguo o archivo_existente, excepto por casualidad.

  • mv new_file old_file . Esto desvinculará old_file. Si hay enlaces duros adicionales a old_file, los bloques permanecerán sin cambios en esos enlaces restantes. De lo contrario, los bloques generalmente (depende del tipo de sistema de archivos) se colocarán en una lista libre. Entonces, si el mv requiere copiar (en lugar de simplemente mover las entradas del directorio), los nuevos bloques se asignarán como mv escribe.

    Estos bloques recién asignados pueden o no ser los mismos que acaban de liberarse . En sistemas de archivos como UFS, los bloques se asignan, si es posible, desde el mismo grupo de cilindros que el directorio en el que se creó el archivo. Por lo tanto, existe la posibilidad de que al desvincular un archivo de un directorio y crear un archivo en ese mismo directorio se reutilice ( y sobrescribir) algunos de los mismos bloques que acaban de liberarse. Esta es la razón por la cual el consejo estándar para las personas que eliminan un archivo accidentalmente es no escribir ningún dato nuevo en los archivos de su árbol de directorios (y preferiblemente no en todo el sistema de archivos) hasta que alguien pueda intentar recuperar el archivo.

  • cp new_file old_file hará lo siguiente (puede usar strace para ver las llamadas al sistema):

    open("old_file", O_WRONLY|O_TRUNC) = 4

    El indicador O_TRUNC hará que se liberen todos los bloques de datos, al igual que mv hizo arriba. Y como se indicó anteriormente, generalmente se agregarán a una lista libre, y pueden o no ser reutilizados por las escrituras posteriores realizadas por el cp comando.

  • vi existing_file . Si vi en realidad es vim , el :x comando hace lo siguiente:

    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

    Entonces ni siquiera elimina los datos antiguos; los datos se conservan en un archivo de copia de seguridad.

    En FreeBSD, vi open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , que tendrá la misma semántica que cp , arriba.

Puede recuperar algunos o todos los datos sin programas especiales; todo lo que necesitas es grep y dd y acceso al dispositivo sin formato.

Para archivos de texto pequeños, el único grep el comando en la respuesta de @Steven D en la pregunta a la que se vinculó es la forma más fácil:

grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1

Pero para archivos más grandes que pueden estar en varios bloques no contiguos, hago esto:

grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file

que le dará el desplazamiento en bytes de la línea coincidente. Siga esto con una serie de dd comandos, comenzando con

dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)

También le gustaría leer algunos bloques antes y después de ese bloque. En UFS, los bloques de archivos suelen tener 8 KB y se asignan de manera bastante contigua, los bloques de un solo archivo se intercalan alternativamente con bloques de 8 KB de otros archivos o espacio libre. La cola de un archivo en UFS es de hasta 7 fragmentos de 1 KB, que pueden o no ser contiguos.

Relacionado:¿Concatenar archivos específicos en un solo archivo?

Por supuesto, en los sistemas de archivos que comprimen o encriptan datos, la recuperación puede no ser tan sencilla.

En realidad, hay muy pocas utilidades en Unix que sobrescriban los bloques de datos de un archivo existente. Uno que me viene a la mente es dd conv=notrunc . Otro es shred .


Linux
  1. ¿Por qué los archivos no pueden ser manipulados por inode?

  2. Contar líneas en archivos grandes

  3. ¿Cómo puedo buscar archivos y comprimirlos en un archivo zip?

  4. ¿Por qué no puedo crear archivos de más de 2 GB en Linux?

  5. ¿No puede desmontar un archivo respaldado en bucle pero no hay archivos abiertos?

Copiar archivos en Linux

Comando Cp en Linux (Copiar archivos)

Cómo cambiar el nombre de un archivo (s) en Linux

¿Cómo puedo arreglar los permisos de mis archivos?

Transferir archivos usando WinSCP

Cómo comprimir un archivo en Linux