Sistema de ficheros

Un sistema de ficheros o archivos es el componente del sistema operativo que se encarga de gestionar las memorias secundarias mediante un conjunto de tablas y estructuras. Hay muchos tipos de sistemas de archivos pero el sistema operativo proporciona una API para que todos se gestionen igual y que el usuario no vea más que una colección de archivos organizados en directorios.
Según el soporte en el que residan los datos podemos clasificar los tipos de sistemas de ficheros:

* Unidades de memoria secundaria como discos magnéticos, ópticos o unidades de estado sólido: ext2/ext3/ext4, FAT, NTFS, UFS, Btrfs...
* Almacenamiento en red o distribuido: NFS, SMB.
* Sistemas virtuales en memoria principal: procfs, tmpfs...

## Sistema de ficheros ext

En los sistemas de ficheros ext (ext, ext2, ext3, ext4) el espacio de almacenamiento se divide en bloques y estos se agrupan en grupos de bloques. Todos los grupos de bloques tienen la misma estructura, parte de la información que tienen (el superbloque y los descriptores de grupo) está copiada al principio de todos los grupos de bloques por redundancia. La estructura de un grupo de bloques es, por orden:

* **Superbloque**: tiene información sobre la versión de ext que sigue este sistema de ficheros, el tamaño de bloque, el nº de bloques por grupo, el nº de i-nodos y bloques libres, el i-nodo del directorio raíz, el nº de bloque en el que se encuentra esta copia del superbloque...
* **Descriptores de todos los grupos de bloques**. Cada descriptor de bloque contiene la ubicación del mapa de bloques, mapa de i-nodos y tabla de i-nodos así como la cantidad de i-nodos libres, bloques de este grupo libres y directorios usados.
* **Mapa de bloques de datos**: indica que bloques de datos están siendo usados.
* **Mapa de i-nodos**: indica que i-nodos están siendo usados.
* **Tabla de i-nodos**: contiene los i-nodos de este grupo de bloques. Cada i-nodo contiene: tipo de dato (archivo, directorio, link simbólico, dispositivo), permisos, usuario y grupo propietario, tamaño, timestamps de creación y última modificación y punteros a los bloques donde están los datos (12 directos y tres indirectos: simple, doble y triple).

## Journaling

Para evitar que fallos hardware (como desconectar el dispositivo repentinamente) producidos a mitad de una operación dejen el sistema de fichero en un estado inconsistente, los sistemas modernos usan la técnica del journaling.

El journaling consiste en, antes de modificar el sistema de ficheros, apuntar la modificación en un espacio reservado llamado journal, log o bitácora. Si se produce un fallo a mitad de copiar algo al journal se descarta esta modificación, pero si se produce el fallo copiando al sistema de ficheros entonces se usa la copia del journal para devolver el sistema de ficheros a un estado coherente (posiblemente desactualizado).

ext3, ext4, ReiserFS y XFS usan journaling.

Hay varios tipos de journaling:

* **Journal mode**: todos los datos se copian al journal antes de copiarse al sistema de ficheros. Realintiza mucho las operaciones.
* **Writeback**: Se copian los metadatos al journal y luego se realiza la operación completa en el sistema de ficheros. Sigue siendo vulnerable a fallos.
* **Ordered**: Se copian los metadatos al journal, luego los datos al sistema de ficheros y por último los metadatos al sistema de ficheros.

## Atributos de ficheros

POSIX proporciona funciones para consultar los atributos de un fichero dado a partir de su ruta (**stat**(2) y **lstat**(2)) o a partir de su descriptor de fichero (**fstat**(2)). **lstat**(2) proporciona información sobre los enlaces simbólicos en sí, **stat**(2) y **fstat**(2) dan información sobre el archivo al que apunta el enlace simbólico. La información que proporcionan estas funciones es: dispositivo en el que se encuentra el fichero, nº de i-nodo, modo (tipo y permisos), nº de links que le apuntan, identificadores de usuario y grupo propietario, tamaño...

Para comprobar los permisos de un archovo existe la función **accces**(2). El porpietario del archivo o el superusuario puede cambiarle los permisos con la funcion **chmod**(2) o el comando **chmod**(1).

