8.1.2d Estructura jerárquica de los Discos: Directorios y Ficheros
Nota: En esta sección se muestran algunos detalles de la organización y estructura de directorios y ficheros en los sistemas FAT. En consecuencia, las referencias y terminología empleadas corresponden a este sistema en particular. La estructura de directorios y ficheros en los sistemas Linux tipo ext2, a los que nos hemos referido en páginas anteriores ( 8.1.2a2), aunque similares no son exactamente iguales; además la terminología empleada difiere ligeramente de la utilizada aquí.
§1 Introducción
Recordemos que la estructura de más alto nivel de una unidad física es el sector de arranque MBR ( 8.1.2c), que contiene la tabla maestra de particiones MPT, que describe cómo está organizado el interior de la unidad (un solo espacio o varias particiones). En caso de existir una partición DOS extendida xDp, existe un nivel adicional: las tablas de partición extendida xPT ( 8.1.2c1), que definen como están organizadas sus subdivisiones (volúmenes lógicos). Finalmente, en uno y otro caso, sean particiones primarias o volúmenes lógicos, el sector de carga de cada volumen VBS ( 8.1.2c2) contiene información para llegar al principio de su zona de datos. Recordemos así mismo, que el volumen puede ocupar la totalidad de un disquete; de una unidad de disco no particionado, o solo una porción de la unidad.
§2 Organización interna
Cualquiera que sea la extensión del volumen (la totalidad de una unidad o parte), el siguiente y último nivel es la organización de su interior. Y aquí existen dos planos: el de alto nivel o lógico (de usuario), y el de bajo nivel o físico (cómo está organizado realmente el volumen).
§2.1 Estructura lógica
Desde el punto de vista lógico, los datos están agrupados en entidades individuales, ficheros, que se agrupan en directorios, que pueden contener a su vez otros directorios (subdirectorios). El resultado es un esquema de carpetas y subcarpetas con cualquier grado de anidamiento a partir de un contenedor inicial que es el directorio raíz del volumen. La estructura lógica recuerda la de un árbol, de ahí lo de directorio "raíz".
Lo substancial aquí, es recordar que todo fichero está contenido en un directorio (que puede ser el raíz) y que los directorios son en realidad un tipo especial de fichero que puede contener información sobre otros ficheros ( 8.1.2a1). El resultado es que cualquier fichero está perfectamente definido conociendo su nombre ("name") y la cadena de directorios que hay que recorrer hasta encontrarlo. Lo que se denomina camino de búsqueda ("path"). El conjunto se denomina nombre cualificado completo o "full path-name".
En DOS/Windows el camino de búsqueda se inicia en la designación de la unidad (volumen), representada por una letra, y a continuación el directorio raíz, representado por dos puntos ":", y los que le siguen. Por ejemplo:
D:\doc\buzon\documents\carta1.doc
En Linux todas las unidades se "montan" sobre una raíz lógica común, el directorio root representado por una barra inclinada "/" (justamente al contrario que en DOS). El path-name de un fichero sería algo así:
/home/user1/doc/buzon/documents/carta1.doc
Nota: Los sistemas de ficheros Unix/Linux permite montar o "colgar" el sistema de ficheros contenido en un dispositivo (o en una partición del mismo) en cualquier subdirectorio del directorio raíz. Por ejemplo, en el path-name anterior, la parte /home/user1 puede pertenecer físicamente al volumen que contiene al propio sistema Linux. Pensemos en una de las particiones primarias de una unidad física X. En cambio la parte que sigue, /doc/buzon/documents/carta1.doc, puede ser el camino del fichero dentro de la estructura lógica contenida en una partición de otra unidad física Y.
§2.2 Estructura física
Por su parte, la organización física se basa en un esquema de datos y metadatos (anotaciones sobre la situación de los datos 8.1.2a), en la que estos últimos están organizados en estructuras específicas. Por ejemplo, tablas FAT, situadas al principio del volumen.
El sistema de anotación de los metadatos es una estructura encadenada jerárquica, donde cada eslabón de la cadena apunta al siguiente. El número del primer cluster del fichero se anota como "entrada" en el directorio correspondiente. Puesto que los directorios también están organizados jerárquicamente a partir del directorio raíz de cada unidad, es fácil deducir que para encontrar un fichero hay que acudir al comienzo de la estructura y seguir el rastro directorio raíz -> subdirectorios -> fichero. Para más facilidad, la información del directorio raíz está situada justamente al principio del área de datos o en cualquier otro punto fácilmente localizable en base a la información contenida en el sector de carga.
§3 Estructura de Directorios
La imagen mental que tenemos de Sistema de Ficheros, es que cada fichero del sistema está almacenado, decimos que "pertenece" a un Directorio, aunque esta es una consideración de tipo lógico. En realidad, en el nivel físico, un directorio es un fichero como todos los demás, aunque con una estructura un tanto especial y con una marca que lo identifica como directorio frente al SO. Por supuesto, los detalles de esta arquitectura son distintos según el Sistema de Ficheros de que se trate, pero en este caso, para seguir con nuestro estudio nos ceñiremos al detalle de los sistemas FAT.
Los datos de este fichero especial (directorio) constituyen una tabla con información de los ficheros que contiene (algunos de los cuales pueden ser a su vez directorios). Cada entrada de esta tabla ocupa 32 bytes, y como dijimos, incluye el número de cluster donde comienza cada fichero; su tamaño, y otros datos. Su estructura interna de estas entradas es como sigue:
-
Nombre y extensión de fichero: Este es el tradicional nombre de 11 caracteres del DOS; el tradicional
8 + 3 (el punto no se almacena realmente, está implícito
y los nombres largos utilizan una estructura especial
).
El nombre de fichero se utiliza también para indicar si el fichero es
válido o está borrado. En este último caso el primer carácter del nombre es sustituido por el valor
E5h (si ha utilizado una herramienta de recuperación de
ficheros borrados, recordará que el primer carácter del nombre aparece
sustituido por un carácter especial. Por ejemplo, una interrogación, que
tendrá que ser sustituida por el carácter original).
Nota: Al igual que ocurre con los identificadores (nombres) de las variables en los lenguajes de programación, dependiendo del sistema de ficheros, los nombres de fichero están sujetos a ciertas limitaciones. Por ejemplo, en DOS, aparte de la limitación de longitud 8+3 antes señalada, el nombre de un fichero o directorio no puede contener ninguno de los siguientes caracteres:
/ \ : * ? " < > | -
Byte de atributo de fichero: El "atributo" es una consideración especial que hace el SO a los ficheros para
conferir determinadas propiedades o características a las entidades lógicas de almacenamiento (sean ficheros u otros
directorios) que a su vez, determinan la forma en que serán tratadas por el SO.
Cada atributo está representado por un bit. Como cada bit solo puede tener dos valores cierto/falso, el atributo
solo puede indicar si la entidad lo posee o no. Los sistemas FAT distinguen 6 posibilidades para cada entidad
[2]:
- 00000001 Solo lectura ("Read only"). Signifca que la entidad (fichero) no puede ser modificada, borrada o movida. Generalmente se utiliza como una medida de protección para que el fichero no pueda ser borrado (quizás inadvertidamente) o modificado.
- 00000010 Oculto ("Hidden"). Se utiliza para identificar entidades que en principio, no serán mostradas en pantalla o listados (como una forma de protección) aunque se puede indicar al Sistema que las muestre. Generalmente se refieren a entidades del SO cuya existencia no concierne al usuario.
- 00000100 De Sistema ("System"). Se utiliza para señalar entidades relacionadas con el Sistema Operativo, por ejemplo, IO.SYS o MSDOS.SYS.
-
00001000 Nombre de volumen ("Volume label"). Este atributo identifica una entidad que
contiene el nombre de un volumen lógico. Se utiliza porque al dividir un disco físico en dos o mas volúmenes
lógicos, el SO automáticamente les asigna a cada uno una letra, pero el usuario puede desear una identificación más
descriptiva, para lo que es apropiado el nombre de volumen. Cuando este atributo está activado, los otros
atributos (sistema, oculto y solo lectura) no tienen sentido, de modo que están desactivados.
Nota: Los nombres largos de fichero LNF (long filename) son una ampliación de las posibilidades iniciales de MS-DOS y Windows 3.x que se limitaban a nombres con un máximo de 8 caracteres seguidos de un punto y una terminación o "apellido" de tres caracteres, utilizada generalmente para señalar el tipo de fichero. Windows 95 permite nombres de hasta 255 caracteres, incluso algunos que inicialmente no estaban permitidos: Signo más, coma, punto y coma, igual, paréntesis cuadrados derecho e izquierdo, mayúsculas y minúsculas (los LFN usan el juego de caracteres Unicode). Ya que inicialmente no estaban previstos y además el sistema debía ser compatible con las últimas versiones de DOS, el sistema FAT-32 recurre a unas entradas especiales, que sirven exclusivamente para este fin, y que utilizan una combinación única de atributos: oculto + solo lectura + sistema. - 00010000 Directorio ("Directory"). Se utiliza para señalar que la entidad es un directorio.
- 00100000 Archivo ("Archive"). Este atributo se utiliza para identificar los ficheros que han cambiado desde la última copia de seguridad ("Back up"). Si el fichero es modificado, este bit se pone a "1" y es devuelto a "0" por el software de back-up.
- Fecha y hora de última modificación: Es un conjunto de bytes que indican de forma codificada, la fecha en que el fichero fue creado o modificado por última vez.
- Tamaño: Tamaño del fichero en bytes.
-
Dirección del cluster inicial del fichero: El número del primer cluster del fichero (o directorio).
De esta forma, el SO puede dirigirse a la tabla FAT para conseguir la totalidad del fichero.
El intríngulis para comprender el mecanismo utilizado, estriba en conocer que, en base a este número al que llamaremos n1, el SO puede leer (traer a memoria) el contenido del cluster (que es perfectamente localizable por su número). Este sería el primer trozo del fichero. A continuación se dirige a la tabla FAT y lee la entrada n1 (hay una entrada por cada cluster del área de datos). El contenido de esta entrada (12, 16 o 32 bits según la FAT utilizada) señala el número del siguiente cluster del fichero. A este nuevo valor lo llamaremos n2. Se lee el cluster n2 y este sería el segundo trozo del fichero. A continuación se consulta en la tabla FAT la entrada n2, cuyo contenido, al que llamaremos n3, indica cual es el cluster que contiene al tercer trozo. El proceso se repite indefinidamente hasta que al consultar una nueva entrada en la tabla FAT, a la que llamaremos nf, su contenido es un número especial (reservado) que no señala un nuevo cluster sino que se ha llegado al final del fichero.
A fin de que pueda recorrerse la estructura en sentido ascendente (de las ramas al tronco), demás de la información anterior, existen dos entradas en la tabla que contiene la dirección de inicio del propio directorio y de su contenedor (su padre). Se denominan punto (.) y doble punto (..) respectivamente, y se utilizan exclusivamente para navegación. Por ejemplo, chdir .. [4].
§4 Directorio raíz
El hecho de que un directorio pueda contener otros directorios, y que cualquier fichero deba estar contenido en un directorio, conduce a que los directorios tienen una estructura jerárquica, y que en cada disco (lógico) debe haber al menos un directorio inicial (que contenga a todos los demás). Es el denominado directorio raíz, y tiene características especiales:
-
Es de tamaño fijo, es decir, puede contener un número fijo de "Entradas" (ficheros o directorios), en cambio los demás
pueden tener un número arbitrario [1]. La tabla adjunta muestra el
número máximo de entradas en el directorio raíz de distintas unidades:
Disquete 5.25" 360 KB 112 Disquete 3.5" 720 KB 112 Disquete 5.25" 1.2 MB 224 Disquete 3.5" 1.44 MB 224 Disquete 3.5" 2.88 MB 448 Disco duro --- 512 - Está situado en un punto predefinido (para que pueda ser encontrado). En los sistemas FAT es está situado directamente debajo de las FAT [3]. En cambio el principio de los demás directorios (y ficheros) pueden estar en cualquier parte.
- No puede ser borrado.
- No tiene "Padre". A pesar de ello tiene una entrada "..", pero no contiene la dirección de su padre sino un cero.
§5 Problemas en los sistemas de ficheros
Aparte de los que uno pueda crear o figurarse :-), la idiosincrasia del sistema de encadenamiento utilizado en las meta-estructuras de los sistemas de ficheros, hace que estos sean más o menos propensos a sufrir determinados defectos o accidentes que, por lo sensible del área, pueden acarrear problemas y consecuencias más o menos graves. A continuación mencionaremos los más comunes en los sistemas FAT, que además suelen ser reportados por las utilidades de verificación como scandisk o chkdsk.
§5.1 Clusters perdidos
Este problema, conocido también como de entradas huérfanas. Generalmente tiene su origen en la interrupción brusca de algún proceso (quizas un fallo de corriente). Se debe a que existen clusters que están marcados como utilizados en las tablas FAT, pero en realidad no pertenecen a ningún fichero; no es posible utilizarlos ni recuperarlos con los comandos normales de manejo de ficheros.
La estrategia de corrección utilizada por herramientas como scandisk, siguen un patrón de comportamiento más o menos como el siguiente: se saca una copia de la tabla FAT en memoria [5], y se marcan todas sus entradas que aparezcan como ocupadas con una marca que signifique "utilizada". A continuación, a partir del directorio raíz, se recorren todos los directorios y ficheros y se van anotando las entradas correspondientes a todos sus clusters con una marca especial en la nueva FAT que indique "Verificada" (significa que pertenece a algún fichero o directorio conocido). Al final del proceso, se hace una comparación una a una entre las entradas de la FAT original y la copia en memoria. Todas las entradas de la primera marcadas "ocupada" debe corresponder con una entrada en la copia de memoria con la marca "verificada". Las que conserven todavía la señal "utilizada" son entradas huérfanas, a las que no corresponde ningún trozo de fichero conocido.
Generalmente el programa de recuperación permite borrarlas directamente (declararlas como "libres") o coger los clusters contiguos y asignarlos a ficheros de nombres aleatorios que son creados al efecto. Por ejemplo, en el directorio raíz del volumen. Con las herramientas adecuadas es posible inspeccionar el contenidos de estos ficheros, que suelen ser trozos de ficheros perdidos (o quizás ficheros completos) y tratar de recuperar manualmente la información caso de ser valiosa (generalmente suelen ser trozos de ficheros anteriores borrados, o trozos de versiones anteriores de ficheros actuales).
§5.2 Ficheros de enlaces cruzados
Este problema, conocido como "Cross-Linked Files", aunque generalmente grave y de difícil solución, afortunadamente no es demasiado frecuente. Consiste en que, en ocasiones, las entradas de directorio de dos ficheros distintos señalan al mismo cluster como punto de inicio. El problema es que evidentemente, dos ficheros no pueden ocupar el mismo espacio físico en el disco, y cualquier operación realizada sobre uno de los ficheros machaca al contrario. La única solución es intentar hacer copia de ambos. Aunque generalmente cuando se descubre el problema uno de los dos ficheros se ha perdido.
§5.3 Fichero o directorio no válido
Se refiere a que en ocasiones, un fichero o directorio no sigue las reglas y convenciones que se supone debe cumplir. Las inconsistencias pueden ser muy variadas. Por ejemplo, una entrada de fichero en el directorio correspondiente que señala un cluster no válido (quizás un número fuera de rango); un directorio que carece de puntero a su directorio "padre"; un fichero o directorio cuyo bit de estado contiene una combinación no válida; que el campo fecha contenga un valor incorrecto. Etc. Generalmente los programas de verificación y corrección como scandisk corrigen este tipo de inconsistencias.
§5.4 Errores de asignación o de FAT
En ocasiones las entradas de la FAT pueden estar corrompidas ("Allocation or FAT Errors"), de forma que contienen valores incorrectos. En ciertos casos, el sistema de copia de la propia FAT permite resolver la incidencia de forma automática. En caso contrario, el problema puede suponer la pérdida irremediable de datos, aunque la utilidad de diagnóstico que lo ha detectado puede corregirlo para el futuro.
[1] Esta limitación fue eliminada en el Sistema FAT-32, pero subsiste en muchos otros sistemas. Por ejemplo, los usuarios Linux saben que si utilizan el sistema de ficheros ext2, al compilar el núcleo deben decidir cuanto espacio reservan para esta tabla.
[2] Como puede verse, solo se utilizan 6 de las 8 posibilidades. Los sistemas de ficheros más desarrollados. Por ejemplo Unix/Linux, disponen de muchos más atributos para los ficheros. En cualquier caso, la mayoría pueden ser modificados fácilmente por el usuario. Si dispone de una interfaz gráfica, haciendo clic sobre el fichero con el botón derecho del ratón. Si es un una interfaz modo texto, con los comandos rename o attrib, si está en DOS/Windows o rename, chmod, chown, touch etc. si está en Linux.
[3] Nuevamente el sistema FAT-32 representó una innovación, ya que el directorio raíz no tiene que comenzar necesariamente en un lugar definido, sino en cualquier punto del área de datos. A tal efecto, para que pueda ser encontrado, el indicador de este punto de comienzo está incluido en el bloque de parámetros BIOS (BPB) del sector de carga del volumen ( 8.1.2c2).
[4] Este diseño conduce a una evidente limitación en el sistema: Si nos indican un cluster cualquiera de un fichero, sería posible seguir la pista de los siguientes hasta completar la porción de fichero desde el cluster en cuestión hasta el final. Sin embargo, no seríamos capaces de seguir el camino inverso. Es decir, obtener el trozo desde el principio del fichero al cluster dado. En cambio si no posicionamos en un directorio cualquiera con el navegador, es posible seguir el camino descendentes (seguir cualquiera de sus ramas hasta el último nivel) o seguir el camino ascendente hasta alcanzar el directorio raíz de la unidad. Otra forma de indicarlo sería decir que la estructura FAT de ficheros es una lista simplemente enlazada, mientras que la de directorios es una estructura doblemente enlazada ( E1.8)
[5] Precisamente por esta razón (que debe ser
leída en memoria), no es posible ejecutar la aplicación scandisk en
los sistemas Windows (al menos la versión que acompaña a Windows98SE) con
unidades muy grandes. Por ejemplo, al intentar ejecutarla sobre una
unidad de 300 GB en un equipo con 512 MB de RAM, aparece el siguiente
mensaje: ScanDisk no puede continuar porque su PC no dispone de memoria
suficiente
. Lo mismo con otras utilidades de disco. Por ejemplo, Defrag.