Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
Introducción
Sistemas de archivos
Particiones y montaje
Semántica de consistencia
Semántica UNIX
Semántica de sesión
Semántica de archivos compartidos inmutables
NFS
Descripción
El protocolo de montaje
El protocolo NFS
Traducción de nombre de ruta
Operaciones remotas
Introducción
Como vimos, el sistema de archivos proporciona el mecanismo para el almacenamiento en
línea y el acceso al contenido de los archivos, incluidos los datos y los programas. Este
capítulo se ocupa principalmente de las estructuras internas y las operaciones de los
sistemas de archivos. Exploramos en detalle formas de estructurar el uso de archivos,
asignar espacio de almacenamiento, recuperar espacio liberado, rastrear las ubicaciones de
los datos e interconectar otras partes del sistema operativo con el almacenamiento
secundario.
Objetivos
Sistemas de archivos
Ciertamente, ninguna computadora de propósito general almacena un solo archivo. Por lo
general, hay miles, millones e incluso miles de millones de archivos dentro de una
computadora. Los archivos se almacenan en dispositivos de almacenamiento de acceso
aleatorio, incluidas unidades de disco duro, discos ópticos y dispositivos de memoria no
volátil.
Como hemos visto antes, un sistema informático de uso general puede tener varios
dispositivos de almacenamiento, y esos dispositivos se pueden dividir en particiones, que
contienen volúmenes, que a su vez contienen sistemas de archivos. Dependiendo del
administrador de volumen, un volumen también puede abarcar varias particiones. La figura
1 muestra una organización típica de un sistema de archivos.
Consideramos solo los sistemas de archivos de uso general. Sin embargo, vale la pena
señalar que existen muchos sistemas de archivos para propósitos especiales. Considere los
tipos de sistemas de archivos en el ejemplo de Solaris mencionado anteriormente:
● tmpfs: un sistema de archivos “temporal” que se crea en la memoria principal volátil
y su contenido se borra si el sistema se reinicia o falla
● objfs: un sistema de archivos “virtual” ( esencialmente una interfaz para el kernel
que parece un sistema de archivos) que brinda a los depuradores acceso a los
símbolos del kernel
● ctfs: un sistema de archivos virtual que mantiene información de "contrato" para
administrar qué procesos se inician cuando el sistema arranca y deben continuar
ejecutándose durante la operación
● lofs: un sistema de archivos de “bucle de retorno” que permite acceder a un sistema
de archivos en lugar de otro
● procfs: un sistema de archivos virtual que presenta información sobre todos los
procesos como un sistema de archivos
● ufs, zfs: sistemas de archivos de uso general
Los sistemas de archivo de computadoras, entonces, pueden ser extensos. Incluso dentro
de un sistema de archivos, es útil separar los archivos en grupos y administrarlos y actuar
sobre ellos. Esta organización implica el uso de directorios
el sistema de archivos montado esté disponible en ese directorio y ocultar los archivos
existentes del directorio hasta que se desmonte el sistema de archivos, terminando el uso
del sistema de archivos y permitiendo el acceso a los archivos originales en ese directorio.
Como otro ejemplo, un sistema puede permitir que el mismo sistema de archivos se monte
repetidamente, en diferentes puntos de montaje; o puede que solo permita un montaje por
sistema de archivos.
Considere las acciones del sistema operativo macOS. Siempre que el sistema encuentra un
disco por primera vez (ya sea en el momento del arranque o mientras el sistema se está
ejecutando), el sistema operativo macOS busca un sistema de archivos en el dispositivo. Si
encuentra uno, automáticamente monta el sistema de archivos en el directorio /Volumes,
agregando un ícono de carpeta etiquetado con el nombre del sistema de archivos (como
está almacenado en el directorio del dispositivo). A continuación, el usuario puede hacer clic
en el icono y así mostrar el sistema de archivos recién montado.
Particiones y montaje
El diseño de un disco puede tener muchas variaciones, según el sistema operativo y el
software de administración de volumen. Un disco puede dividirse en varias particiones o un
volumen puede abarcar varias particiones en varios discos. El primer diseño se analiza
aquí, mientras que el segundo, se considera más apropiadamente una forma de RAID.
Cada partición puede ser "sin procesar", que no contiene ningún sistema de archivos, o
"cocinada", que contiene un sistema de archivos. El disco sin formato se utiliza donde no
es apropiado ningún sistema de archivos. El espacio de intercambio de UNIX puede usar
una partición sin formato, por ejemplo, ya que usa su propio formato en el disco y no usa un
sistema de archivos. Asimismo, algunas bases de datos utilizan discos sin procesar y
formatean los datos para satisfacer sus necesidades. El disco sin formato también puede
contener la información que necesitan los sistemas RAID de disco, como mapas de bits que
indican qué bloques están reflejados y cuáles han cambiado y deben reflejarse. De manera
similar, el disco sin formato puede contener una base de datos en miniatura que contenga
información de configuración RAID, como qué discos son miembros de cada conjunto RAID.
Si una partición contiene un sistema de archivos que es de arranque, que tiene un sistema
operativo correctamente instalado y configurado, entonces la partición también necesita
información de arranque. Esta información tiene su propio formato, porque en el momento
del arranque el sistema no tiene cargado el código del sistema de archivos y, por lo tanto,
no puede interpretar el formato del sistema de archivos. Más bien, la información de
arranque suele ser una serie secuencial de bloques cargados como una imagen en la
memoria. La ejecución de la imagen comienza en una ubicación predefinida, como el primer
byte. Esta imagen, el cargador de arranque, a su vez, sabe lo suficiente sobre la estructura
del sistema de archivos para poder encontrar y cargar el kernel e iniciar su ejecución.
El cargador de arranque puede contener más que las instrucciones para arrancar un
sistema operativo específico. Por ejemplo, muchos sistemas se pueden arrancar de forma
dual, lo que nos permite instalar varios sistemas operativos en un solo sistema. ¿Cómo
sabe el sistema cuál arrancar? Un cargador de arranque que comprenda varios sistemas de
archivos y varios sistemas operativos puede ocupar el espacio de arranque. Una vez
cargado, puede arrancar uno de los sistemas operativos disponibles en la unidad. La unidad
puede tener varias particiones, cada una de las cuales contiene un tipo diferente de sistema
de archivos y un sistema operativo diferente. Tenga en cuenta que si el cargador de
arranque no comprende un formato de sistema de archivos en particular, un sistema
operativo almacenado en ese sistema de archivos no es de arranque. Esta es una de las
razones por las que solo algunos sistemas de archivos son compatibles como sistemas de
archivos raíz para cualquier sistema operativo determinado.
La partición raíz seleccionada por el cargador de arranque, que contiene el kernel del
sistema operativo y, a veces, otros archivos del sistema, se monta en el momento del
arranque. Otros volúmenes se pueden montar automáticamente en el arranque o
manualmente más tarde, según el sistema operativo. Como parte de una operación de
montaje exitosa, el sistema operativo verifica que el dispositivo contenga un sistema de
archivos válido. Lo hace pidiendo al controlador del dispositivo que lea el directorio del
dispositivo y verificando que el directorio tenga el formato esperado. Si el formato no es
válido, se debe verificar la consistencia de la partición y posiblemente corregirla, ya sea con
o sin la intervención del usuario. Finalmente, el sistema operativo anota en su tabla de
montaje en memoria que un sistema de archivos está montado, junto con el tipo de sistema
de archivos. Los detalles de esta función dependen del sistema operativo.
Los sistemas basados en Microsoft Windows montan cada volumen en un espacio de
nombre separado, indicado por una letra y dos puntos, como se mencionó anteriormente.
Para registrar que un sistema de archivos está montado en F:, por ejemplo, el sistema
operativo coloca un puntero al sistema de archivos en un campo de la estructura del
dispositivo correspondiente a F:. Cuando un proceso especifica la letra del controlador, el
sistema operativo encuentra el puntero del sistema de archivos apropiado y atraviesa las
estructuras de directorio en ese dispositivo para encontrar el archivo o directorio
especificado. Las versiones posteriores de Windows pueden montar un sistema de archivos
en cualquier punto dentro de la estructura de directorios existente.
Usuarios múltiples
Cuando un sistema operativo tiene capacidad para varios usuarios, los problemas de uso
compartido de archivos, nombres de archivos y protección de archivos se vuelven
preeminentes. Dada una estructura de directorio que permite que los usuarios compartan
archivos, el sistema debe mediar en el intercambio de archivos. El sistema puede permitir
que un usuario acceda a los archivos de otros usuarios de forma predeterminada o requerir
que un usuario otorgue específicamente acceso a los archivos.
Muchos sistemas tienen varios sistemas de archivos locales, incluidos los volúmenes de un
solo disco o varios volúmenes en varios discos conectados. En estos casos, la verificación
de ID y la coincidencia de permisos son sencillas, una vez que se montan los sistemas de
archivos. Pero considere un disco externo que se pueda mover entre sistemas. ¿Qué pasa
si las ID de los sistemas son diferentes? Se debe tener cuidado para estar seguro de que
Ds coinciden entre sistemas cuando los dispositivos se mueven entre ellos o cuando la
propiedad del archivo se restablece cuando ocurre tal movimiento. (Por ejemplo, podemos
crear una nueva ID de usuario y configurar todos los archivos en el disco portátil con esa ID,
para asegurarnos de que ningún archivo sea accesible accidentalmente para los usuarios
existentes).
Por lo tanto, el VFS distingue los archivos locales de los remotos, y los archivos locales se
distinguen aún más según sus tipos de sistema de archivos.
El VFS activa operaciones específicas del sistema de archivos para manejar solicitudes
locales de acuerdo con sus tipos de sistema de archivos y llama a los procedimientos de
protocolo NFS (u otros procedimientos de protocolo para otros sistemas de archivos de red)
para solicitudes remotas. Los identificadores de archivo se construyen a partir de los vnodes
relevantes y se pasan como argumentos a estos procedimientos. La capa que implementa
el tipo de sistema de archivos o el protocolo del sistema de archivos remoto es la tercera
capa de la arquitectura.
Para cada uno de estos cuatro tipos de objetos, el VFS define un conjunto de
operaciones que pueden implementarse. Cada objeto de uno de estos tipos contiene un
puntero a una tabla de funciones. La tabla de funciones enumera las direcciones de las
funciones reales que implementan las operaciones definidas para ese objeto en
particular. Por ejemplo, una API abreviada para algunas de las operaciones del objeto
de archivo incluye:
Se requiere una implementación del objeto de archivo para un tipo de archivo específico
para implementar cada función especificada en la definición del objeto de archivo. (La
definición completa del objeto de archivo se especifica en las operaciones de archivo de
estructura de archivo, que se encuentra en el archivo /usr/include/linux/fs.h).
Por lo tanto, la capa de software VFS puede realizar una operación en uno de estos
objetos llamando a la función adecuada desde la tabla de funciones del objeto, sin tener
que saber de antemano exactamente con qué tipo de objeto se trata. El VFS no sabe, ni
le importa, si un inodo representa un archivo de disco, un archivo de directorio o un
archivo remoto. La función apropiada para la operación read() de ese archivo siempre
estará en el mismo lugar en su tabla de funciones, y la capa de software VFS llamará a
esa función sin importar cómo se leen realmente los datos.
El modelo cliente-servidor
Los sistemas de archivos remotos permiten que una computadora monte uno o más
sistemas de archivos desde una o más máquinas remotas. En este caso, la máquina que
contiene los archivos es el servidor y la máquina que busca acceso a los archivos es el
cliente. La relación cliente-servidor es común en las máquinas en red. Generalmente, el
servidor declara que un recurso está disponible para los clientes y especifica exactamente
qué recurso (en este caso, qué archivos) y exactamente qué clientes. Un servidor puede
servir a varios clientes y un cliente puede utilizar varios servidores, según los detalles de
implementación de una instalación cliente-servidor determinada.
Una vez que se monta el sistema de archivos remoto, las solicitudes de operación de
archivos se envían en nombre del usuario a través de la red al servidor a través del
protocolo DFS. Normalmente, se envía una solicitud de apertura de archivo junto con el ID
del usuario solicitante. A continuación, el servidor aplica las comprobaciones de acceso
estándar para determinar si el usuario tiene credenciales para acceder al archivo en el
modo solicitado. La solicitud se permite o se niega. Si está permitido, se devuelve un
identificador de archivo a la aplicación cliente y la aplicación puede realizar operaciones de
lectura, escritura y otras operaciones en el archivo. El cliente cierra el archivo cuando se
completa el acceso. El sistema operativo puede aplicar una semántica similar a la del
montaje de un sistema de archivos local o puede utilizar una semántica diferente.
La industria se está moviendo hacia el uso del protocolo ligero de acceso a directorios
(LDAP) como un mecanismo de asignación de nombres distribuido seguro. De hecho, el
directorio activo se basa en LDAP. Oracle Solaris y la mayoría de los otros sistemas
operativos importantes incluyen LDAP y permiten su uso para la autenticación de usuarios,
así como para la recuperación de información en todo el sistema, como la disponibilidad de
impresoras. Posiblemente, una organización podría utilizar un directorio LDAP distribuido
para almacenar toda la información de usuarios y recursos de todas las computadoras de la
organización. El resultado sería un inicio de sesión único seguro para los usuarios, que
ingresarían su información de autenticación una vez para acceder a todas las computadoras
dentro de la organización. También facilitaría los esfuerzos de administración del sistema al
combinar, en una ubicación, la información que actualmente se encuentra dispersa en
varios archivos de cada sistema o en diferentes servicios de información distribuida.
Modos de falla
Los sistemas de archivos locales pueden fallar por una variedad de razones, incluida la falla
de la unidad que contiene el sistema de archivos, la corrupción de la estructura del
directorio u otra información de administración del disco (denominada colectivamente
metadatos), falla del controlador de disco, falla del cable y falla del adaptador de host. La
falla del usuario o del administrador del sistema también puede causar la pérdida de
archivos o la eliminación de directorios o volúmenes completos. Muchas de estas fallas
harán que un host se bloquee y se muestre una condición de error, y es posible que se
requiera la intervención humana para reparar el daño.
Los sistemas de archivos remotos tienen aún más modos de falla. Debido a la complejidad
de los sistemas de red y las interacciones requeridas entre máquinas remotas, muchos más
problemas pueden interferir con el funcionamiento correcto de los sistemas de archivos
remotos. En el caso de las redes, la red puede interrumpirse entre dos hosts. Tales
interrupciones pueden resultar de fallas de hardware, mala configuración de hardware o
problemas de implementación de redes. Aunque algunas redes tienen capacidad de
recuperación incorporada, incluidas varias rutas entre hosts, muchas no la tienen. Por tanto,
cualquier fallo puede interrumpir el flujo de comandos DFS.
Para implementar este tipo de recuperación de fallas, se puede mantener algún tipo de
información de estado tanto en el cliente como en el servidor. Si tanto el servidor como el
cliente mantienen el conocimiento de sus actividades actuales y archivos abiertos, entonces
pueden recuperarse sin problemas de una falla. En la situación en la que el servidor falla
pero debe reconocer que ha montado de forma remota sistemas de archivos exportados y
archivos abiertos, NFS Versión 3 adopta un enfoque simple, implementando un DFS sin
estado. En esencia, asume que una solicitud del cliente para leer o escribir un archivo no se
habría producido a menos que el sistema de archivos se hubiera montado de forma remota
y el archivo se hubiera abierto previamente. El protocolo NFS lleva toda la información
necesaria para ubicar el archivo apropiado y realizar la operación solicitada. De manera
similar, no rastrea qué clientes tienen montados los volúmenes exportados, asumiendo
nuevamente que si llega una solicitud, debe ser legítima. Si bien este enfoque sin estado
hace que NFS sea resistente y bastante fácil de implementar, también lo hace inseguro. Por
ejemplo, un servidor NFS podría permitir solicitudes de lectura o escritura falsificadas. Estos
problemas se abordan en la versión 4 de NFS estándar de la industria, en la que NFS se
hace con estado para mejorar su seguridad, rendimiento y funcionalidad.
Semántica de consistencia
La semántica de consistencia representa un criterio importante para evaluar cualquier
sistema de archivos que admita el uso compartido de archivos. Esta semántica especifica
cómo varios usuarios de un sistema deben acceder a un archivo compartido
simultáneamente. En particular, especifican cuándo las modificaciones de los datos por
parte de un usuario serán observadas por otros usuarios. Esta semántica generalmente se
implementa como código con el sistema de archivos.
Para la siguiente discusión, asumimos que una serie de accesos a archivos (es decir,
lecturas y escrituras) intentados por un usuario en el mismo archivo siempre están
encerrados entre las operaciones open() y close(). La serie de accesos entre las
operaciones open() y close() conforma una sesión de archivo. Para ilustrar el
concepto, esbozamos varios ejemplos destacados de semántica de consistencia.
Semántica UNIX
El sistema de archivos de UNIX utiliza la siguiente semántica de consistencia:
En la semántica de UNIX, un archivo está asociado con una única imagen física a la que se
accede como recurso exclusivo. La disputa por esta única imagen provoca retrasos en los
procesos del usuario.
Semántica de sesión
El sistema de archivos de Andrew (OpenAFS) utiliza la siguiente semántica de consistencia:
De acuerdo con esta semántica, un archivo puede estar asociado temporalmente con varias
imágenes (posiblemente diferentes) al mismo tiempo. En consecuencia, varios usuarios
pueden realizar accesos de lectura y escritura simultáneamente en sus imágenes del
archivo, sin demora. Casi no se aplican restricciones a la programación de accesos.
NFS
Los sistemas de archivos de red NFS son comunes. Por lo general, se integran con la
estructura general de directorios y la interfaz del sistema cliente. NFS es un buen ejemplo
de un sistema de archivos de red cliente-servidor bien implementado y ampliamente
utilizado. Aquí, lo usamos como ejemplo para explorar los detalles de implementación de los
sistemas de archivos de red.
NFS es tanto una implementación como una especificación de un sistema de software para
acceder a archivos remotos a través de LAN (o incluso WAN). NFS es parte de ONC+, que
admiten la mayoría de los proveedores de UNIX y algunos sistemas operativos de PC. La
implementación que se describe aquí es parte del sistema operativo Solaris, que es una
versión modificada de UNIX SVR4. Utiliza el protocolo TCP o UDP / IP (según la red de
interconexión). La especificación y la implementación están entrelazadas en nuestra
descripción de NFS. Siempre que se necesitan detalles, nos referimos a la implementación
de Solaris; siempre que la descripción sea general, también se aplica a la especificación.
Hay varias versiones de NFS, siendo la última la versión 4. Aquí describimos la versión 3,
que es la versión más comúnmente implementada.
Descripción
NFS ve un conjunto de estaciones de trabajo interconectadas como un conjunto de
máquinas independientes con sistemas de archivos independientes. El objetivo es permitir
cierto grado de intercambio entre estos sistemas de archivos (bajo pedido explícito) de
manera transparente. El intercambio se basa en una relación cliente-servidor. Una máquina
puede ser, y a menudo lo es, tanto un cliente como un servidor. Se permite compartir entre
cualquier par de máquinas. Para garantizar la independencia de la máquina, compartir un
sistema de archivos remoto afecta solo a la máquina cliente y a ninguna otra máquina.
Para que un directorio remoto sea accesible de manera transparente desde una máquina en
particular, por ejemplo, desde M1, un cliente de esa máquina debe realizar primero una
operación de montaje. La semántica de la operación implica montar un directorio remoto
sobre un directorio de un sistema de archivos local. Una vez que se completa la operación
de montaje, el directorio montado se ve como un subárbol integral del sistema de archivos
local, reemplazando el subárbol que desciende del directorio local. El directorio local se
convierte en el nombre de la raíz del directorio recién montado. La especificación del
directorio remoto como argumento para la operación de montaje no se realiza de forma
transparente; se debe proporcionar la ubicación (o nombre de host) del directorio remoto.
Sin embargo, a partir de ese momento, los usuarios de la máquina M1 pueden acceder a los
archivos del directorio remoto de forma totalmente transparente.
Uno de los objetivos de diseño de NFS era operar en un entorno heterogéneo de diferentes
máquinas, sistemas operativos y arquitecturas de red. La especificación NFS es
Una operación de montaje incluye el nombre del directorio remoto que se va a montar y el
nombre de la máquina servidor que lo almacena. La solicitud de montaje se asigna al RPC
correspondiente y se reenvía al servidor de montaje que se ejecuta en la máquina del
servidor específico. El servidor mantiene una lista de exportación que especifica los
sistemas de archivos locales que exporta para el montaje, junto con los nombres de las
máquinas que pueden montarlos. (En Solaris, esta lista es /etc/dfs/dfstab, que solo
puede editar un superusuario). La especificación también puede incluir derechos de acceso,
como solo lectura. Para simplificar el mantenimiento de listas de exportación y tablas de
montaje, se puede utilizar un esquema de nombres distribuido para mantener esta
información y ponerla a disposición de los clientes apropiados.
El servidor también mantiene una lista de las máquinas cliente y los correspondientes
directorios montados actualmente. Esta lista se utiliza principalmente con fines
administrativos, por ejemplo, para notificar a todos los clientes que el servidor no funciona.
Solo mediante la adición y eliminación de entradas en esta lista, el protocolo de montaje
puede afectar el estado del servidor.
Por lo general, un sistema tiene una configuración previa de montaje estático que se
establece en el momento del arranque (/etc/vfstab en Solaris); sin embargo, este
diseño se puede modificar. Además del procedimiento de montaje real, el protocolo de
montaje incluye varios otros procedimientos, como desmontar y devolver la lista de
exportación.
El protocolo NFS
El protocolo NFS proporciona un conjunto de RPCs para operaciones de archivos remotos.
Los procedimientos admiten las siguientes operaciones:
Mantener la lista de clientes que mencionamos parece violar la apatridia del servidor. Sin
embargo, esta lista no es esencial para el correcto funcionamiento del cliente o del servidor
y, por lo tanto, no es necesario restaurarla después de una caída del servidor. En
consecuencia, puede incluir datos inconsistentes y se trata solo como una sugerencia.
Se garantiza que una sola llamada al procedimiento de escritura NFS sea atómica y no se
entremezcle con otras llamadas de escritura al mismo archivo. Sin embargo, el protocolo
NFS no proporciona mecanismos de control de simultaneidad. La llamada al sistema
write() se puede dividir en varias escrituras RPC, porque cada llamada write() o
read() NFS puede contener hasta 8 KB de datos y los paquetes UDP están limitados a
1500 bytes. Como resultado, dos usuarios que escriben en el mismo archivo remoto pueden
mezclar sus datos. La afirmación es que, debido a que la administración de bloqueos es
intrínsecamente con estado, un servicio fuera del NFS debería proporcionar bloqueo (y
Solaris lo hace). Se aconseja a los usuarios que coordinen el acceso a los archivos
compartidos mediante mecanismos fuera del alcance de NFS.
NFS está integrado en el sistema operativo a través de un VFS. Como ilustración de la
arquitectura, rastreamos cómo se maneja una operación en un archivo remoto ya abierto
(siga el ejemplo de la figura 8). El cliente inicia la operación con una llamada regular al
sistema. La capa del sistema operativo asigna esta llamada a una operación VFS en el
vnode apropiado. La capa VFS identifica el archivo como remoto e invoca el procedimiento
NFS apropiado. Se realiza una llamada RPC a la capa de servicio NFS en el servidor
remoto. Esta llamada se reinyecta a la capa VFS en el sistema remoto, que encuentra que
es local e invoca la operación apropiada del sistema de archivos. Esta ruta se recorre para
devolver el resultado. Una ventaja de esta arquitectura es que el cliente y el servidor son
idénticos; por tanto, una máquina puede ser un cliente, un servidor o ambos. El servicio real
en cada servidor se realiza mediante hilos del núcleo.
Operaciones remotas
Con la excepción de abrir y cerrar archivos, existe una correspondencia casi uno a uno
entre las llamadas regulares al sistema UNIX para operaciones de archivos y las RPC del
protocolo NFS. Por lo tanto, una operación de archivo remoto se puede traducir
directamente al RPC correspondiente. Conceptualmente, NFS se adhiere al paradigma de
servicio remoto; pero en la práctica, las técnicas de almacenamiento en búfer y caché se
emplean en aras del rendimiento. No existe correspondencia directa entre una operación
remota y un RPC. En su lugar, los bloques de archivo y los atributos de archivo son
recuperados por los RPC y se almacenan en caché localmente. Las operaciones remotas
futuras utilizan los datos almacenados en caché, sujetos a restricciones de consistencia.