martes, 30 de junio de 2009

Recuperar archivos borrados usando lsof

Una de las cosas precisas que puede hacer con la herramienta versátil lsof es usarla para recuperar archivos que borraste por casualidad o accidentalmente.

Un archivo en Linux es un puntero a un inode, el cual contiene información sobre el archivo (permisos, propietario, y donde esta su contenido actual en el disco). Borrando el archivo se remueve el enlace al inode, pero no el inode mismo, si otro proceso lo tiene abierto, el inode no es soltado para escritura hasta que el proceso termine con el.

Para probar esto, crea un archivo de texto, guardalo como "ejemplo.txt" y luego en un terminal ejecutas less ejemplo.txt. Ahora abre otro terminal y ejecuta rm ejemplo.txt. Si ahora intentas hacer ls ejemplo.txt recibirás un mensaje de error, ya que el enlace del archivo a sido removido. Sin embargo el comando less aun mantiene la referencia al archivo. Entonces ejecuta:


# lsof | grep ejemplo.txt
less 3274 ubuntu 4r REG 117,0 5 76104
/home/d/ejemplo.txt(deleted)

Las columnas mas importantes son la segunda, que te da el PID del proceso que tiene el archivo abierto (3274) y la cuarta que te da el descriptor del archivo (4). Ahora, observa en /proc, donde todavía hay una referencia al inode, desde el cual puedes copiar de vuelta el archivo:

# ls -l /proc/3274/fd/4
lr-x------ 1 ubuntu ubuntu 64 2009-06-30 16:15 /proc/3274/fd/4 ->
/home/d/ejemplo.txt (deleted)

# cp /proc/3274/fd/4 ejemplo.txt

Nota: no uses la opción -a con el comando cp, el cual solo copia el enlace simbólico y no el archivo de contenido actual.

Ahora revisa el archivo para asegurarte que has obtenido el archivo con el contenido que querías.

Obviamente las circunstancias no siempre serán como esta para poder usar esta técnica, ya que si otro proceso no tiene el archivo abierto esta técnica no funcionara.

Fuente.

No hay comentarios: