sábado, 26 de enero de 2008

Recuperación de archivos de texto

Cuantas veces nos paso que estabamos leyendo un email, por ejemplo, con pine y sin darnos cuenta lo eliminamos? Y que me dicen de haber estado progrmando toda la noche, y al querer borrar los backups (los archivos que terminan con ~), le pifiamos al teclado y terminamos con un rm *? Si, a todos alguna vez nos ha pasado. La tecnica que les paso a comentar ahora les va a servir si los datos que visualizaban estuvieron escritos fisicamente en el disco, y no solo en la cache. Digamos, que si el archivo estuvo al menos unos 20 o 30 segundos, podemos estar casi seguros de que lo vamos a recuperar.

Armemos una situacion: Rogelio, de www.rogelio-feliz.com sin querer borro un email con unos datos: claves, direcciones IP, etc. En nuestro caso particular, rogelio es el root, y al darse cuenta que elimino ese archivo, hizo lo siguiente:

1) DETUVO TODA ACTIVIDAD que pueda grabar datos en el disco. O sea, detuvo compilaciones, dejo de grabar archivos con los que estaba trabajando, detuvo el sendmail, todo. Esto es muy importante: una operacion de escritura podria sobreescribir los datos que estamos buscando!

2) Se fijo en que particion estuvo grabado el archivo que elimino. -- En este caso en particular, supongamos que el archivo era /usr/local/claves.txt. Mediante el comando 'df' (disk free, para ver cuantos bloques libres nos quedan en cada particion, asi como tambien en que directorio estan montadas dichas particiones. Un parametro piola: el -m, que muestra las cantidades en megabytes). Como les decia, Rogelio uso el comando 'df'. Asi se dio cuenta que /usr/local/datos esta montado en la particion /dev/hdb2. Si es posible, intenten desmontar esta particion, para que no se produzcan mas escrituras. Si no pueden hacerlo, tengan cuidado con el punto 3.

3) Utilizo el comando 'egrep', que es un grep extendido que nos permite buscar utilizando 'expresiones regulares', que son cadenas que nos permiten hacer busquedas y 'pattern matching' muy poderosos. El archivo de datos tenia pocas lineas, apenas unas 20, y Rogelio recordaba la palabra 'acceso', seguida de algun texto, seguido de la palabra 'SERVIDOR' (en mayusculas). Entonces, utilizo el egrep para buscar esos datos. Pero ustedes diran: Y donde los busca, si el archivo se elimino? - Facil: los busca en la particion en CRUDO. (raw partition). O sea, busca en la particion, pero a bajo nivel, por debajo de 'ext3', o de 'reiserfs'. Justamente: busca 'en crudo'. El comando, entonces, puede ser asi: "egrep -30 'acceso.+SERVIDOR' /dev/hdb2 > /tmp/busqueda Fijense que en este caso estamos redirigidos a /tmp/busqueda, PARA NO ESCRIBIR en la particion /dev/hdb2! - Esto es MUY importante. Recuerden que debemos detener toda actividad de escritura en la particion donde estaban los datos que queremos guardar. El parametro -30 del egrep es para tomar 30 lineas por encima y por debajo de la frase buscada, solo para estar seguros. Si fuera un codigo fuente, podriamos utilizar -10000, por ejemplo.

4) Ahora solamente debemos tomar el archivo /tmp/busqueda, y sacar de alli todo lo que sea legible. En ese archivo es muy probable que haya datos binarios que no nos importan. Es muy facil realizar esta tarea. Recuerden que Unix se destaco en sus origenes por la potencia de sus pequenios programas, que vinculados entre si lograban realizar tareas de muy alto nivel. (cut, cat, *grep, awk, strings, find, wc, etc). Para tomar el texto legible, con solo utilizar el comando 'strings' nos alcanza, de la siguiente manera: "strings /tmp/busqueda > /tmp/limpio". Ahora la salida la redirigimos a /tmp/limpio. Este archivo solamente nos queda cargarlo en un editor de texto, y buscar nuestra informacion alli.

Vieron? Es bastante simple. El secreto en la mayoria de las tecnicas de recuperacion de datos es trabajar con los datos.... pero a bajo nivel. Si algo se escribio, si no fue sobre-escrito, es probable encontrarlo. A veces quiza no podamos recuperar un archivo entero, pero quiza recuperemos importantes fragmentos. La idea es siempre intentar detener toda actividad de disco, para que las probabilidades de recuperacion aumenten considerablemente.

De todas formas: es bueno tener un backup diario de las cosas con las que estamos trabajando. No quiza de todo el sistema, pero al menos de los archivos que tengan tendencia a cambiar seguido. Por supuesto, esta tecnica es mas facil de aplicar si podemos recordar algo del cotenido del archivo que buscamos. Hay que mantener los ojos abiertos, y la cabeza relativamente despierta :).

Por otra parte, esta es una tecnica simple, probablemente util en sistemas donde no haya actividad de otros usuarios. En un servidor sera bastante dificil utilizarla, especialmente si los datos que queremos buscar residen en particiones con mucha actividad de escritura.