¿Dónde van los identificadores de archivos abiertos cuando mueren?


15

¿Qué sucede con los archivos que se eliminan mientras tienen un identificador de archivo abierto?

Me he estado preguntando esto desde que descubrí que podía eliminar un archivo de video mientras se estaba reproduciendo en MPlayer y todavía se reproduciría hasta el final. ¿De dónde saca los datos? ¿Sigue viniendo del disco duro? ¿Se copió a la RAM una vez que eliminé el archivo?

Si todavía está en el disco duro, ¿qué sucede si lleno el sistema de archivos mientras el programa está leyendo desde lo que es esencialmente un espacio no asignado? Si está almacenado en la memoria RAM, ¿qué sucede si enjuago los almacenamientos intermedios?

¿Qué sucede si el archivo estaba en un recurso compartido NFS? ¿Está almacenado en el servidor? (¿No es un riesgo de seguridad, DoS por toneladas de identificadores de archivos remotos abiertos?)

Hacerlo a lsof -n |grep '(deleted)'veces produce resultados interesantes; si estoy actualizando paquetes que intercambian archivos de bibliotecas compartidas, entonces ejecutar programas que habían estado usando esas bibliotecas todavía podrán usarlos como si nada hubiera cambiado.

Pregunta extra: ¿Hay alguna forma de recuperar los datos de los muertos en esta situación?

Respuestas:


13

Los inodes aún persisten en el disco, aunque no existen más enlaces duros a los inodos. Se eliminarán cuando se cierre el descriptor de archivo. Hasta entonces, el archivo se puede modificar de forma normal, salvo las operaciones que requieren un nombre de archivo / enlace duro.

debugfs y herramientas similares pueden usarse para recuperar el contenido de los inodos.


10
Esto es correcto, sin embargo, si el archivo aún está abierto, puede recuperarlo yendo a / proc / <PID> / fd donde PID es el pid de un programa que todavía tiene el archivo abierto. Este directorio contiene todos los descriptores de archivos abiertos del programa, y ​​puede acceder a ellos al igual que los archivos normales, por lo que podría crear un enlace duro para 'restaurar' el archivo.
Patrick

Tenga en cuenta que /proces específico de Linux (como es debugfs).
Ignacio Vazquez-Abrams

1
Solaris también tiene un / proc y la técnica funciona bien allí. No sé sobre BSD.
Patrick

2
Solo tengo que agregar que esto es increíble.
n0pe

1
@Patrick: No puede crear un enlace rígido para 'restaurar' un archivo /proc. Los enlaces duros solo funcionan en el mismo sistema de archivos, no en todos los sistemas de archivos y, dado que /proces un sistema de archivos separado que no se puede escribir, no puede crear enlaces duros en él. Sin embargo, podría copiar el archivo /proc.
camh

5

El núcleo hace referencia contando con referencias al inodo. Vea mi respuesta a ¿Qué sucede cuando cierro () un descriptor de archivo? .

Eliminar archivos abiertos probablemente no sea un mecanismo DOS más efectivo que simplemente abrir archivos. Los ulimitarchivos abiertos proporcionan cierta protección contra este intento de DOS. Se aplica a todos los archivos abiertos, eliminados o no.


5

Un archivo solo se borra en el sistema de archivos una vez que cada referencia a él ha desaparecido. Ambos nombres y asas abiertas cuentan como referencias. Mientras el archivo esté abierto en un programa, no se eliminará, aunque la mayoría de los sistemas no le permiten recrear un nombre para él.

Los datos todavía están en la unidad, pero el archivo está marcado como que tiene un recuento de enlaces de 0. Si el sistema falla, fsck en el próximo reinicio sabe que debe eliminar los datos. Esto no conduce a una denegación de servicio más de lo que lo hace un archivo no eliminado.

Por lo que sé, no puede volver a crear un enlace al archivo en un sistema Linux estándar (sin pasar por alto el controlador del sistema de archivos con debugfsmétodos similares), pero puede recuperar el contenido fácilmente: cat /proc/12345/fd/42donde 12345 es la ID del proceso que tiene abierto el archivo y 42 es el número de descriptor de archivo.

A través de NFS, cuando elimina un archivo que todavía está abierto en algún cliente, el servidor NFS cambia el nombre del archivo en el servidor pero no lo elimina hasta que todos los clientes hayan liberado el archivo. En mi experiencia, el nuevo nombre es .nfs…, aunque no sé si el nombre es el mismo en todas las implementaciones de NFS.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.