miércoles, 20 de febrero de 2008

Recuperar archivos borrados en ext3

Usaremos los comandos siguientes :
debugfs, para saber los bloques
dls, para volcar contenidos

Conviene leerselo antes de que la hayas cagado...

1) Apagas a capon (nada de shutdown ni halts ni inits a ser posible) para evitar que se escriban nuevos datos en los espacios de los borrados

2) Arrancas otro linux (desde hd o usb a ser posible para escribir los archivos recuperados)

3) Imaginamos que el hdb1 es la particion donde perdimos los datos, hacemos :
debugfs /dev/hdb1

4) Vamos al directorio donde borramos los archivos
debugfs : cd /home/web/src/blog/scripts

5) Hacemos un ls -d para ver los inodes de los archivos borrados
debugfs : ls -d

Nos devolvera algo como esto :

211095 (12) . 210082 (4084) .. <209240> (56) variables.cfg
<211150> (32) basic-crear-bbdd.sh <211151> (4016) vssver.scc
<211301> (40) alac-update-a-lastest-engine.sh
<209241> (68) perso-update-a-lastest-engine.sh
<211150> (28) blog-crear-bbdd.sh
<210646> (3888) src-actualizar-lastest-engine.sh
los numeros entre <> son los inodes


6) Hayamos el grupo de bloques donde se encuentra el inode de los archivos con imap <inode> (Con <> incluido)
debugfs : imap <209240>

Nos devolvera algo como esto :

Inode 209240 is part of block group 13
located at block 426000, offset 0x0b80
los numeros entre <210646> son los inodes


Para este caso ya sabemos que es el 13

7) Hayamos de que bloque a que bloque esta el grupo con stats
debugfs : stats

Nos devolvera algo como esto :


Filesystem volume name: /
Last mounted on:
Filesystem UUID: 39ab69c0-e7e2-4a09-87e8-10037fcc2c4b
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal filetype sparse_super
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 497984
Block count: 996022
Reserved block count: 49801
Free blocks: 757815
Free inodes: 442389
First block: 0
Block size: 4096
Fragment size: 4096
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 16064
Inode blocks per group: 502
Last mount time: Tue Feb 19 11:11:35 2008
Last write time: Wed Feb 20 09:49:25 2008
Mount count: 14
Maximum mount count: 30
Last checked: Thu Jan 10 12:17:41 2008
Check interval: 0 ()
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
Journal backup: inode blocks
Directories: 3939
Group 0: block bitmap at 2, inode bitmap at 3, inode table at 4
22861 free blocks, 15910 free inodes, 34 used directories
Group 1: block bitmap at 32770, inode bitmap at 32771, inode table at 32772
31451 free blocks, 14577 free inodes, 3 used directories
Group 2: block bitmap at 65536, inode bitmap at 65537, inode table at 65540
29671 free blocks, 14596 free inodes, 62 used directories
Group 3: block bitmap at 98306, inode bitmap at 98307, inode table at 98308
30286 free blocks, 15010 free inodes, 67 used directories
Group 4: block bitmap at 131072, inode bitmap at 131073, inode table at 131076
20250 free blocks, 15340 free inodes, 5 used directories
Group 5: block bitmap at 163842, inode bitmap at 163843, inode table at 163844
27584 free blocks, 14913 free inodes, 105 used directories
Group 6: block bitmap at 196608, inode bitmap at 196609, inode table at 196612
24565 free blocks, 13511 free inodes, 239 used directories
Group 7: block bitmap at 229378, inode bitmap at 229379, inode table at 229380
30981 free blocks, 14879 free inodes, 30 used directories
Group 8: block bitmap at 262144, inode bitmap at 262145, inode table at 262148
26882 free blocks, 14216 free inodes, 129 used directories
Group 9: block bitmap at 294914, inode bitmap at 294915, inode table at 294916
28672 free blocks, 14694 free inodes, 105 used directories
Group 10: block bitmap at 327680, inode bitmap at 327681, inode table at 327684
21608 free blocks, 14267 free inodes, 117 used directories
Group 11: block bitmap at 360448, inode bitmap at 360449, inode table at 360452
29480 free blocks, 14500 free inodes, 87 used directories
Group 12: block bitmap at 393216, inode bitmap at 393217, inode table at 393220
21167 free blocks, 14793 free inodes, 84 used directories
Group 13: block bitmap at 425984, inode bitmap at 425985, inode table at 425988
20193 free blocks, 12784 free inodes, 305 used directories

Group 14: block bitmap at 458752, inode bitmap at 458753, inode table at 458756
29393 free blocks, 14664 free inodes, 100 used directories
Group 15: block bitmap at 491520, inode bitmap at 491521, inode table at 491524
26638 free blocks, 13954 free inodes, 42 used directories
Group 16: block bitmap at 524288, inode bitmap at 524289, inode table at 524292
27210 free blocks, 12036 free inodes, 30 used directories
Group 17: block bitmap at 557056, inode bitmap at 557057, inode table at 557060


Lo que nos interesa para este caso es los Blocks per group y el Group 13

Blocks per group : 32768
Group 13: block bitmap at 425984, inode bitmap at 425985, inode table at 425988


Nos da que empieza en 425984 (Esto es igual a multiplicar [Group] * [Blocks per group] 13 * 32768) y termina en 425984 + 32768 - 1 = 458751 ([Donde empieza] + [Blocks per group] - 1)

ya nos podemos salir de debugfs
debugfs : q

8) Volcamos los datos a un archivo con dls -eA dispositivo bloqueini-bloquefin > archivo
dls -eA /dev/hdb1 425984-458751 > /tmp/volcado.dls

Con esto conseguimos que sea mucho menor el espacio donde tenemos que buscar. (128 Mb en este caso)

9) En mi caso necesitaba recuperar archivos de texto plano, asi que hice un less del archivo y fui buscando los datos que necesitaba, luego copy y paste a un nuevo archivo. Ademas todos los archivos estaban en el mismo grupo, con lo que no me hizo falta volcar mas grupos de bloques.
less /tmp/volcado.dls

Estuve intentando usar foremost pero fui incapaz de hacerlo funcionar con esos archivos, me recuperaba un puñao de ficheros pero no lo que necesitaba.

muchisimas gracias a este post : http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/

2 comentarios:

Martin Edmundo dijo...

¿Por que volcar el archivo desde el inicio del grupo? ¿Por que no volcarlo desde el bloque 426000 al bloque final del grupo 458751?

moz667 dijo...

¿por que desde el bloque 426000?

Seguidores