TEMA 7 GESTIÓN DE FICHEROS Y DIRECTORIOS. FUNCIONES Y ESTRUCTURA DE UN SGF Un Sistema de Gestión de Ficheros (SGF) es aquel sistema software que proporciona a los usuarios y aplicaciones un conjunto de servicios relativos al empleo de ficheros. Al ser la única forma de acceder a los ficheros, es necesario desarrollar software de propósito específico para cada aplicación. Esta funcionalidad del SGF puede resumirse en cuatro grandes puntos: El SGF es responsable de la gestión de los soportes físicos de la información (por supuesto a través de los correspondientes drivers) ocultando al usuario los detalles de la organización física de los ficheros. El SGF es responsable de garantizar la seguridad y protección de los ficheros, asegurando la integridad de estos en caso de incidente, así como de garantizar que se respeten las reglas de utilización establecidas. El SGF implementa la parte de alto nivel de las E/S independientes de dispositivo. El SGF realiza la correspondencia entre las organizaciones lógica y física de los ficheros. La organización lógica vendrá definida por los usuarios en función de la naturaleza de la aplicación concreta de que se trate. La organización física está directamente relacionada con los dispositivos de almacenamiento. NOCIONES SOBRE FICHEROS Los ficheros son entidades que permiten el almacenamiento de datos y programas. El concepto de fichero está soportado por el SGF que gestiona los dispositivos de almacenamiento masivo. Es el sistema de ficheros quien se interpone entre el dispositivo físico de almacenamiento secundario y el usuario, ocultando a este último las características físicas del dispositivo y dotándole de una herramienta lógica de manipulación de la información independiente del dispositivo concreto. Es una unidad de almacenamiento lógico que hace abstracción de las características físicas del dispositivo. Desde el punto de vista de su contenido, podeos decir que un fichero es una colección de informaciones relacionadas que han sido definidas por su creador. Cuando se habla de ficheros se utilizan cuatro términos comunes: Campo. Elemento de datos básico. Un campo individual contiene un valor único. Su contenido es proporcionado por un usuario o un programa. Registro. Es una colección de campos relacionados que pueden tratarse como una unidad en algunos programas de aplicación (ejemplo: registro empleado contiene nombre, apellidos, DNI, . . .). Fichero. Es una colección de registros similares. Los usuarios y las aplicaciones tratan al fichero como una entidad única y se refieren a él por un nombre. Base de datos. Colección de datos relacionados. Las relaciones existentes entre los datos son explicitas y que están diseñadas para ser usadas por varias aplicaciones. Consta de una o más clases de ficheros. TIPOS DE FICHEROS Regular (-): ficheros que contienen información introducida por un usuario, un programa de aplicación, un programa de utilidad del sistema o un usuario. ASCII o binarios Directorios (d): Contiene una lista de nombres de fichero y punteros a inodos (nodos de información) asociados. Los directorios están organizados jerárquicamente. Los ficheros de directorio son en realidad ficheros regulares con unos privilegios especiales de protección de forma que solo el sistema de ficheros pueda escribir en ellos, mientras que los programas de usuario disponen de acceso de lectura. Especiales: Usados para acceder a dispositivos periféricos, como terminales o impresoras. Cada dispositivo de E/S está asociado a un fichero especial, que puede ser de bloques (b) o de caracteres (c), en función de cómo se realiza la transferencia de datos con el periférico. Enlace simbólico (l): Es un camino a otro fichero del sistema de ficheros. Pipes o tuberías (p): Fichero temporales que permiten la comunicación entre procesos. PROPIEDADES O ATRIBUTOS DE LOS FICHEROS Todo fichero consta de un nombre, la información contenida en ´el y una información adicional acerca del propio fichero como entidad del SGF. Esta información adicional contiene los atributos del fichero. Tipo de fichero. Esta información es necesaria en aquellos sistemas que soportan varios tipos. Localización. Es un puntero a un dispositivo y la localización del fichero en dicho dispositivo. Protección asociada al fichero. Especifica quien puede y quien no puede acceder al mismo, así como el modo de acceso (lectura, escritura, ejecución, . . .). Identificador del usuario creador. Identificador del usuario propietario actual. Fecha de creación. Fecha de la última modificación. Tamaño (en bytes, palabras o bloques). Operaciones sobre ficheros Los ficheros permiten almacenar información en dispositivos de memoria secundaria con independencia del dispositivo particular. Un fichero puede ser atendido como un tipo abstracto de datos sobre el que están definidas una serie de operaciones que se invocan mediante llamadas al sistema donde el nombre del fichero actúa como parámetro. crear (Fichero, Atributos) El fichero es creado en el sistema con el nombre y los atributos indicados. borrar (Fichero) El fichero es eliminado del sistema de ficheros. abrir (Fichero, operaciones Permitidas) La apertura de un fichero provoca la creación de una estructura en memoria llamada descriptor de fichero que recoge los atributos del fichero y su ubicación en el disco. Asimismo, la apertura de un fichero origina la creación de un buffer en memoria principal donde se almacenan los bloques leídos del disco y desde donde se escriben los bloques al disco. cerrar (Fichero) Con esta operación se libera el descriptor de fichero y la memoria asignada a las operaciones de entrada y salida. leer (Fichero, Buffer, NumeroDeRegistrosLogicos) La llamada al sistema especifica el fichero, el número de los registros lógicos que queremos leer desde la posición actual y la estructura de datos en espacio de usuario donde se almacenarán estos. En sistemas con ficheros no estructurados, como Unix, un registro lógico es un byte, por lo que el tercer parámetro es el número de bytes que se leen. escribir (Fichero, Buffer, NumeroDeRegistrosLogicos) La llamada al sistema especifica el fichero, el número de los registros lógicos que queremos escribir desde la posición actual y la estructura de datos en espacio de usuario donde residen los registros lógicos. posicionar (Fichero, NumeroDeRegistrosLogicos) Esta operación aparece en ficheros de acceso aleatorio. Contiene como parámetros el nombre del fichero y el número de secuencia del registro lógico al que queremos acceder obtener Atributos (Fichero) Permite obtener los atributos del fichero pasado como parámetro. poner Atributos (Fichero, Atributos) Permite cambiar los atributos del fichero pasado como parámetro. renombrar (Fichero) Permite cambiar de nombre a un fichero. En MS-DOS Dir a*: listado de los ficheros del directorio actual que comienzan por a. Type pepe: muestra por pantalla el contenido del fichero pepe. Del pepe: borra el fichero pepe. Copy pepe copia: copia el fichero pepe y al nuevo fichero le da el nombre copia. Rename pepe nuevo: renombra el fichero pepe, siendo el nuevo nombre nuevo. En Windows Las llamadas al sistema para la manipulación de ficheros pueden ser utilizadas bien de forma directa desde un programa, o de forma indirecta a través de los comandos de la Shell del sistema operativo. DIRECTORIOS El directorio contiene información sobre los ficheros que pertenecen a él. Gran parte de la información, especialmente la de almacenamiento, es gestionada por el S.O. Un directorio es un fichero del S.O. accedido únicamente a través de rutinas de gestión de ficheros. La mayor parte de la información se proporciona indirectamente a usuarios y aplicaciones a través de rutinas del sistema. Los usuarios no acceden directamente al directorio, incluso en modo lectura. ESTRUCTURA DE DIRECTORIOS Un sistema de directorio proporciona un mecanismo para dotar a los numeroso ficheros del sistema de una estructura lógica. La organización de los ficheros atiende a un criterio jerárquicos. En el nivel más alto se encuentra el denominado directorio raíz. El directorio raíz es un fichero que contiene una tabla. Las entradas de dicha tabla son de dos tipos: ficheros y subdirectorios. La información que puede almacenarse en cada entrada de directorio es la siguiente: Nombre del fichero, Tipo de fichero (Texto, binario, Volumen), Dirección de comienzo, tamaño usado y asignado, propietario, información de acceso, acciones permitidas, fecha de creación, fecha de última lectura, identidad del último lector, fecha de última modificación, identidad del último modificador, fecha de la última copia de seguridad, utilización actual ESTRUCTURA DE ÁRBOL (DE PROFUNDIDAD ARBITRARIA) Los directorios contienen ficheros (bit en la entrada a 0) o subdirectorios (bit en la entrada a 1). Permite a los usuarios crear su propia estructura de subdirectorios dada por diferentes temas: datos, programas, textos, . . . Al utilizar una estructura de árbol es necesario introducir nuevas operaciones de gestión de subdirectorios (creación, eliminación) e implementarlas mediante nuevas llamadas al sistema. El árbol tiene un directorio raíz. Cada fichero en el sistema tiene un único camino (camino desde la raíz, a través de todos los subdirectorios, hasta un fichero especificado) El sistema de ficheros proporciona servicios para cambiar de directorio actual y cuando se referencia un fichero, este se busca en el directorio actual. El directorio actual tiene influencia en el tratamiento que se da a una ruta de fichero: Ruta absoluta de nombre de fichero: comienza en el directorio raíz. Ruta relativa al directorio actual de nombre fichero: comienza en el directorio actual. Prohíbe la compartición de ficheros o directorios. Sistemas operativos que implementan este sistema de directorios: DOS y Windows. ESTRUCTURA DE GRAFO ACÍCLICO Un grafo acíclico es una generalización de una estructura de árbol que permite a los directorios tener ficheros o subdirectorios compartidos (hay varias entradas de directorio apuntando a ese fichero o directorio). Los ficheros y subdirectorios compartidos pueden ser implementados de diferentes maneras: Creación de un enlace simbólico: Se crea una nueva entrada de directorio que es realmente un nuevo fichero de tipo especial que hace referencia al fichero o subdirectorio compartido mediante una ruta relativa o absoluta. Cuando se hace una referencia a un fichero especial, el sistema busca el fichero en el directorio actual. Si la búsqueda tiene éxito y la entrada del directorio está marcada como enlace, se toma esa ruta como referencia al fichero objetivo. Creación de un enlace no simbólico. Se crea una nueva entrada de directorio con contenido igual a la entrada de directorio del fichero sobre el que se hace el enlace. No se crea un nuevo fichero, se añade una entrada de directorio que hace referencia un fichero que existe previamente. Problemas derivados del grafo acíclico: Las operaciones que involucren un recorrido de la estructura de directorios (backup o recoger información estadística) no deben recopilar dos veces información de un mismo fichero, debido a enlaces. Para liberar y reusar el espacio asignado a un fichero se borran las entradas de directorio y sólo se borran los ficheros cuando se borra el último nombre que lo referencia mediante enlaces no simbólicos. Para ello se dispone de un contador que decrementa en cada operación de borrado y se liberará el espacio de memoria física cuando el contador sea igual a 0. OPERACIONES SOBRE DIRECTORIOS CrearDir(Directorio) Crea un subdirectorio en el directorio actual. BorrarDIr(Directorio) Borra un subdirectorio del directorio actual. CambiarDir(Directorio) Cambia el directorio actual al directorio especificado como parámetro. Es posible especificar el directorio al que se quiere acceder de forma absoluta (al directorio raíz) o de relativa al directorio actual. Mostrar(Directorio) Obtiene una relación de los ficheros y los subdirectorios de un directorio y la información asociada a cada uno de ellos. Enlazar(fich1, fich2) Permite que un fichero pueda aparecer en varios directorios. link(fichero) en Unix Desenlazar(fichero) Se borra una entrada del directorio. Si el fichero está sólo presente en un directorio es borrado del sistema de ficheros. Si está presente en varios directorios, permanece en el sistema. Unlink (fichero) en Unix. ALMACENAMIETNO DE LOS FICHEROS En disco, un fichero consta de un conjunto de bloques. El sistema operativo o el sistema de gestión de ficheros es responsable de la asignación de los bloques de disco a los ficheros. Esto plantea dos cuestiones: debe elegirse cómo asignar el espacio de disco a los ficheros y es necesario guardar constancia del espacio disponible para asignar En la asignación de ficheros surgen varias cuestiones: 1. 2. 3. Cuando se crea un nuevo fichero, ¿se asigna de una sola vez el máximo espacio que necesite? El espacio se asigna a un fichero en forma de una o más unidades contiguas, que se llaman secciones. El tamaño de una sección puede variar desde un ´único bloque a un fichero entero. ¿Qué tamaño de sección debería usarse para asignar ficheros? ¿Qué tipo de estructura de datos o tabla se usaría para guardar constancia de las secciones asignadas a un fichero? Dicha tabla se conoce normalmente como tabla de asignación de ficheros. Para poder acceder al contenido de los ficheros es necesario realizar una traducción desde la visión lógica de los ficheros (cómo los ve el usuario final) a la visión física (cómo están almacenados realmente en disco). Ante una llamada al sistema de lectura de un fichero hay que realizar una serie de pasos para obtener los bloques físicos. A partir de la posición actual de lectura del fichero, la llamada al sistema read indica cuántos bytes se van a leer, se delimitan en el fichero lógico (secuencia de bytes) las posiciones de inicio y final de los datos a leer. Como la información almacenada en los ficheros está agrupada en bloques, se debe identificar a qué bloques lógicos corresponde la información a leer. Se obtienen los bloques lógicos que se deben leer del disco. Muy probablemente no se necesite la información completa contenida en el primer y último bloque, pero se ha de obtener todo el bloque del disco al ser la unidad mínima de lectura y escritura. Para cada bloque lógico se ha de obtener en qué bloque físico está almacenado. Esto depende del proceso de asignación de bloques y del diseño de la tabla de asignación de ficheros. ESTRATEGIAS DE ASIGNACIÓN DE ESPACIO El objetivo de un método de asignación es el espacio debe ser asignado para aprovecharlo de forma eficaz y, por otra, el acceso al fichero debe ser lo más rápido posible. ASIGNACIÓN CONTINUA Cuando se crea un fichero se le asigna un único conjunto contiguo de bloques. Es una estrategia de asignación previa que emplea secciones de tamaño variable. La tabla de asignación de ficheros necesita una entrada por cada fichero que muestre el bloque de comienzo y la longitud. Facilita el acceso secuencial. Se pueden traer múltiples bloques de una vez para mejorar el rendimiento en los tratamientos secuenciales. La recuperación de un bloque es sencilla: si un fichero empieza en el bloque b y se necesita el bloque i-ésimo del fichero, su ubicación en memoria secundaria viene dada por b+i. El principal inconveniente es la fragmentación externa que surge conforme los ficheros son creados y borrados lo que hace que, aunque exista espacio suficiente para contener un fichero, no se pueda asignar por no disponer de suficiente espacio contiguo. Para prevenir pérdidas de espacio por fragmentación externa, el usuario debe ejecutar un procedimiento de compactación, que consiste en una reasignación de los ficheros del disco en nuevos bloques físicos para obtener un único y gran hueco al final. Primer ajuste y siguiente ajuste: Se examina la lista de huecos libres y se asigna al fichero el primer hueco que tenga un tamaño suficiente para contenerlo. La búsqueda puede comenzar donde terminó el anterior ajuste (siguiente ajuste) o al comienzo de la colección de huecos (primer ajuste). Tiene la ventaja de la rapidez y el inconveniente de mala utilización del espacio del disco ya que deja muchos pequeños espacios que no podrán ser usados. Mejor ajuste: Asignación del hueco más pequeño que pueda contener al fichero. Permite aprovechar mejor el espacio del disco, pero es más lento ya que la lista debe ordenarse o recorrerse enteramente. Produce espacios libres de más pequeños que el método anterior. Peor ajuste: Se asigna el hueco más grande. Consigue que es espacio libre que queda sea lo suficientemente grande para contener más ficheros, pero no permite la existencia de ficheros grandes. Es lento ya que a no ser que esté ordenada, ya que la lista debe estar ordenada o recorrerse enteramente. El método que funciona peor es el peor ajuste. Los otros dan mejores resultados de tiempo y de utilización del almacenamiento. El método del primer ajuste es el más rápido. Otro problema es la inserción. Si se añade al final del fichero no existe problema mientras no se alcance el espacio del fichero o el final del disco. Si se inserta a mitad del fichero, hay que desplazar toda la información. La asignación continua debe utilizarse cuando el tamaño y número de los ficheros sea fijo (backup). ASIGNACIÓN ENLAZADA Asignación por bloques individuales en donde cada uno contendrá un puntero al siguiente bloque de la cadena. La tabla de asignación de ficheros necesita una entrada por cada fichero que muestre el bloque de inicio y la longitud del fichero. Es posible la asignación previa, pero es común la asignar bloques conforme se necesiten. El fichero se almacena en el disco como una lista enlazada de bloques, los cuales pueden estar en cualquier parte del disco. Se elimina la fragmentación externa y la necesidad de compactación. El SO maneja una lista de bloques libres o un mapa de bits para conocer los bloques libres. El acceso secuencial se basa en el recorrido de los bloques según los punteros. El acceso directo se ve muy afectado, hasta el punto de no existir. Para llegar al bloque i se ha de recorrer todos los bloques anteriores. Para facilitar las inserciones y borrados en mitad del fichero se incluye un campo en el bloque para indicar el número de bytes ocupados. La inserción y borrado de un nuevo bloque intermedio es un problema de gestión de listas. Los bloques sin ocupar por completo introducen el problema de fragmentación interna y surge el problema de la fiabilidad. Como los ficheros están encadenados por punteros distribuidos por todo el disco si uno de ellos se pierde o daña se rompe la cadena de bloques asignados a un fichero y se reconducirá erróneamente hacia espacio no asignado o al espacio de otro fichero. Una solución a esto consiste en utilizar listas doblemente enlazadas hacia delante y hacia atrás o en almacenar en cada bloque el nombre del fichero y un número relativo de bloque. ASIGNACIÓN INDEXADA La tabla de asignación de ficheros contiene un índice separado de un nivel para cada fichero, el índice posee una entrada para cada sección asignada al fichero. Existe un bloque índice que posee una entrada por cada bloque asignado al fichero. Los índices no están almacenados físicamente en la tabla de asignación de ficheros. En la tabla de asignación de ficheros se guarda un puntero a un bloque que contiene los índices de ficheros. La asignación puede hacerse por bloques de tamaño fijo o en secciones de tamaño variable. Cuando el fichero se crea, todos los bloques de índice son puestos a nil. Cada vez que un fichero solicita un nuevo bloque, se extrae de la lista de espacios libres y su dirección se escribe en una nueva entrada del bloque de índices del fichero. Elimina la fragmentación externa y permite el acceso directo. El inconveniente es el consumo añadido de espacio ya que el desperdicio de espacio para los bloques de índice es mayor que en la asignación encadenada, ya que necesita al menos un bloque físico por fichero que almacene los índices (la mayor parte de los ficheros son pequeños) Con un fichero de 1 o 2 bloques; en la asignación encadenada sólo se desperdicia el espacio correspondiente a un puntero en cada bloque; en la asignación indexada se debe utilizar un bloque entero por fichero, aunque sólo dos punteros del bloque sean distintos de nil. El bloque de índices deber ser tan pequeño como sea posible para reducir el desperdicio de espacio y lo suficientemente grande como para contener los punteros necesarios para almacenar el fichero más largo que vaya a utilizar el sistema. Los ficheros grandes contienen más bloques físicos de los que un bloque de índices con pocas entradas es capaz de referenciar. Índices multinivel Utiliza un bloque de índices cuyas entradas contienen apuntadores a bloques de índices. Esta aproximación puede continuar con sucesivos niveles de indexación. Con 256 entradas en un bloque de índices con dos niveles de indexación, se tienen 256 ∗ 256 = 64 K punteros a los bloques físicos asignados al fichero. Si cada bloque físico contiene 1024 bytes, se permite almacenar ficheros de 64 Mbytes. Índices enlazadas Se mantiene en la entrada de un fichero en el directorio una tabla reducida de punteros, entre ellos las direcciones de los primeros k bloques físicos ocupados por el fichero. Si el fichero requiere más de k bloques, el puntero k + 1 y último, que es nil para ficheros pequeños, apunta a un bloque de índices adicional. Si este bloque resulta insuficiente se enlaza con otro bloque sucesivamente hasta que se asigna un fichero completamente. Los ficheros pequeños no necesitan índices separados y no pierden un bloque completo en el bloque de índices. Si el fichero es grande (mayor de k bloques) se puede utilizar un bloque de índice ya que el espacio adicional requerido no es alto. Índices combinados Utilizado por UNIX. La entrada en el directorio de un fichero determinado consiste en el nombre del fichero y un puntero a un inodo asociado al fichero. El inodo contiene k punteros que referencian bloques de datos. Si el fichero es pequeño, toda la información de direccionamiento del fichero se hace disponible con una lectura del bloque que contiene el inodo por lo que no es necesario gastar bloques de índice. Si el fichero crece, es necesario recurrir a los siguientes punteros del inodo: El puntero k + 1 referencia un bloque físico que contiene punteros a bloques de datos. El puntero k+2 referencia un bloque que contiene punteros a bloques que apuntan a bloques de datos. El puntero k + 3 consigue un tercer nivel de indexación. Se combina el acceso directo a bloques de datos con el uso de índices multinivel. GESTIÓN DE MEMORIA LIBRE Para gestionar el espacio libre se utiliza la lista de espacio libre, en donde figuran los bloques del disco que pueden ser utilizados. Para crear un nuevo fichero, se busca en la lista de espacio libre según un parámetro que indica el espacio que se necesita. Cuando se encuentra este espacio, se resta de la lista de espacio libre y se coloca ahí el fichero. Para borrar un fichero, se suma a la lista de espacio libre los bloques que ocupaba para que puedan ser utilizados por otro fichero. Formas de implementación de la lista de espacio libre: MAPA DE BITS Utiliza un vector que contiene un bit por cada bloque del disco, con valor 0 si corresponde a un bloque libre y 1 si está ocupado. Tiene la ventaja de la sencillez para encontrar un bloque o un grupo contiguo de bloques libres y que puede ser tan pequeña como sea posible y mantenerse en memoria principal, evitando traer la tabla de asignación de disco cada vez que se realice una asignación. Pierde eficiencia si no resulta posible conservar el mapa completo en memoria principal. Método empleado en Unix. Ejemplo.: dentro de un Disco de 120 Mbytes y bloques de 512 bytes. El disco tiene 240 K bloques, y necesitará un mapa de 240 Kbits, que pueden ser almacenados en 60 bloques. Esto representa 60/245760 = 1/4096 del espacio total del disco. LISTA ENLAZADA DE BLOQUES LIBRES Existe una lista que contiene todos los bloques libres del disco, con un puntero al primer bloque libre. Tiene el inconveniente ser ineficiente, ya que recorrer una lista de n bloques supone n accesos al disco. LISTA ÍNDICE DE BLOQUES LIBRES Lista de bloques donde en cada bloque se almacenan las direcciones de n bloques libres. La dirección última se utiliza para encadenar con otro bloque que también contenga información de bloques libres. Más eficiente que la lista enlazada de bloques libres, ya que al poder mantener constantemente en memoria uno o dos bloques de la lista, se dispone de forma inmediata de un conjunto de n o 2n bloques libres. A diferencia del mapa de bits, a medida que los bloques se van ocupando, el tamaño de la lista disminuye. La ventaja es conocer con rapidez las direcciones de un gran número de bloques libres, aun dedicando poca memoria principal para utilizar la lista. Empleado por el sistema operativo DOS. Ejemplo.: Disco de 200 Mbytes y bloques de 1 Kbyte. El disco tendrá 200 K = 204800 bloques. Consideremos direcciones de bloque de 32 bits. En un bloque de 1024 bytes caben 256 direcciones de bloque de 32 bits, de las cuales una de ellas se utiliza para el encadenamiento. En este caso n vale 255. Almacenar 200 K direcciones exige 804 bloques. La lista requiere entonces una fracción 804/204800 = 1/255 del espacio total del disco cuando se halla totalmente vacío. LISTA ENLAZADA DE SECCIONES LIBRES Las secciones libres pueden encadenarse juntas mediante un puntero y un valor de longitud en cada sección libre. En el mismo bloque libre (el primero del grupo) puede almacenarse información necesaria: puntero al siguiente hueco y número de bloques que conforman el hueco. Solamente hay que almacenar un puntero al primer hueco y este suele ubicarse en un bloque concreto al inicio del disco. Se utiliza mucho junto con asignación contigua. Casos de estudio ORGANIZACIÓN FÍSICA El Bootstrap es una rutina que ocupa el inicio de un sistema de ficheros (tamaño de un único bloque). Su misión es cargar en memoria el núcleo. Todo sistema de ficheros contiene este bloque y sólo será utilizado en el sistema de ficheros raíz de la configuración. El superbloque describe el estado actual del sistema de ficheros (tamaño del sistema de ficheros, número de bloques libres, número de inodos libres…) Mapa de bits: vector con un bit por cada bloque que contiene su estado (asignado o libre). Lista de inodos: ocupa una serie de bloques de disco donde está almacenada la información general relativa a cada fichero del sistema (los inodos son los descriptores de ficheros en disco). Lista de bloques de datos: comienza al final de la lista de inodos. Se almacena la información de los ficheros, directorios, bloques de datos libres… INODOS Un inodo es una estructura de control que contiene la información clave de un fichero necesaria para el SO. Pueden asociarse varios nombres de fichero a un mismo inodo, pero un inodo activo se puede asociar con un único fichero y cada fichero es controlado por un solo inodo. Los atributos, permisos e información de control del fichero se almacenan en el inodo. Para acelerar las operaciones sobre ficheros, el núcleo mantiene una caché de inodos en memoria principal. ESTRUCTURA DE UN DIRECTORIO Un directorio es un fichero cuyos datos son una secuencia de entradas o registros con la estructura: El offset es el desplazamiento respecto al comienzo del fichero que contiene el directorio. Para cada fichero contenido en el directorio se indica su inodo (información mínima asociada a una entrada de directorio). Cuando se borra un fichero se indica el número 0 de inodo para que la entrada pueda ser reutilizada posteriormente. El directorio es almacenado físicamente en el disco igual que un fichero regular, utilizando el mismo sistema de indexación. MONTADO DE SISTEMAS DE FICHEROS En sistemas operativos con unidades de disco en donde cada partición/dispositivo contiene un sistema de ficheros, para poder acceder a su contenido, cada sistema de ficheros debe ser integrado en el sistema de ficheros raíz utilizando un punto de montaje (directorio reservado para ello). Si el punto de montaje contenía ficheros, desaparecerán, y únicamente se visualizarán los del dispositivo montado. Para realizar el montado se utiliza la orden mount /dev/usb /mnt/usb, donde /dev/usb es el fichero especial que representa al dispositivo USB y /mnt/usb es el punto de montaje. Para realizar el desmontado, y poder extraer físicamente el dispositivo sin dañar los ficheros que contiene, se utiliza la orden umount /mnt/usb Una vez realizado el montado de sistemas de ficheros, se permite acceder a todas las particiones desde un único directorio raíz. ORGANIZACIÓN FÍSICA Sector de arranque secundario: accedido desde el sector de arranque si la tabla de particiones indica que esta es la partición activa. Fat: (File Allocation Table) Copia de la FAT: utilizada para recuperar la FAT en caso de que se corrompa. Bloque de datos. LA FAT Equivalente a la tabla de inodos de Unix. Contiene una entrada por cada bloque del disco, cada una ocupa 16 bits (lista ordenada de los bloques asignados a un fichero). Utiliza además 16 bits para direccionar cada bloque, lo que permite hasta 64K (216) bloques por partición. Las dos primeras entradas de la FAT codifican el tipo de disco. A partir de la tercera, cada entrada se corresponde una a una con un bloque del disco y contiene posibles valores: Número de bloque indica cual es el siguiente bloque del fichero. Marca de fin de fichero que es el último bloque del fichero. Código especial indica que el bloque está libre. Código especial: indica que el bloque es defectuoso. El aumento en el tamaño de los discos y la necesidad de direccionar un mayor número de bloques hizo que se utilizara un esquema similar con un aumento en el número de bits usados para direccionar un bloque, pasando de 16 a 32. Se puede hablar de FAT16 y FAT32 en función del número de bits usados. Los sistemas FAT32 permiten direccionar 232 bloques ESTRUCTURA DE UN DIRECTORIO Un directorio es un fichero que con una entrada de 32 bytes para cada fichero o subdirectorio contenido en él. Cada entrada tiene la siguiente estructura: Los primeros 11 bytes se reservan para el nombre del fichero y su extensión Un byte de atributos, que con los siguientes bits: A: bit para control de modificaciones del fichero entre copias de seguridad. D: indica que la entrada es un directorio (con valor 1). V: indica que la entrada se utiliza para la etiqueta del volumen (con valor 1). S: indica que el fichero es de sistema (con valor 1). H: indica que el fichero es oculto (con valor 1). R: indica que el fichero es de solo lectura (con valor 1). 10 bytes reservados para uso futuro. 2 bytes para la hora de la última modificación del fichero 2 bytes para la fecha de la última modificación del fichero 2 bytes para almacenar el número del primer bloque del fichero (el resto de bloques Se obtienen recorriendo la FAT). 4 bytes para almacenar el tamaño del fichero. Cada directorio MS-DOS contiene más datos además del nombre (información relativa a tamaño, fechas…) lo que impide que exista el concepto de enlace (no simbólico) ya que podría ocurrir que un fichero tuviera dos fechas de modificación distintas. Este problema no aparece en Unix ya que en un directorio únicamente se almacena el nombre del fichero y el numeró de inodo, y es en el inodo donde se guardan los atributos del fichero.