Restaurar archivos borrados en un sistema de archivos ext3


A todos nos puede pasar

Le puede pasar a cualquiera, tarde o temprano:
oscar@kroline:~$rm -rf tesis
un instante después de que oprimiste la tecla del enter descubres el error, pero es tarde, acabas de borrar un archivo o un directorio del cual no tienes un respaldo, o el que tienes es demasiado viejo... en medio de tu pánico ves pasar todos y cada uno de los archivos que has borrado, algunos los tendrás que rehacer y otros, a ver cómo los consigues.

Afortunadamente inmediatamente recuerdas que en los sistemas linux los archivos realmente no son borrados, son sobre-escritos por nuevos contenidos, así que lo primero que debes hacer es desmontar el disco o partición o si el archivo borrado estaba en el mismo sistemas de archivos deberás por lo menos remontarlo con permisos de solo lectura o en el peor de los casos apagar la máquina. Hazlo ya!! si no lo has hecho.


Ext2 y Ext3

Después de preguntarle a San Google alguna respuesta a tu problema ecuentras lo siguiente:

En los sistemas ext2 hay muchas formas de recobrar los archivos eliminados, de manera tan sencilla como lo hace winbugs con su papelera de reciclaje. Por un momento te pasa por la mente cambiar el sistema  de archivos de ext3 a ext2, al fin y al cabo en tu curso de Sistemas Operativos Modernos tu profesor te explico que el ext3 es un ext2 con un journal (¿y qué era eso?). Por lo pronto deberías de hacer el cambio.

Para los sistemas ext3 es muy probable que encuentres el siguiente FAQ:

Q: How can I recover (undelete) deleted files from my ext3 partition?

Actually, you can't! This is what one of the developers, Andreas Dilger, said about it:

In order to ensure that ext3 can safely resume an unlink after a crash, it actually zeros out the block pointers in the inode, whereas ext2 just marks these blocks as unused in the block bitmaps and marks the inode as "deleted" and leaves the block pointers alone.

Your only hope is to "grep" for parts of your files that have been deleted and hope for the best.


Lo anterior no es necesariamente cierto. Toda la información aún puede seguir ahi, incluyendo los bloques de direcciones. Es un poco diferente que en el ext2 pues ahora será necesario recobrar la información del journal. Con el ext2 bastaba con hacer una búsqueda i-nodo por i-nodo y bloque por bloque, era tardado pero seguro. Con el ext3 es menos coherente la relación entre los datos y sus los metadatos (i-nodos y bloques) debido a la utilización de algoritmos heurísticos para proteger el sistema de archivos de fallas del sistema general.

Por ejemplo, cada vez que un archivo es accedido, su tiempo de acceso cambia y su i-nodo deberá ser almacenado en el disco junto con los otros 31 i-nodos que reciden en el mismo bloque. Cuando eso ocurre, una copia de ese bloque es escrito en el journal. Por lo tanto, si el disco no es tan grande comparado con tu journal actual y si accediste recientemente a los archivos que acabas de eliminar, es posible recobrar los bloques de direcciones desde el journal.





Lo que debería de saber antes de iniciar

¿Cómo funciona el ext3?

El contenido de los archivos es almacenado en bloques de 4096 o 2048 o 1024 bytes (en realidad depende cómo se haya creado el sistema de archivos, mke2fs o mkfs.ext3). Un disco duro es un dispositivo de bloque, lo que significa que cada operación de entrada-salida será hecha en bloques...

...bueno, es posible que debido a que estás en estado de shock por la pérdida de tus archivos, no estás para recordar o aprender de los sistemas de archivos, asi que puedes pasar a la sección "para impacientes" mientras yo pongo más choro por aquí.




ext3grep

ext3grep es una herramienta desarrollada inicialmente para recobrar archivos eliminados, sin embargo también es bastante útil para entender cómo funciona el sistema de archivos ext3...




Para  impacientes o en estado de shock

Puedes bajar las fuentes del ext3grep de varios lugares, configurarlo, compilarlo e instalarlo como cualquier aplicación de linux.  ext3grep es parte de varias distribuciones de linux, entre ellas debian, así que basta con instalar los binarios:
kroline:~#apt-get install ext3grep

Restaurar todo

Lo más sencillo es restaurar todo, es decir, que ext3grep trate de hacer una copia de todas las transacciones de archivos desde la ultima vez que lo desmontaste. Es muy probable que la infromación de los archivos recientemente eliminados estén aún registrados en el journal.

Aunque es la solución más simple es la más tardada y evidentemente tomará más tiempo con respecto al tamaño de tu disco. Además deberás de considerar que hará una copia de casi todo el disco o partición, así que deberás de tener otra partición o disco con espacio suficiente para ello.

Suponiendo que la partición o disco en donde se econtraba tus archivos es /dev/sda6, hacemos los siguiente:

kroline:~#ext3grep /dev/sda6 --restore-all
El comando anterior creará un directorio llamado RESTORED_FILES en el cual copiará todos los archivos que tiene registrados en su journal. Ahora lo que te queda es cruzar los dedos para que los archivos eliminados aún estén en el journal y puedan ser restaurados.


Búsqueda por tiempo

Una forma más rápida es buscar los archivos que fueron eliminados en base al tiempo. Como el journal es un sistema que mantiene la información de las transacciones de archivos en base al tiempo de acceso, seguramente tendrá la información de qué archivo fue eliminado en un momento dado.

kroline:~#ext3grep /dev/sda6 --dump-names > eliminados.txt 
el comando anterior genera uno o varios archivos con la información de los arhivos eliminados. Cada transacción está asociada con una estampa de tiempo, la cual es un conjunto de bits que cuentan los segundos desde el 1 de enero de 1970 y es transformada en una cadena de caracteres para su lectura. Se pueden cambiar de una cadena a estampa de tiempo o viceversa por medio de un programa en C con las funciones descritas en time.h o por medio del servicio en línea TimeStamp Generator.

Así, es posible ubicar el tiempo en el cual deseamos restaurar:

kroline:~#ext3grep /dev/sda6 --restore-all --after 1280083764 
--before 1280256564 > restore.log


Búsqueda por nombre

Si recordamos el nombre del archivo, podemos hacer una búsqueda del mismo en el journal.

kroline:~#ext3grep /dev/sda6 --search tesis 
es posible que el comando anterior nos arroje muchos bloques eliminados, será necesario ubicar cada bloque que pertenece a nuestro archivo eliminado:

kroline:~#ext3grep /dev/sda6 --ls --block 240017
una vez que han sido ubicados los bloques, se asocia con el i-nodo:

kroline:~#ext3grep /dev/sda6 --ls --inode 656495
finalmente se restaura el i-nodo

kroline:~#ext3grep /dev/sda6 --restore-inode 2263308