## Creación, apertura, lectura y escritura de ficheros

Para que un proceso interactue con ficheros necesita un *descriptor de fichero*. Esto es simplemente un entero positivo. Cada proceso tiene asignada una tabla que a cada descriptor de fichero le asigna un *descriptor de fichero abierto*. El sistema operativo tiene un tabla con los descriptores de fichero abierto de todos los procesos. Cada descriptor de fichero abierto tiene información sobre los permisos de lectura escritura, la posición del documento en la que se está leyendo/escribiendo y el nº de i-nodo del fichero.

Los procesos pueden obtener dos descriptores de fichero asociados al mismo descriptor de fichero abierto con las funciones **dup**(2) y **dup2**(2). No es claro para que sirve esto.

Para abrir y crear ficheros POSIX proporciona la función **open**(2). Los flags de esta función permiten especificar los permisos con los que se abrirá el fichero y si, en caso de no existir, se creará uno nuevo. Se puede especificar los permisos que tendrá el fichero en caso de que se cree con el argumento **mode.**

Las funciones **read**(2) y **write**(2) permiten leer y escribir un fichero a partir de la posición apuntada por el descriptor de fichero abierto. **lseek**(2) permite cambiar la posición del documento a la que apunta el desriptor de fichero abierto. **close**(2) hace que el descriptor de fichero dado deje de estar asociado a un descriptor de fichero abierto y, si era el último asociado, libera los recursos asociados a este.

## Referencias

1. ↑ man fs
http://man7.org/linux/man-pages/man5/filesystems.5.html
2. ↑ The ext2 file system

https://piazza-resources.s3.amazonaws.com/il71xfllx3l16f/inz4wsb2m0w2oz/ext2.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAR6AWVCBXYBFXHIPU%2F20190107%2Fus-east-1%2Fs3%2Faws4\_request&X-Amz-Date=20190107T183228Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=FQoGZXIvYXdzEAsaDFWVc801KuqXHOzo%2ByK3A%2FmvpRq5nWHJzcTZxnR6iA5H%2Fvjr12IWlu0sqJFo5u9Iq1Mh6IkhUm7QoaM8CyAnMNlEWCxUSsHBpdKbVrJFQUJZtrXxS59THZNsF%2BUMblD8UWD2HzTD%2F8XRA67eKqLqYV%2FobdjSmbNVy1R%2Bq7Sq%2F8HCl7eG9GLq%2FsF06XuhICT25uxwm8n5t%2Bie5Yn1gAV6E69RNG6li95wBjTz5Wbo2bSoK%2B3dmLXWsUGHRKXzON1Ps1dTOXhWVtuoM%2B999YuXBDJwQWDxwJGXCqwjI87EIbyMh9dfpqASFQt8tNm1hOJvBsywtaa0twlXPt%2FLeQD8DWJFVxcDRTZSPP88qYVQZ3NzfFJQ4J%2B3Xex05R2a6P37b2B%2FyfmQN9l%2Fg3eANHTs0Cu5oBX6rwELgsuM5h4RRhobs3WJPjQ7X6SIPYBid22inJCnbmBZkrqyWk496K4cD72I%2F%2Fq6rwfwN4PUlAPb1bJzhYR0r278aTwIiK%2FSNQlwPbHBC5J4iG5iBo%2FIKlB93KUBoVe%2FOi%2BctZDznU4JTVCufgrhR9%2F31d1O59RMLhFzEoTP7MQsY1LFp4i2i79mbJePYVQLYWYohpHO4QU%3D&X-Amz-Signature=7df6aaa337001ddbec27ebe77fb9964cf0f88e94fb619757474bca96ffe938df
3. ↑ man stat

http://man7.org/linux/man-pages/man2/fstat.2.html
4. ↑ man access

http://man7.org/linux/man-pages/man2/access.2.html
5. ↑ man 2 chmod

http://man7.org/linux/man-pages/man2/chmod.2.html
6. ↑ man chmod

http://man7.org/linux/man-pages/man1/chmod.1.html
7. ↑ man 2 open NOTES

http://man7.org/linux/man-pages/man2/open.2.html#NOTES
8. ↑ man dup

http://man7.org/linux/man-pages/man2/dup.2.html