[traducción del artÃculo original que se encuentra en ésta página]
Todos lo hemos hecho antes: accidentalmente tecleas el argumento incorrecto al hacer rm o seleccionas el fichero incorrecto para su borrado, al pulsar enter te das cuenta de tu error y tu estómago da un vuelco. Y cuando vas a buscar la copia de seguridad del sistema no hay ninguna.
Hay muchas herramientas de desborrado para sistemas FAT y NTFS, pero hay muy pocas para EXT3, que es actualmente el sistema de fichero por defecto de muchas distribuciones Linux. Esto es debido al modo en que los ficheros EXT3 son eliminados: información crucial que almacena donde está localizado el contenido del fichero es eliminada durante el proceso de borrado.
En este artÃculo, echaremos un vistazo a bajo nivel de porqué la recuperación es dificil y a algunas aproximaciones que son efectivas algunas veces. Usaremos herramientas de código abierto para la recuperación, pero las técnicas no son completamente automáticas.
¿Qué es un fichero?
Antes de poder ver como recuperar ficheros, necesitamos ver como se almacenan. TÃpicamente, los sistemas de ficheros están localizados dentro de particiones de disco, que a su vez está organizada en sectores (usualmente de 512 bytes). Cuando la partición está formateada usando EXT3, los sectores consecutivos son agrupados en bloques, cuyo rango puede variar entre 1024 y 4096 bytes. Los bloques son agrupados juntos en grupos de bloques, cuyo tamaño será de decenas de miles de bloques. Cada ficheros tiene sus datos almacenados en tres ubicaciones principales: bloques, inodos y entradas de directorio. El contenido del fichero se almacena en bloques, que son dispuestos para el uso exclusivo de ese fichero, expandiéndose por tantos bloques como sea necesario. Idealmente, el fichero deberÃa utilizar bloques consecutivos, pero esto no es siempre posible.
Los metadatos del fichero son almacenados en una estructura de inodo, que se encuentra en una tabla de inodos colocada en el inicio de un grupo de bloques. Hay un número finito de inodos y cada uno es asignado a un grupo de bloques. Los metadatos de un fichero incluyen los datos temporales tales como la última modificación, el último acceso, el último cambio y la fecha de borrado. También incluye el tamaño del fichero, el identificador de usuario y de grupo, los permisos, y las direcciones de los bloques donde se puede encontrar el contenido del fichero.
Las direcciones de los primeros 12 bloques son guardadas en el inodo y las direcciones adicionales son almacenadas externamente en bloques, llamados bloques indirectos. Si el fichero requiere muchos bloques y no todas las direcciones caben en un bloque indirecto, un doble bloque indirecto es usado cuya dirección se incluye en el inodo. El doble bloque indirecto contiene direcciones de bloques indirectos simples, que contienen direcciones de bloques con datos de fichero. Hay incluso direcciones indirectas triples en el inodo que añaden una capa más de punteros.
Por último, el nombre del fichero está almacenado en una estructura de entrada de directorio ubicada en un bloque asignado al directorio padre del fichero. Un directorio EXT3 es parecido a un fichero y sus bloques contienen una lista de estructuras de entradas de directorio, cada una conteniendo el nombre de un fichero y las dirección del inodo en el que se almacenan los metadatos del fichero. Con el comando ls -i puedes ver la dirección del inodo que corresponde a cada nombre de fichero. Se puede ver la relación entre una entrada de directorio, el inodo y los bloques en la Figura 1.
Cuando un nuevo fichero es creado, el sistema operativo (SO) debe elegir que bloques e inodo asignará al fichero. Linux intentará asignar los bloques y el inodo en el mismo grupo de bloques que su directorio padre. Esto provoca que los ficheros en un mismo directorio estén mucho más cercanos. Posteriormente usaremos este hecho para restringir donde buscar datos eliminados.
El sistema de ficheros EXT3 tiene un journal (nota del traductor: me permito aquà mantener el término en inglés por comodidad en lugar de usar bitácora o diario de registro, ya que cualquiera de los dos queda algo raro) que registra las actualizaciones de los metadatos del sistea ANTES de que la actualización ocurra. En caso de una caÃda del sistema, el SO lee el journal y podrá reprocesar o deshacer las transacciones registradas para que la recuperación sea mucho más rápida que examinar cada estructura de metadatos, que era el antiguo y lentÃsimo mecanismo. Las estructuras de metadatos de ejemplo incluyen las entradas de directorio que almacenan nombres de fichero e inodos que almacenan los metadatos del fichero. El journal contiene el bloque entero que está siendo actualizado, no solo el valor que está cambiando. Cuando un nuevo fichero es creato, el journa deberÃa contener la versión actualizada de los bloques que contienen la entrada del directorio y el inodo.
El proceso de borrado
Varias cosas ocurren cuando un fichero es borrado de un sistema EXT3 en Linux. Hay que tener en cuenta que el SO debe decidir exactamente que ocurre cuando un fichero es eliminado y éste artÃculo asume un sistema Linux general.
Como mÃnimo, el SO debe marcar cada uno de los bloques, el inodo y la entrada de directorio como no-asignados para que ficheros posteriores puedan usarlos. Esta mÃnima aproximación es lo que ocurrÃa hace años con los sistemas EXT2. En ese caso, el proceso de recuperación era relativamente simple ya que el inodo aún contenÃa las direcciones de los bloques del contenido del fichero y herramientas tales como debugfs y e2undel podÃan re-crear el fichero fácilmente. Esto funcionaba mientras que los bloques no habÃan sido asignados a un nuevo fichero y el contenido original no habÃa sido sobreescrito.
Con EXT3, hay un paso adicional que hace la recuperación mucho más difÃcil: cuando los bloques son desasignados, el tamaño del fichero y las direcciones de los bloques en el inodo son limpiados; por tanto ya no podemos determinar donde estaba el contenido del fichero. Podemos ver la relación entre la entrada de directorio, el inodo y los bloques de un fichero desasignado en la Figura 2.
Aproximaciones de recuperación
Ahora que conocemos los componente involucrados con los ficheros y cuales son limpiados durante el borrado, podemos examinar dos aproximaciones a la recuperación de ficheros (aparte de usar un backup). La primera aproximación usa el tipo de aplicación del fichero eliminado y la segunda aproximación usa los datos en el journal. Independientemente de la aproximación, deberÃa dejar de usar el sistema de ficheros porque podrÃa crear un fichero que sobreescriba los datos que está tratando de recuperar, puede detener su sistema y poner el disco en otro ordenador con un sistema Linux como un disco esclavo (slave) o arrancar desde un Linux LiveCD (knoppix o necromantux son buenas distribuciones para este tipo de tareas).
El primer paso para ambas técnicas es determinar la dirección del inodo del fichero eliminado. Esto puede ser determinado usando debugfs o The Sleuth Kit (TSK). Mostraré aquà el método usando debugfs ya que esta herramiento se incluye en muchas distribuciones Linux y es un depurador del sistema de ficheros. Para empezar con debugfs, debe saber el nombre del dispositivo de la partición que contiene el fichero eliminado. En mi ejemplo, he iniciado desde un LiveCD y el fichero está ubicado en /dev/hda5:
# debugfs /dev/hda5
debugfs 1.37 (21-Mar-2005)
debugfs:
Podemos usar el comando cd para cambiar al directorio del fichero eliminado:
debugfs: cd /home/carrier/
El comando ls -d listará los ficheros asignados y eliminados del directorio. Recuerde que la estructura de entrada de directorio almacena el nombre e inodo de los ficheros y este listado nos dará ambos valores ya que ninguno es eliminado durante el proceso de borrado. Los ficheros eliminados tendrán su dirección de inodo delimitado por «<» y «>»:
debugfs: ls -d
415848 (12) . 376097 (12) .. 415864 (16) .bashrc
[...]
<415926> (28 ) oops.dat
(Nota: esta ultima linea deberia poner un 28 entre parentesis sin espacios dentro, pero aqui hay un espacio detras del 8 para evitar caritas sonrientes)
El fichero que estamos intentando recuperar es /home/carrier/oops.dat y podemos verlo previamente asociado al inodo 415,926. El «(28)» nos indica la longitud de la estructura de entrada de directorio, pero eso no nos interesa.
Recuperación por «esculpido» de ficheros (file carving)
La primera técnica de recuperación, llamada file carving (nota del traductor: mantendré el nombre en inglés), utiliza las firmas del fichero eliminado. Muchos tipos de ficheros tienen valores estándar en los primeros bytes de la cabecera del fichero, y ésta técnica de recuperación busca los valores de cabecera del fichero eliminado para determinar donde puede que empezara el fichero. Por ejemplo, los ficheros JPEG empiezan con 0xFFD8 y terminan con 0xFFD9. Para recuperar un fichero JPEG eliminado, deberÃamos buscar en los dos primeros bytes de cada bloque hasta encontrarnos con la marca OxFFD8. Cuando encontrásemos ese bloque, deberÃamos buscar un bloque con los bytes 0xFFD9 en él. Los datos intermedios se asume que era el fichero. Desafortunadamente, no todos los tipos de ficheros tienen una firma final, por tanto determinar el final es dificil. Un ejemplo de una herramiento de código abierto que hace file carving es foremost, también existen varias herramientas comerciales.
Podemos ejecutar una herramienta como foremost en un sistema de ficheros completo, pero acabarÃamos probablemente con demasiados ficheros, incluyendo algunos ya asignados. Será preferible lanzarlo sobre cuantos menos datos sea posible. La primera manera en que podemos restringir el tamaño de los datos es examinar sólo los grupos de bloques donde el fichero estaba ubicado. Recuerde que los inodos y los bloques de un fichero están asociados a un mismo grupo de bloques, si hay espacio. En nuestro caso, sabemos que inodo usaba el fichero y por tanto podemos examinar sólo los bloques del mismo grupo. El comando imap en debugfs nos indicará a que grupo de bloques pertenece un inodo:
debugfs: imap <415926> Inode 415926 is part of block group 25
located at block 819426, offset 0x0a80
La salida del comando fsstat en TSK nos dirá también lo siguiente:
# fsstat /dev/hda5 [...] Group: 25: Inode Range: 408801 - 425152 Block Range: 819200 - 851967
A continuación, necesitamos determinar los bloques que están en el grupo de bloques del fichero eliminado. Podemos verlos en la salida del comando fsstat mostrado anteriormente, pero si estuvieramos usando debugfs, necesitamos calcular el rango. El comando stats nos da el número de bloques en cada grupo:
debugfs: stats [...] Blocks per group: 32768 [...]
Puesto que estamos buscando en el grupo de bloques 25, el rango de bloques va desde 819,200 ( 25 * 32,768 ) hasta el 851,967 ( 26 * 32,768 – 1 ). Si nos centramos sólo en estos bloques, estaremos mirando en 128Mb en lugar de en el sistema de ficheros completo. Aún asÃ, si no podemos encontrar el fichero en estos bloques, necesitaremos mirar en todo el sistema de ficheros.
El siguiente paso para reducir los datos a analizar es extraer los bloques no asignados del sistema de ficheros ya que ahà es donde nuestro fichero eliminado estará. debugfs no nos permite actualmente extraer el espacio no asignado de sólo un grupo de bloques especÃfico, por tanto deberemos usar la herramienta dls de TSK.
# dls /dev/hda5 819200-851867 > /mnt/unalloc.dat
El comando anterior nos guardará los bloques no asignados en el grupo de bloqes 25 en un fichero llamado /mnt/unalloc.dat . Asegurese que este fichero esté en un sistema de ficheros diferente ya que de otro modo podrÃa acabar sobreescribiendo su fichero eliminado.
Ahora podemos ejecutar la herramienta foremost sobre los datos no asignados. foremost puede recuperar sólo tipos de ficheros para los que se haya configurado. Si foremost no tiene la firma de cabecera para el tipo del fichero eliminado, deberá examinar algunos ficheros similar y personalizar el fichero de configuración. Podemos ejecutarlo del siguiente modo:
# foremost -d -i /mnt/unalloc.dat -o /mnt/output/
La opción -d intentará detectar que bloques son indirectos y no los incluirá en el fichero final. El directorio /mnt/output contendrá los ficheros que hayan podido ser recuperados. Si su fichero no está ahÃ, puede expandir su búsqueda a todos los bloques no asignados en el sistema de ficheros en lugar de sólo a los bloques del grupo.
Recuperación basada en journal
El segundo método para tratar de recuperar ficheros es usar el journal. Ya hemos visto que las actualizaciones de inodos se guardan primero en el journal, pero el concepto importante es que el bloque entero en el que el inodo está ubicado es guardado en el journal. Por tanto, cuando un inodo es actualizado, el journal contendrá copias de otros inodos almacenados en el mismo bloque. Versiones anteriores del inodo de nuestro fichero elimiando pueden existir en el journal porque otro fichero fuera actualizado antes del borrado.
La maner más fácil de buscar versiones anteriores del inodo es usando el comando logdump -i en debugfs:
debugfs: logdump -i <415926>
Inode 415926 is at group 25, block 819426, offset 2688
Journal starts at block 1, transaction 104588
FS block 819426 logged at sequence 104940, journal block 2687
(inode block for inode 415926):
Inode: 415926 Type: regular Mode: 0664 Flags: 0x0
User: 500 Group: 500 Size: 2048000
[...]
Blocks: (0+12): 843274 (IND): 843286
[...]
En este caso, podemos encontrar una copia previa del inodo y los bloques del contenido del fichero están listados en la última lÃnea. La última lÃnea muestra que el primer bloque del fichero es 843,274 y los siguientes 12 bloques en el sistema de ficheros son los siguientes 12 bloques del fichero. El fichero es grande y necesita un bloque indirecto, que está localizado en el bloque 843,286. Hasta aquÃ, todos los bloques son consecutivos y no habÃa fragmentación. El bloque 843,286 contiene el resto de direcciones de bloques, asà que podrÃamos buscar en una versión anterior para descubrir donde está ubicado el resto del fichero. Podemos ver si hay una copia en el journal usando logdump -b:
debugfs: logdump -b 843286 -c
Desafortunadamente, no encontramos una copia del bloque que contiene la lista original de punteros de bloque asà que, si queremos recuperar el fichero deberemos asumir que el resto del contenido del fichero está guardado en el bloque 843,287 y siguientes. Una aproximación más avanzada podrÃa también considerar qué bloques están actualmente asignados y saltarnoslos. Los datos pueden ser extraidos con herramientas tales como dd o Linux Disk Editor. El journal puede ser consultado también usando las herramientas jls y jcat de TSK.
Conclusión
La recuperación de ficheros con EXT3 no es una tema trivial, lo que refuerza el concepto de la importancia de hacer copias de seguridad de los ficheros. Si el fichero no estaba fragmentado, la búsqueda de su firma de cabecera puede ser útil, pero la herramienta necesita saber ignorar los bloques indirectos y donde parar de copiar (no todos los ficheros tienen una marca de final de fichero). Restringiendo la búsqueda al grupo de bloques local puede ahorrar mucho tiempo. El journal puede ser útil si los ficheros cerca del fichero eliminado han sido reciéntemente actualizados y por tanto existe una versión previa del inodo, pero esto no está siempre garantizado y el bloque indirecto del fichero puede no existir.
17 \17+02:00 julio \17+02:00 2007 at 8:41 am
Es logico que no sea facil recuperar un archivo borrado, es un tema de seguridad.
Si se ha borrado se ha borrado, No es bueno que se pueda recuperar, perderiamos la confidencialidad y seria como no borrarlo.
kra
17 \17+02:00 julio \17+02:00 2007 at 11:52 am
no se trata de poder recuperar ficheros eliminados consciente y voluntariamente, sinó de poder recuperar aquellos ficheros que hemos borrado por error o desastre general de un disco… si elimino involuntariamente (por error al teclear, o despiste, o el motivo que sea) una lista de ficheros deberé echar mano de las copias de seguridad, siempre y cuando las tenga, sinó evidentemente tendré que intentar recuperar lo que pueda del sistema de ficheros «excarvando» en los bits del disco
lo mismo se aplica si un dia el servidor principal de algún sitio importante cae y al reiniciar el disco se ha corrompido y no se puede acceder a sus ficheros, habrá que hacer algo para recuperar eso
no es cuestión de seguridad… evidentemente no vamos a intentar recuperar los ficheros que se han eliminado voluntariamente, y evidentemente el sistema de ficheros está diseñado para eliminar cuando se le pide eliminar precisamente por este motivo, pero asà como en modo gráfico suele haber confirmaciones de borrado, en consola puede no haberlas, y muchas veces el mantenimiento de un servidor se hace desde consola
además, si realmente nos interesa la seguridad y confidencialidad de un sistema, hay herramientas de borrado seguro (similares a las destructoras de documentos) que borran no sólo las entradas de los metadatos sinó también los datos en sà haciendo varias pasadas para eliminar todo rastro magnético del disco
17 \17+02:00 julio \17+02:00 2007 at 8:59 pm
[…] pero las técnicas no son completamente automáticas.» ArtÃculo en inglés visto en: belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-ficher/ (ahà se puede leer completamente traducido).etiquetas: ext3, ficheros, linux sin comentariosen: […]
19 \19+02:00 julio \19+02:00 2007 at 2:01 am
[…] Porqué es difÃcil recuperar un fichero borrado de EXT3 [traducción del artÃculo original que se encuentra en ésta página] Todos lo hemos hecho antes: accidentalmente […] […]
19 \19+02:00 julio \19+02:00 2007 at 6:38 am
La verdad el sistema de archivos ext3 ha sido creado para garantizar la fidelidad de los datos, y si los datos ya se han ido… pues ni modo, si fueron. A mi gusto los sistemas Linux son muy seguros.
19 \19+02:00 julio \19+02:00 2007 at 10:18 am
esto nos demuestra lo seguro y confiable que es linux
RECUERDA VISITAR
http://cableatierra.110mb.com
20 \20+02:00 julio \20+02:00 2007 at 9:02 am
No creo que poder recuperar la información sea un fallo de seguridad, para el borrado seguro ya existen herramientas que se dedican a ello.
Si se cree que el hecho de que sea difÃcil de reensamblar, dota de seguridad al método, se está en un error.
20 \20+02:00 julio \20+02:00 2007 at 9:29 pm
Coincido con el resto, para borrar y destruir completamente un fichero que queremos eliminar por completo ya hay herramientas, los que se borran por error logicamente no usaremos dichas «destructoras» de ficheros y es muy recomendable poder recuperla informacion que se ha borrado de manera accidental.
Por cierto nunca me ha pasado en mi SuSe pero funciona el ReiserFS igual que el Ext3, por que sinceramente no lo se.
16 \16+02:00 octubre \16+02:00 2007 at 2:42 pm
para los que dicen que no se puede recuperar por un tema de seguridad quiero decir que es mentira…
si tras borrar un archivo acceden al disco con un editor hexadecimal verán todos los datos!
me pasó de tener un disco en fat32 con windows, luego borré la partición, hice una ext3 e instalé ubuntu. un mes después necesité recuperar algo (cosa que no pude 😛 jaja) y al analizar el disco con un editor hexadecimal vi encabezados o archivos de texto que pertenecÃan al mismÃsimo windows.
con esto quiero decir, que el que no se puedan recuperar datos de archivos borrados de una ext3 no es un tema de seguridad, ya que si se analiza el crudo de un disco, se verá todo!
6 \06+02:00 noviembre \06+02:00 2007 at 5:05 pm
Excelente nota con datos técnicos. Si no te molesta voy a poner un link a la nota en mi blog. Gracias por la info.
Saludos
6 \06+02:00 noviembre \06+02:00 2007 at 7:32 pm
[…] Porqué es dificil recuperar un fichero borrado de EXT3 […]
16 \16+02:00 noviembre \16+02:00 2007 at 1:03 am
Bueno, si la preocupacion es borrarlo, deberian de darle un vistazo a badblocks -w, que elimina por completo los archivos, sin poder recuperarse «jamas»…
8 \08+02:00 diciembre \08+02:00 2007 at 1:18 am
[…] Utilidad para recuperar archivos de ext3 …como que eso es muy difícil, mejor leete esto: Porqué es difícil recuperar un fichero borrado de EXT3 […]
6 \06+02:00 febrero \06+02:00 2008 at 4:13 pm
[…] que los archivos eliminados puedan ser recuperados sin ningún problema, en EXT sabemos que es más complicado recuperar archivos pero aún asà es posible que algunos archivos puedan recuperarse en mayor o menor […]
29 \29+02:00 marzo \29+02:00 2008 at 11:02 am
[…] la informacion en LINUX y las posibles maneras o acciones para recuperar informacion borrada. Porqué es difÃ*cil recuperar un fichero borrado de EXT3 « Be Linux, my friend! si el archivo se borro de un MAC OS, alli si tan fucked jajajaja, por que en MAC hasta ahora no me […]
5 \05+02:00 abril \05+02:00 2008 at 1:38 am
La pregunta es si tienes info valiosa q por x motivo la quieres eliminar definitivamente, como hacer eso si cada ves salen nuevos metodos para recuperar info de un hd, de q me sirve el boton o comando eliminar si se puede recuperar, les planteo una forma de eliminar difinitivamente un archivo sin posibilidad a recuperarlo.
30 \30+02:00 julio \30+02:00 2008 at 8:04 pm
Como me posiciono en un directorio que tiene espacio en el nombre? ya intente de muchas formas y no he podido…. ejemplo:
debugfs: cd /home/Directorio con espacio/data/
13 \13+02:00 diciembre \13+02:00 2008 at 2:15 am
Respondiendo a heber…
Tienes dos opciones cuando hay caracteres especiales en los nombres (como los espacios): puede englobar toda la ruta entre comillas o bien puedes escapar los caracteres problemáticos con una barra invertida ( \ ) delante del carácter, en según que casos es más práctico lo uno que lo otro
De todas maneras, si estas escribiendo en consola, al pulsar la tecla TAB se autoexpandirá el nombre del directorio haciendo ya el escapado, en caso de haber varios directorios que coincidan con el trozo de texto escrito al pulsar el TAB, expandirá hasta donde sean diferentes y te mostrará las opciones
1 \01+02:00 agosto \01+02:00 2008 at 12:23 am
bueno ya supe… es con comillas dobles, espero a alguien le sirva eso.
cd «/home/Directorio con espacio/data»
8 \08+02:00 octubre \08+02:00 2008 at 8:27 pm
quiero borrar todo de el journal
8 \08+02:00 octubre \08+02:00 2008 at 8:28 pm
http://quiroborrartododeeljornal