Borrado de archivos que están siendo leídos
Publicado: 21 Febrero, 2010 - 14:04 Borrado de archivos que están siendo leídos
El otro día hablaba con un compañero de trabajo y le comentaba que en Linux, por defecto, puedes borrar un archivo incluso si está siendo usado por una aplicación. Por ejemplo: Tengo abierto un archivo de texto con gedit y puedo borrarlo sin problemas. Siempre he dado por hecho que el archivo estaba en memoria. La pregunta siguiente fue obvia, ¿y si el archivo es más grande que la RAM del ordenador?
He hecho la prueba con un archivo de 700 MB (mi ordenador tiene 512 MB) y todo ha ido bien, puedes ver cualquier parte de la película como si el archivo no hubiera sido borrado. ¿Sabéis cómo se consigue esto? Me he quedado con la duda y me gustaría resolverla.
- Inicie sesión o regístrese para enviar comentarios
- 685 lecturas


¿Y la swap de qué tamaño es?
No hay swap. La he quitado con
swapoff -aEl otro día hablaba con un compañero de trabajo y le comentaba que en Linux, por defecto, puedes borrar un archivo incluso si está siendo usado por una aplicación. Por ejemplo: Tengo abierto un archivo de texto con gedit y puedo borrarlo sin problemas. Siempre he dado por hecho que el archivo estaba en memoria. La pregunta siguiente fue obvia, ¿y si el archivo es más grande que la RAM del ordenador?
He hecho la prueba con un archivo de 700 MB (mi ordenador tiene 512 MB) y todo ha ido bien, puedes ver cualquier parte de la película como si el archivo no hubiera sido borrado. ¿Sabéis cómo se consigue esto? Me he quedado con la duda y me gustaría resolverla.
Para el sistema los archivos son direcciones de la tabla de inodos, de modo que cuendo borras un archivo en realidad estás quitando la referencia al inodo, no borrandolo físicamente del disco.
El otro día hablaba con un compañero de trabajo y le comentaba que en Linux, por defecto, puedes borrar un archivo incluso si está siendo usado por una aplicación. Por ejemplo: Tengo abierto un archivo de texto con gedit y puedo borrarlo sin problemas. Siempre he dado por hecho que el archivo estaba en memoria. La pregunta siguiente fue obvia, ¿y si el archivo es más grande que la RAM del ordenador?
He hecho la prueba con un archivo de 700 MB (mi ordenador tiene 512 MB) y todo ha ido bien, puedes ver cualquier parte de la película como si el archivo no hubiera sido borrado. ¿Sabéis cómo se consigue esto? Me he quedado con la duda y me gustaría resolverla.
Para el sistema los archivos son direcciones de la tabla de inodos, de modo que cuendo borras un archivo en realidad estás quitando la referencia al inodo, no borrandolo físicamente del disco.
Buena respuesta

Para el sistema los archivos son direcciones de la tabla de inodos, de modo que cuendo borras un archivo en realidad estás quitando la referencia al inodo, no borrandolo físicamente del disco.
Ahora entiendo por qué siempre he podido renombrar archivos MP3 mientras se están reproduciendo.
Gracias ratakruel,
Sidd.
El otro día hablaba con un compañero de trabajo y le comentaba que en Linux, por defecto, puedes borrar un archivo incluso si está siendo usado por una aplicación. Por ejemplo: Tengo abierto un archivo de texto con gedit y puedo borrarlo sin problemas. Siempre he dado por hecho que el archivo estaba en memoria. La pregunta siguiente fue obvia, ¿y si el archivo es más grande que la RAM del ordenador?
He hecho la prueba con un archivo de 700 MB (mi ordenador tiene 512 MB) y todo ha ido bien, puedes ver cualquier parte de la película como si el archivo no hubiera sido borrado. ¿Sabéis cómo se consigue esto? Me he quedado con la duda y me gustaría resolverla.
Para el sistema los archivos son direcciones de la tabla de inodos, de modo que cuendo borras un archivo en realidad estás quitando la referencia al inodo, no borrandolo físicamente del disco.
Eso es cierto, aunque se borre esa referencia al inodo que representa ese archivo, el descriptor del mismo sigue existiendo, hasta que no se lo cierre el acceso al archivo se puede seguir haciendo.
Pero ignoro el comportamiento del sistema de ficheros si alguna porción física en disco correspondiente a ese archivo ya borrado fuera utilizado y reescrito mientras se sigue leyendo:
¿Se leerian los datos del nuevo archivo?
¿y si esos datos fueran de propiedad de otro usuario?
¿podría accederse a información sensible?
¿incluso se podria reescribir los datos?
o tal vez el borrado y mapa de bits de bloques libres no se realiza hasta que el descriptor es cerrado, ignoro eso.
Me llama la atención ya que desconocía ese comportamiento que dices. Sabia que se podía borrar un archivo abierto (de hecho he escrito scripts bash que antes de terminar de ejecutarse se borraban a si mismos) pero pensé que se tendría acceso solo a los datos que ya habían sido almacenados en la caché de lectura.
Me tocará estudiar un poco este interesante aspecto.
Aqui la gracia está en la propia semántica del borrado en un sistema de ficheros POSIX.
Sólo se borra el fichero (en este caso la dirección de un inodo nada más) cuando el último descriptor abierto sobre él se cierre.
Es decir, si tienes abierto el fichero con Gedit y lo borras con rm, el borrado del inodo queda aplazado hasta que cierres el fichero en Gedit, esto también implica que si desde el gedit le das a guardar el borrado ya no estaría aplazado sino que estaría cancelado.
Saludos.
A ver si lo he entendido bien que yo en estos temas me suelo liar un poco, por lo que parece al ejecutar un rm chequea si el archivo (o mas bien su direccion en la tabla de inodos) esta siendo usada si no lo esta ejecuta el borrado y si esta usada espera a que deje de estarlo, esto me lleva a la conclusion de que al guardar el archivo abierto con un editor de texto que ha sido previamente borrado la direccion de la tabla de inodos varia. ¿Es asi?
Edito mirando el articulo de la wikipedia sobre los inodos
El número de enlaces se emplea por el sistema operativo para eliminar el archivo del sistema de ficheros, tanto el inodo como el contenido, cuando se han borrado todos los enlaces y el contador queda a cero.
No si haces lo siguiente:
* Abrir fichero con gedit
* Borrar fichero
* Guardar fichero en gedit
la tabla de inodos se queda como estaba al principio.
Saludos.
No si haces lo siguiente:
* Abrir fichero con gedit
* Borrar fichero
* Guardar fichero en gedit
la tabla de inodos se queda como estaba al principio.
Saludos.
Pero en este caso el numero de enlaces que forma parte del propio inodo no seria 0, por lo tanto el archivo no se borraria, en caso de no guardar el fichero con gedit despues de haberlo abierto y despues borradoel numero de enlaces si seria 0 con lo que el archivo se borraria.