miércoles, 18 de marzo de 2009

Ups, borrado accidental

Hasta en las mejores familias y en los teclados de los más expertos puede ocurrir un error.

No recuerdo la última vez que he borrado datos de mi ordenador, tanto en el trabajo como en casa, pero sí recuerdo perfectamente las últimas veces que he visto a un compañero o amigo hacer una abarconada de este calibre. :-P

Un domingo cualquiera, estaba en casa compilando la ultima versión de mplayer, cuando termino de instalarlo, hago el habitual rm -Rf *, pero sólo dos segundos después, observo aterrorizado que no estoy en el directorio ./mplayer, sino en mi home. :-O


En este artículo cuento lo que hice para recuperar datos borrados accidentalmente en un filesystem ext3.

Consejos

Basados en esta experiencia y leer muchos foros:
  • Anotar la hora exacta del borrado
  • No escribir nada en el filesystem
  • Si es posible, hacer una imagen del filesystem a otro disco
  • Si tienes ext3, no desmontar el filesystem, para evitar hacer commit del journal
  • Arrancar desde USB o CDROM sin tocar el disco
  • Montar otro disco fisico para grabar los datos recuperados
  • Obtener la utilidad ext3grep

Preparar el entorno

Arrancar con un linux LiveCD, yo usé el CD de Ubuntu 8.10.

La manera más habitual de obtener la utilidad es descargar el código fuente y compilar ext3grep. Si quieres ahorrar tiempo, aconsejo descargar los paquetes compilados para Ubuntu en la arquitectura que corresponda. En mi caso uso AMD64, así que bajo el ext3grep_0.10.1-1_amd64.deb

Montar un disco nuevo para las recuperaciones

He usado un disco externo por USB de 1 TB y con gparted lo formateo a ext3. Para averiguar los discos que tengo conectados nada más sencillo que fdisk

$ sudo fdisk -l

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0002bf9d

Device Boot Start End Blocks Id System
/dev/sda1 * 1 6104 49030348+ 83 Linux
/dev/sda2 6105 121601 927729652+ 5 Extended
/dev/sda5 6105 6602 4000153+ 82 Linux swap / Solaris
/dev/sda6 6603 121601 923729436 83 Linux

Disk /dev/sdb: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x004e8050

Device Boot Start End Blocks Id System
/dev/sdg1 1 121601 976760001 83 Linux


En mi caso, el disco con datos borrados es /dev/sda6.
El disco que he conectado para recuperar los datos es /dev/sdg1.

Montar el disco de recuperación como escritura.

$ mkdir restore
$ sudo mount -o rw,users /dev/sdg1 /home/ubuntu/restore
$ cd restore
$ sudo chmod 777 .


Averiguar que ficheros son recuperables

Para que ext3grep revise todo el filesystem con los datos borrados.

$ sudo ext3grep /dev/sda6 --dump-names > deleted.txt


Cuando termina la revisión, genera dos ficheros

$ ls -ltr | tail -2
-rw-r--r-- 1 root root 131709 2009-03-09 23:59 sda6.ext3grep.stage1
-rw-r--r-- 1 root root 322875 2009-03-10 00:00 sda6.ext3grep.stage2


En mi caso, el borrado fue después de las 23:00 del día 8 de Marzo. Para convertir este momento a formato time stamp de Unix, es decir aquello del número de segundos transcurridos después del 1 de Enero de 1970, puedes usar TimeStamp Generator.

Recuperación de datos

Ahora es cuando por fin, empieza la recuperación que se lleva sus horitas...

$ time sudo ext3grep /dev/sda6 --restore-all --after 1236553200 --before 1236556620 > restore.log

Running Revision: 145
Only show/process deleted entries if they are deleted on or after Sun Mar 8 23:00:00 2009 and before Sun Mar 8 23:57:00 2009.

WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 7048
Minimum / maximum journal block: 115409410 / 115442725
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1236514181 = Sun Mar 8 12:09:41 2009
Journal transaction 885060 wraps around, some data blocks might have been lost of this transaction.
Number of descriptors in journal: 29267; min / max sequence numbers: 882320 / 887418
Loading sda6.ext3grep.stage2.........


real 136m0.075s
user 3m12.196s
sys 59m43.200s


Fuente