¿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?
fuente
/proc
es específico de Linux (como esdebugfs
)./proc
. Los enlaces duros solo funcionan en el mismo sistema de archivos, no en todos los sistemas de archivos y, dado que/proc
es 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
.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
ulimit
archivos abiertos proporcionan cierta protección contra este intento de DOS. Se aplica a todos los archivos abiertos, eliminados o no.fuente
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
debugfs
métodos similares), pero puede recuperar el contenido fácilmente:cat /proc/12345/fd/42
donde 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.fuente