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 elmv
requiere copiar (en lugar de simplemente mover las entradas del directorio), los nuevos bloques se asignarán comomv
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 usarstrace
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 elcp
comando. -
vi existing_file
. Sivi
en realidad esvim
, 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 quecp
, 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
.