8.1.2a1 Sistemas FAT y NTFS
§1 Introducción
En este capítulo abordaremos las características principales de los dos sistemas de ficheros utilizados por Microsoft en sus sistemas DOS y Windows: FAT y NTFS.
Nota: Aparte de los anteriores, el gigante del software ha producido también versiones de Unix (Xenix) cuyo sistema de ficheros es distinto de los aquí comentados.
§2 Sistemas FAT
En el capítulo anterior ( 8.1.2a) adelantamos que los sistemas FAT son los sistemas de fichero utilizados en DOS y primeras versiones Windows de Microsoft. La característica principal (a la que deben su nombre), es que el estado de cada unidad de información del dispositivo, está reflejado en un catálogo denominado tabla de situación de ficheros FAT ("File Allocation Table"). Esta tabla es muy importante porque es el índice del contenido del disco. Cualquier error aquí puede convertir la unidad en inutilizable, razón por la que está duplicada. Ambas copias ocupan lugares consecutivos en los primeros sectores del disco. Justamente a continuación del primero, el VBS ("Volume Boot Sector" 8.1.2c2) que tiene un mapa con la geometría del volumen (en ocasiones hay un espacio entre el VBS y las FAT).
No hace falta decir que en unidades de gran capacidad, la tabla es necesariamente muy grande. Generalmente se carga en memoria para agilizar los procesos, ya que es de uso constante y cualquier operación de lectura/escritura tiene que utilizarla. En consecuencia, se han ingeniado métodos para que estos índices ocupen el menor espacio posible.
§2.1 Tablas FAT
Los sistemas FAT y muchos otros, utilizan un método de grabación que agrupa varios sectores en una misma unidad ("Allocation unit") también llamada cluster, traducida al español como unidad de asignación, a la que ya hemos hecho referencia 8.1.2). Esta es la menor unidad de grabación lógica que utiliza el Sistema en la unidad, de forma que un fichero se grabará siempre utilizando un número entero de clusters.
Todos los sistemas FAT han utilizado tamaños de cluster dependientes del tamaño de la unidad. En los disquetes ha sido de 1 o 2 sectores por cluster, es decir, 512 o 1024 bytes (ver tabla 8.1.2). El primer disco duro de 10 MB del IBM PC-XT utilizaba cluster de 8 sectores.
Nota: En realidad, desde la óptica del aprovechamiento de espacio, la agrupación en clusters no es muy buena idea. Por ejemplo, un disco formateado con una unidad de asignación de de 8 sectores (4.096 bytes) ocupa necesariamente esta cantidad para cualquier fichero por pequeño que sea, aunque los sistemas utilizan miles de ficheros de tamaño menor. Sin embargo ayuda a mantener el tamaño de las FAT dentro de límites razonables [1].
El sistema de anotación utilizado en la FAT (inspirado en UNIX) es una estructura encadenada jerárquica donde cada eslabón apunta al siguiente. Para entenderla del todo hacen falta un par de conceptos y vocabulario previos.
El primero es que en la tabla existe un campo o celda (de 12, 16 o 32 bytes) por cada cluster del volumen [5]. Su contenido lo llamaremos entrada. El campo n de la FAT representa el cluster n del volumen -no confundir la "entrada" (un valor de 12, 16 o 32 bytes), con el contenido del cluster al que representa (un campo de 512 bytes como mínimo).
El segundo se refiere a qué son los directorios y como está organizada su estructura. En realidad los directorios son un tipo especial de fichero, que en lugar de datos de usuario, contienen metadatos (punteros a otros ficheros). En cualquier caso, como cualquier otro fichero, sus "datos" están en el área de datos del disco, y a cada sector de información le corresponde una entrada en la FAT (dedicaremos todo un capítulo a explicar la estructura interna de estos ficheros especiales 8.1.2d).
El número del primer cluster de cada fichero, junto con otros datos del mismo, se anota como "entrada" en "su" directorio. A su vez, la entrada correspondiente a dicho primer cluster, contiene la dirección (número) de segundo cluster del fichero, cuya entrada contiene la dirección del tercero, etc. El proceso se repite sucesivamente con todos los cluster del fichero hasta llegar al último, cuya entrada no puede contener el número del siguiente, porque no existe, de forma que contiene una marca especial EOF ("End of file") de final de fichero. Las entradas de clusters que no corresponden a ninguna cadena, sin utilizar o "liberados", tienen un contenido especial (cero). Y las que corresponden a clusters con bytes malos o reservados, también contienen valores de significado especial.
Esta organización ha originado que en algunos manuales se afirme que en las FAT existen dos tipos de entradas: de fichero y de cluster. En cuanto a los últimos, cada cluster tiene una entrada en la FAT que señala su estado, además de un sistema que permite que el SO pueda saber que zona del disco está ocupada y cual libre; así como un sistema de referencias en cadena que permite conocer qué clusters componen un determinado fichero.
El sistema para recuperar (leer) un fichero es algo parecido a sacar cerezas de un cesto. Aún suponiendo que la tabla FAT haya sido leída en memoria, como el número del primer eslabón de la cadena (el primer cluster de un fichero) se obtiene del directorio, el acceso a este primer bloque de datos requiere al menos, dos accesos: al directorio que lo contiene, y a los datos del fichero en sí. Si en lugar del directorio raíz, el fichero está en el interior de una cadena de subdirectorios, cada nivel de anidamiento puede requerir un acceso adicional a disco. En cambio los bloques sucesivos se leerán directamente siguiendo la cadena de direcciones señalada en la FAT.
Nota: Como puede suponerse, el sistema presenta algunos inconvenientes. Por ejemplo, si se rompe la cadena en un punto, el resto del fichero se pierde. Si el punto de ruptura es un directorio, entonces se pierde todo su contenido. Estos y otros errores de las FAT serán comentados más adelante al tratar de la estructura de directorios ( 8.1.2d)
Las dos primeras entrada de la FAT (los tres primeros bytes en FAT12) tienen un significado especial, de forma que la anotación de clusters se realiza a partir del tercero (a partir del número 2 si como es costumbre, empezamos a contar por cero). Como veremos a continuación, al tratar de la FAT12, lar razón es de tipo histórico.
Recordando que existen distintas variedades del sistema: FAT12; FAT16 y FAT32, que utilizan distinto número de bits para apuntar los números de cluster. Se deduce que dependiendo del espacio de anotación disponible, un sistema FAT puede direccionar un máximo determinado de clusters. Los valores son: 4.096 (212) para FAT-12; 65.536 para la FAT-16 (216) y 4.294.967.296 (232) para FAT-32. Sin embargo no todas las posiciones están disponibles. Hay que restar algunas los números anteriores, que como hemos adelantado, se utilizan para indicar situaciones especiales tales como:
El cluster está desocupado o "liberado" (no está siendo utilizado por ningún fichero) |
Cluster malo (no debe utilizarse) |
Último cluster del fichero ("End Of File") |
Además FAT-32 no utiliza todos los bits (4 están reservados). Cualquier valor que no corresponda con alguno de los significados especiales debe interpretarse como el próximo número FAT en la cadena del fichero que se examina.
§2.2 FAT-12
En realidad los primeros PCs, que solo disponían de un disquete de 160 KB y una cara, gobernados por el IBM-DOS 1.0, no utilizaban el sistema FAT, sino uno derivado de CP/M Gary Kildall. Sin embargo, las exigencias de almacenamiento se dispararon enseguida. El primer disco duro instalado en el XT tenía capacidad para 10 MB y el del AT era ya de 20 MB. Como el sistema de ficheros utilizado por CP/M era ineficiente y complicado (el disquete solo podía contener un directorio con 64 entradas), había que buscar en otra dirección.
El sistema FAT-12, inspirado en el sistema de ficheros de Unix [4], que utiliza 12 bits para el índice de clusters, apareció a partir de MS-DOS 1.1 hasta 2.x. Aunque también se utilizó en versiones 3.00 y posteriores si el dispositivo tenía menos de 4087 clusters. A partir de esta cantidad se usa la versión FAT de 16 bits. Cada entrada de la tabla corresponde directamente con un cluster utilizable en el volumen.
En este sistema cada número de cluster se almacena en la FAT en forma de tres dígitos hexadecimales, en el rango 000h/FFFh (0/4095). Como estas cantidades necesitan 12 bits, para aprovechar espacio, las entradas se agrupan por parejas que ocupan tres bytes, de los que cada entrada utiliza 1+½. Los valores posibles son:
002-FEFh | Cluster en uso |
000h | Cluster está desocupado o liberado (no es utilizado por ningún fichero) |
001h | No utilizado (el primer cluster de datos es el 2). |
FF0-FF6h | Reservados |
FF7h | Cluster malo (no debe utilizarse) |
FF8-FFFh | Último cluster del fichero ("End Of File") |
Recordar que en este sistema, los dos primeros campos de la tabla (3 bytes), que corresponden a las entradas FAT 0 y 1, no se utilizan para almacenar direcciones de cluster. El primero byte contiene una copia del "Media descriptor" ( 8.1.2c2). Los dos siguientes contienen 0FFh. A su vez los clusters de datos comienzan en el número 2 (el 0 y el 1 no se utilizan).
Nota: La razón es de tipo histórico. El sistema de ficheros del DOS 1.0 no tiene bloque de parámetros BIOS (BPB 8.1.2c2), y la distinción entre los disquetes de 5.25" de simple o doble cara (320/640 KB) debía indicarse en la FAT. A partir del DOS 2.0 la FAT incluyó el BPB con el "Media descriptor".
Más información en:
- How to Interpret 12-Bit FATs http://support.microsoft.com/
§2.3 FAT-16
En este sistema, utilizado a partir de MS-DOS 3.0, cada cluster está representado en la FAT por un número de 16 bits en forma de 4 dígitos hexadecimales (0000h/FFFFh), con lo que el disco puede tener un máximo de 216 = 65.536 unidades de asignación. Los valores posibles para las entradas de la tabla son:
0002-FFEFh | Cluster en uso. El valor señala el número del siguiente cluster del fichero |
0000h | Cluster libre |
0001h | No utilizado (el primer cluster de datos es el 2). |
FFF0-FFF6h | Reservados |
FFF7h | Cluster malo |
FFF8-FFFFh | Último cluster del fichero ("End Of File") |
El modelo resultaba muy adecuado para discos pequeños, pues con clusters de solo 256 bytes se pueden conseguir capacidades de 256 x 65.536 = 16 MB, o de 33 MB con clusters de 512 bytes. Sin embargo, para discos de 2 GB el cluster tenía que ser de 32 KB. Tamaño que se considera el límite superior razonable para cada unidad de asignación.
Esté sistema tiene dos inconvenientes: en primer lugar el tamaño máximo de 2 GB, cuando actualmente ya es común ver discos duros de 8 GB [3]. El segundo es el espacio desperdiciado. Cada fichero que se almacena en el disco ocupa los clusters completos que necesita, por lo que si el fichero tiene un tamaño de 2 KB, ocupará un cluster de 32 KB, desperdiciando 30 KB. Si es de 66 KB, ocupará tres clusters = 96 KB, desperdiciando 31 KB. Si se tienen en cuenta que en una partición de 2 GB caben miles de ficheros, y estimamos que se desperdicia una media de 16 KB por fichero, si el disco tiene unos 8.500 archivos estaremos desperdiciando 132 MB. El problema se agrava si consideramos que cuantos más ficheros pequeños tengamos, más espacio se desperdicia y que por ejemplo, los sistemas Windows utilizan cientos de pequeños ficheros.
§2.4 FAT-32
Fue introducido con Windows 95b y con el SO DOS v.7.x que venía incluido con él. La razón de su lanzamiento fue que el tamaño de los discos crecía sin parar y que, como se ha señalado, el FAT-16 tradicional no permitía hacer particiones de mas de 2 GB, so pena de utilizar clusters muy grandes, lo que a su vez era contraproducente.
Microsoft denominó al nuevo sistema Virtual FAT (VFAT) e incorporó algunas mejoras, como la posibilidad de utilización de nombres largos para los ficheros y directorios. Pero VFAT es un sistema de ficheros básicamente igual que los FAT anteriores, la mayoría de las implementaciones se basan mas en "como" se usa el sistema que en cambios estructurales.
Aunque nominalmente utiliza una FAT de 32 bit, en realidad los 4 superiores están reservados. Los 28 restantes permiten direccionar 228 = 268.435.456 clusters. Lo que se traduce en que aún utilizando el tamaño mínimo de cluster, que es de 8 sectores (4.096 Bytes), se pueden tener particiones de hasta 1.07 TB (1.073 · 1012 bytes), aunque en realidad, FAT-32 utiliza clusters de 4096 a 32768 bytes (8/64 sectores)
Frente a FAT-16 posee la ventaja de no utilizar un tamaño fijo para la tabla de entradas, lo que permite introducir cualquier número de sub directorios y archivos en el directorio raíz. La contrapartida es que se aprecia una considerable pérdida de prestaciones frente a la FAT 16. En concreto aparecen pérdidas de del orden de un 5% de prestaciones al convertir un disco de FAT 16 a FAT 32, notándose más en los ficheros más pequeños. Hay que resaltar que la versión OSR2 (Windows95 OEM Service Release 2) es, en general, más lenta de acceso a disco que la anterior.
En principio las particiones FAT-32 solo eran accesibles desde Windows 95b y desde Dos 7.x. Ningún otro sistema operativo podía leerlas, siquiera Windows NT. Las utilidades de disco anteriores no servían para esta, así que Windows 95b traía sus propias versiones de FDisk, Format, ScanDisc y Defrag que trabajan con las particiones FAT 32.
Con Windows98-2E, Microsoft introdujo una nueva versión de su sistema FAT-32 con las siguientes mejoras respecto a las implementaciones anteriores:
- Admite unidades de hasta 2 TB (Terabytes) de tamaño.
- Utiliza clústeres menores que las versiones FAT anteriores. Es decir, clústeres de 4 KB para unidades de hasta 8 GB de tamaño, lo que da como resultado un uso de entre el 10 y el 15 más eficiente del espacio de disco con respecto a las grandes unidades FAT16.
- Puede reubicar el directorio raíz y utilizar la copia de seguridad de la FAT en lugar de la copia predeterminada. Además, se ha ampliado el registro de inicio de las unidades FAT32 para incluir una copia de seguridad de las estructuras de datos críticas. Esto significa que las unidades FAT32 son menos susceptibles a un único punto de fallo que los volúmenes FAT16 existentes.
- El directorio raíz de una unidad FAT32 es ahora una cadena normal de clústeres, por lo que puede ubicarse en cualquier lugar de la unidad. Por ello, ya no existen las limitaciones anteriores sobre el número de entradas del directorio raíz.
Los Sistemas Operativos de Microsoft distinguen el tipo de FAT (12-16-32) utilizado en un volumen mediante la siguiente regla (los valores mencionados pueden obtenerse o deducirse directamente del BIOS Parameter Block del sector de carga del volumen 8.1.2c2):
- Se obtiene el número total de sectores en el volumen
- Se le resta el espacio de sectores reservados
- Se le resta el espacio ocupado por las FAT
- Se le resta el espacio ocupado por el directorio raíz.
- El total anterior se divide por el número de sectores en un cluster redondeando hacia abajo. El resultado R es el número de clusters en el área de datos.
- R < 4085 ------> FAT-12
- R < 65525 ------> FAT-16
- R > = 65525 ------> FAT-32
§3 NTFS
Como se adelantó al tratar de los sistemas de ficheros ( 8.1.2a), Windows NT fue diseñado desde el principio para ser un sistema operativo de red y multitarea que rompiese definitivamente cualquier nexo con sus ancestros MS-DOS, para lo que se diseñó un nuevo sistema de ficheros partiendo de un diseño radicalmente nuevo (no se trata por tanto de un nuevo carrozado de las FAT anteriores).
El sistema resultante, denominado NTFS ("New Technology File System") es un sistema muy robusto que permite compresión de ficheros uno a uno; un protocolo de autorización de uso y de atributos de fichero muy desarrollado; sistema de operación basado en transacciones; soporte RAID [2]; posibilidad de juntar las capacidades de dos unidades en un volumen único ("Disk striping") y muchas otras mejoras, como es la capacidad de anotar clusters malos ("Hot fixing") en run-time.
Su última versión, la denominada NTFS 5, incorporada en Windows 2000, dispone de algunas otras características avanzadas, como soporte de encriptación de ficheros incorporado en el propio SO; propiedades de ficheros basados en identificadores persistentes de usuario (ya no es necesario identificar a los ficheros mediante sus terminaciones), e identificación única de todos los objetos del sistema de archivos que permite, entre otras cosas, que un archivo pueda ocupar distintos volúmenes (ficheros multivolumen). Aunque naturalmente estas prestaciones cobran su tributo. NTFS utiliza meta-estructura muy grandes ( 8.1.2a) por lo que no es aconsejado para volúmenes de menos de 400 GB.
La estructura central de este sistema es la MFT ("Master File Table"), de la que se guardan varias copias de su parte más critica a fin de protegerla contra posibles corrupciones. Al igual que FAT16 y FAT32, NTFS también utiliza agrupaciones de sectores (clusters) como unidad de almacenamiento, aunque estos no dependen del volumen de la partición. Es posible definir un cluster de 512 bytes (1 sector) en una partición de 5 MB o de 500.000 MB. Esta capacidad le hace disminuir tanto la fragmentación interna como la externa [1].
§4 Resumen
A partir de Windows98-SE, con las nuevas versiones de Windows, Microsoft ha mantenido posibilidad de acceso a la información anterior de los usuarios (contenidos FAT), aunque ha establecido como formato por defecto NTFS, que comenzó a utilizar como sistema de ficheros de gama alta con Windows NT. La tabla adjunta muestra la compatibilidad de los distintos sistemas de fichero con los SOs de Microsoft.
Sistema | NTFS | FAT-16 | FAT-32 |
Accesible desde: |
Windwos 2000. Windows NT 4.0 con Service Pack 4 o posterior. | Todas las versiones de MS-DOS a partir de la ; todas las versiones de Windows; Windows NT; Windows 2000 etc. |
Windows 95 OSR2; Windows 98 y Windows 2000. Versiones MS-DOS v.7.x |
Tamaño de volúmenes y ficheros soportados |
El tamaño mínimo recomendado para la partición es de 10 MB. Aunque son posibles tamaños mayores, el máximo recomendado en la práctica para cada volumen es de 2 TB (Terabytes). No puede ser utilizado en disquetes. El tamaño máximo de fichero viene limitado por el tamaño del volumen. |
Desde el tamaño de un disquete hasta 4 GB. El tamaño máximo por fichero es de 2 GB. |
Tamaño del volumen desde 512 MB a 2 TB (Terabytes). Windows 2000 solo permite formatear volúmenes FAT-·" hasta 32 GB. Tamaño máximo de fichero 4 GB. Nota: las versiones MS-DOS 7.x pueden leer ficheros FAT-32 cuyo tamaño no sobrepase 2 GB. |
§5 Webografía
- nfts.com www.ntfs.com
Aparte de la Web de Microsoft, puede encontrar información sobre los sistemas de ficheros NTFS y FAT en este sitio.
[1] La existencia de clusters no utilizados por completo (con espacios desocupados), es conocida también como fragmentación interna, en contraposición a la fragmentación externa, que se refiere a la situación en que los clusters de un fichero no ocupan posiciones contigua. En una exploración realizada sobre una unidad FAT-32 de 4 GB, que utiliza un cluster de 8 sectores (4.096 bytes) cargada con el SO Windows 98 y una serie de utilidades de explotación normal (procesador de textos, hoja de cálculo, navegador, correo, etc). Se encontró que el espacio desaprovechado por clusters medio vacíos representaba un 13.21% sobre un total ocupado del 59.26%. La misma exploración, realizada sobre una unidad de backup de 300 GB con un sistema de ficheros FAT-32 y un cluster de 64 sectores (32.768 bytes), encontró que con un 5.43% de la capacidad total utilizada, el espacio desaprovechado representaba el 0.74%.
[2] RAID("Redundant Array Inexpensive Disk"). Sistema de varios discos duros que trabajan de forma conjunta (usualmente en sistemas servidores de red) con objeto de conseguir elevadas prestaciones del sistema y gran tolerancia y seguridad contra fallos. Existen diversos tipos estandarizados (formas de operación), Raid 0 a Raid 5 y finalmente la filosofía cluster, en la que se duplican los equipos completos. Un Cluster es un conjunto de equipos que comparten el almacenamiento de discos duros. Los componentes de un cluster, llamados nodos, funcionan de cara al usuario de manera única, desempeñando las tareas que tienen asignadas, generalmente la carga total se reparte entre los diversos nodos del cluster (es su principal misión) mediante un mecanismo repartidor de la carga (balanceador de carga). En caso de fallo de un nodo, los demás atiendan su parte de proceso. Es evidente que para que esto sea posible, los nodos tienen que tener un almacenamiento externo común, los discos duros son comunes a todos los nodos del cluster.
[3] El original del manuscrito debe ser de 2002, ahora cuando lo releo en 2005, el tamaño estándar de los discos duros alcanza varios cientos de Gigas.
[4] Esta herencia se deja sentir todavía en la forma de señalar el camino de búsqueda de los ficheros ("pathname") en los sistemas Windows, que utilizan una barra invertida " \", mientras que los sistemas Unix utilizan la barra inclinada "/".
[5] Un volumen es una parte del disco relativamente independiente de las demás. Un disco puede ser particionado en uno o varios volúmenes. Cada uno con su propio formato lógico distinto del resto. Y en consecuencia, su propia tabla FAT. Explicaremos detenidamente esta cuestión en el capítulo siguiente ( 8.1.2c1).