viernes, 26 de junio de 2009

Recuperar ficheros borrados en Linux

¿Alguna vez os ha pasado que borrástes por error un fichero trabajando con la consola? Pues se puede recuperar con un poco de suerte. Mira a ver si esto te ayuda:

Primero vamos a ver un poco como podemos acceder a la informacion o estatus de un fichero. Para esto podemos utilizar el programa de sistema stat. Veamos como funciona:
Primero creamos un fichero de texto. A continuacion podemos usar stat para obtener la informacion de este fichero:

user@test# echo "este es el fichero de prueba" > fichero_de_prueba.txt

A continuacion podemos usar stat para obtener la informacion de este fichero. De toda esa información nos interesa la llamada Inode.
Un inodo es una unidad de datos propia. Tiene las características de un archivo regular, directorio o fichero que esté almacenado en el sistema de archivos.

Cada inodo queda identificado por un número entero, único dentro del sistema de ficheros, y los directorios recogen una lista de parejas formadas por un número de inodo y nombre identificativo que permite acceder al archivo en cuestión: cada archivo tiene un único inodo, pero puede tener más de un nombre en distintos o incluso en el mismo directorio para facilitar su localización.

Cuando borramos un fichero con el comando rm, lo que hacemos es borrar la referencia al inodo en cuestion, durante un tiempo dicho inodo seguira existiendo en nuestro sistema aunque no podamos verlo y parezca que el fichero borrado ha desaparecido de nuestro sistema. Si algun programa esta accediendo al fichero que hemos borrado, estamos de suerte. El programa en cuestion tendra una referencia al inode del fichero borrado y siempre que no cerremos este programa podremos recuperar el contenido de dicho fichero.

A continuacion presentamos una session completa desde que borramos un fichero hasta que lo recuperamos:

1. Abrimos nuestro fichero ejemplo con less (por ejemplo)

user@test# less fichero_de_prueba.txt
este es el fichero de prueba
fichero_de_prueba.txt (END)

2. Pulsamos Ctrl+z para suspender el programa less sin pararlo (el programa seguira abierto, accediendo a nuestro fichero, pero suspendido)

3. Comprobamos que nuestro fichero sigue intacto:

user@test# ls -li fichero_de_prueba.txt

4. Lo borramos... accidentalmente ;)

user@test# rm fichero_de_prueba.txt

5. Comprobamos que no existe en nuestro directorio (lo mismo que el paso 3, pero nos tiene que dar error).

6. Como hemos comentado mas arriba, si tenemos un programa accediendo el fichero estamos de suerte. Utilizamos lsof para ver si algun programa esta accediendo el fichero que hemos borrado.

No deberia de ser una sorpresa que nuestro programa less este accediendo nuestro fichero borrado. Las columnas que nos interesan de esta linea son la primera (PID del programa accediendo el fichero), y la cuarta, el 'file descriptor' (4r) con la referencia al inodo de nuestro fichero.

Con esta informacion nos vamos al sistema de ficheros virtual /proc con informacion de nuestro sistema linux.

user@test# ls -l /proc/28410/fd/4

(en este caso, 28410 es el PID del prorama que está accediendo al fichero).

Como era de esperar, una referencia al fichero borrado. Lo unico que tenemos que hacer ahora es copiar los datos a los que /proc/28410/fd/4 esta haciendo referencia. Para esto podemos utilizar simplemente el comando cp

user@test# cp /proc/28410/fd/4 fichero_de_prueba.txt restaurado

Ahora no importa que el programa less se haya cerrado, porque ya lo tenemos restaurado:

user@test# less fichero_de_prueba.txt restaurado
este es el fichero de prueba

¿Qué tal?



No hay comentarios: