Enlace a un inodo específico

14

Tengo un archivo que se eliminó, pero un programa todavía lo mantiene abierto. Encontré el número de inodo usando lsof. ¿Cómo puedo crear un enlace duro de vuelta a ese inodo?

Jeff Ferland
fuente

Respuestas:

31

No puede crear un enlace a él, pero puede recuperarlo. Hagamos un experimento:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt ya no está, pero el comando de cola mantiene vivo el inodo. Para recuperar su archivo, primero encuentre el PID del proceso manteniendo el inodo:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

El PID es 409. chdir a / proc / 409 / fd / y enumere los contenidos:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Los directorios / proc / [PID] / fd / contienen enlaces simbólicos a los descriptores de todos los archivos que utiliza el proceso. En este caso, el enlace simbólico "3" apunta al archivo eliminado. Entonces, para restaurar el archivo, copie el contenido a un nuevo archivo:

$ cat 3 >/home/mydir/saved_file.txt
soleado256
fuente
Lo he hecho con un depurador de sistema de archivos en el pasado distante (por ejemplo, "volcado de debugfs"), pero el concepto es el mismo.
Gerald Combs
1
buena respuesta, +1
asdmin
Esto no funciona para mi. Dado que '3' es un enlace simbólico colgante, no un descriptor de archivo "real", siempre crea un archivo vacío.
Rob Chanter
44
@Rob: No, no lo hace. Si el descriptor de archivo está en uso, el enlace simbólico apunta a datos válidos; de lo contrario, el enlace simbólico no existiría en primer lugar. Cuando se cierra el archivo, el enlace simbólico desaparece. Tuviste un espacio después del "3", ¿verdad? De lo contrario, generará el contenido del descriptor de archivo 3 en el shell actual, y probablemente esté vacío.
sunny256
1
El único problema con esto es que si el archivo aún se está escribiendo, la copia que realice se truncará. Probablemente no haya tiempo entre el momento en que se detiene la escritura y el archivo se cierra para hacer esto, de modo que obtenga un archivo completo.
KayEss
-8

No hay una forma portátil de hacer esto en Linux. Probablemente, la mejor manera sería hacer que cese toda actividad en el sistema de archivos, eliminar el programa que mantiene abierto el archivo, desmontar el sistema de archivos y usar un depurador del sistema de archivos para volver a adjuntarlo a un directorio. Si tiene el sistema de archivos exportado a través de NFS, al menos algunas versiones de NFS pueden permitirle leer los datos del archivo a través de NFS.

Vatine
fuente
2
puede perder el archivo una vez que
elimine