1.07k likes | 1.38k Views
Diseño de Sistemas Operativos. Implementaciones de Sistemas de Ficheros ( Superbloque ). EMILIO GONZÁLEZ DÍAZ IGNACIO SOLINIS CAMALICH. ¿Qué es un Sistema de Ficheros?. Es el método mediante el cual se almacena la información en el disco duro .
E N D
Diseño de Sistemas Operativos Implementaciones de Sistemas de Ficheros (Superbloque) EMILIO GONZÁLEZ DÍAZ IGNACIO SOLINIS CAMALICH
¿Qué es un Sistema de Ficheros? • Es el método mediante el cual se almacena la información en el disco duro. • Almacena y Gestiona los datos que los usuarios tienen guardados en los dispositivos de almacenaje. • Asegura que los datos que se obtienen son idénticos a los que se almacenaron originalmente. • Crea y gestiona información sobre los ficheros y sobre sí mismo.
Historia de los SF en Linux • La primera versión del sistema de ficheros de Linux estaba basada en el sistema de ficheros de Minix. Muy limitado. • Más tarde entró en escena el sistema de ficheros extendido (Extfs). Resultados insatisfactorios de rendimiento. • Por esto, en 1994 surgió el segundo sistema de ficheros extendido (Ext2fs). Alta eficiencia y robustez.
Historia de los SF en Linux • Durante los últimos años, el Ext2 ha sido el sistema de ficheros más extendido entre los sistemas Linux. • Linux se usa cada vez más en entornos servidor, llevando a Ext2 al límite de sus posibilidades. • Los requisitos más comunes de hoy en día son: • Necesidad de recuperación rápida de caídas del sistema • Rendimiento alto en operaciones de Entrada / Salida (I/O) • Necesidad de almacenar Terabytes de información
Historia de los SF en Linux • Para solventar estas carencias, aparecen entre otros, los sistemas de ficheros Ext3, ReiserFS, XFS y JFS. • Además de cumplir con los requisitos especificados más arriba, todos ellos soportan el sistema “Journaling”. • Un sistema de ficheros Journaling • Simplifica los reinicios • Reduce problemas derivados de la fragmentación • Acelera las operaciones de E/S
El sistema de ficheros en Linux • Los sistemas de ficheros se crean en particiones. • Los sistemas basados en Unix utilizan un sistema jerarquizado compuesto por: • Ficheros • Directorios, los cuales pueden contener tanto ficheros como directorios
El sistema de ficheros en Linux • Los sistemas de ficheros se montan mediante el comando “mount”. • Mount se ejecuta automáticamente en el proceso de arranque del sistema. • El listado de sistemas de ficheros a montar se almacena en el fichero /etc/fstab (filesystem table)
El sistema de ficheros en Linux • El listado de los sistemas de ficheros montados en el sistema se almacena en el fichero /etc/mtab (mount table) • Los sistemas de ficheros se desmontan automáticamente con el apagado del sistema.
Criterios de Selección • ESTABILIDAD Y FIABILIDAD – Con respecto a la pérdida de datos • CAPACIDAD (“lo capaz que es”) – Requisitos de rendimiento • CAPACIDAD (“la capacidad que tiene”) – Los límites del sistema de ficheros • MANTENIMIENTO – El tipo de mantenimiento que necesita • AFINAMIENTO (tuning) – Facilidad de configuración y afinamiento del sistema • SOPORTE – Por parte del grupo de desarrollo
Sistema Virtual de Archivos (VFS) • Los distintos SO suelen usar su propio Sistema de Ficheros • Esto complica la compartición de datos en un disco duro entre distintos SO • Linux ofrece soporte para distintos Sistemas de Ficheros como EXT2, Minix, FAT…
Sistema Virtual de Archivos (VFS) • Los procesos necesitan de un acceso uniforme a los datos, sin preocuparse de qué Sistema de Ficheros se trata • El VFS es la interfaz entre las llamadas al sistema y la gestión de archivos • Las llamadas se dirigen al VFS, que redirige la petición al módulo que gestiona el archivo
Definición de conceptos • Un BLOQUE lógico es la unidad más pequeña de almacenamiento (se mide en bytes) • Un VOLUMEN lógico es una PARTICIÓN de disco. • Las particiones están divididas en bloques. • La Asignación de bloques es un método donde el sistema de ficheros asigna un bloque cada vez. • Un puntero a cada bloque se mantiene y almacena en el sistema.
Definición de conceptos • La FRAGMENTACIÓN INTERNA ocurre cuando un fichero no ocupa por completo un bloque. • Ej. Si tenemos un fichero de 10K y un tamaño de bloque de 8K, el sistema de ficheros asignará dos bloques para alojar el fichero, pero 6K del segundo bloque se desaprovecharán. Nótese que a mayor tamaño de bloque mayor será el espacio desperdiciado. • La FRAGMENTACIÓN EXTERNA ocurre cuando los bloques lógicos no se encuentran contiguos. Este tipo de fragmentación produce un bajo rendimiento.
Definición de conceptos • Un Extent es un conjunto de bloques contiguos. • Cada Extent se describe como una tripleta • Offset del fichero, que nos dice a qué bloque lógico corresponde dentro del fichero. • El número del primer bloque del extent. • El tamaño del extent (medido en bloques).
Definición de conceptos • Los extent se asignan y se monitorizan como una unidad independiente (forman un todo) por lo que un único puntero monitorizará un grupo de bloques. • La técnica de asignación de extents es un método más eficiente para ficheros grandes que la técnica de asignación de bloques.
Ejemplo del uso de extents: • El fichero requiere 18 bloques • El sistema de ficheros realiza una asignación de: • 1 extent de 8 bloques. • 2 extent de 5 bloques.
Definición de conceptos • Lista de Control de Acceso (Access Control List –ACL): Especifica los derechos de acceso para cualquier usuario específico o combinación de usuarios. • Los METADATOS son las estructuras de datos internas del sistema de ficheros • Los metadatos incluyen: • La fecha y hora. • Información sobre el propietario. • La lista de control de acceso (ACL). • El tamaño del fichero…
Definición de conceptos • Un I-NODEalmacena toda la información sobre un fichero excepto la información del fichero propiamente dicha (es un Metadato). • Un i-node consume también bloques. • Un i-node contiene: • Los permisos del fichero. • El tipo del fichero. • El número de links (enlaces) al fichero.
Definición de conceptos • Cada i-node tiene un número único que los identifica. • Un DIRECTORIO es un tipo específico de fichero que contiene punteros a otros ficheros. • El i-node de un fichero directorio simplemente contiene el número identificador de los i-nodes que contiene además de los permisos, etc.
Características del Ext2 • Ext2 está presente sobre un dispositivo físico (disquete, disco duro...) • Seleccionar el tamaño de bloque en la creación del sistema de ficheros (desde 1.024 a 4096 bytes). Esto dependerá del tamaño medio esperado de los ficheros. • En la creación del sistema de ficheros también se puede elegir el número de inodes que se van a permitir para una partición.
Características del Ext2 • El sistema de ficheros coloca los bloques de disco en grupos. • Cada bloque incluye bloques de datos e i-nodes almacenados en pistas adyacentes. • Gracias a esta estructura, ficheros almacenados en un único grupo de bloques pueden ser accedidos en un menor tiempo promedio de búsqueda en disco.
Características del Ext2 • El sistema de ficheros preasigna bloques de datos en disco a ficheros regulares antes de ser usados. • Cuando el fichero aumenta de tamaño, varios bloques ya están reservados en posiciones adyacentes (reduce la fragmentación externa). • Soporta chequeos automáticos de consistencia en el inicio del sistema (e2fsck).
Características del Ext2 • Borrado Lógico. Permite a los usuarios la recuperación sencilla, si es necesario, del contenido de un fichero previamente eliminado. • Compatibilidad tanto con el SVR4 (Unix System V Release 4) y con la semántica BSD.
Estructura Física de un SF EXT2 • Está formado por una colección de bloques secuenciales • El sector de boot contiene el código necesario para cargar el núcleo en el arranque del sistema. • El sistema de ficheros es manejado globalmente como una serie de Grupos de Bloques (GB)
Estructura Física de un SF EXT2 • Los GB ayudan a mantener la información relacionada físicamente cercana en el disco, simplificando las tareas de gestión. • Todos los grupos de bloques tienen el mismo tamaño y están colocados de manera secuencial. • De esta manera se reduce la fragmentación externa.
Estructura Física de un SF EXT2 Cada GB se descompone a su vez en distintos elementos: • Una copia del superbloque • Una copia de la tabla de descriptores de grupo • Un bloque de bitmap para los bloques • Un bloque de bitmap para los i-nodos • Una tabla de i-nodos • Bloques de datos
DISCO 0 1024 2048 SECTOR BOOT SUPERBLOQUE El Superbloque • Contiene las informaciones de control del sistema de archivos • Se sitúa al principio del sistema de archivos en disco. Se encuentra en el offset fijo 1024 del disco y ocupa 1024 bytes • El superbloque contiene una descripción del tamaño y forma del sistema de archivos • Existe una copia del mismo en cada GB
Estructura del superbloque • Es almacenado en una estructura denominada ext2_super_block, definida en el archivo <linux/ext2_fs.h> • Hay tres tipos de información almacenada en la estructura del superbloque: • Parámetros fijos • Parámetros del sistema modificables • Información sobre el estado del sistema de ficheros
Parámetros modificables • Existen parámetros que pueden ser modificados por el usuario durante el funcionamiento del SF
Parámetros de Información sobre el estado del sistema de ficheros • El sistema va modificando sus valores en función del estado en que se encuentre
Estructura del descriptor de grupo • Cada grupo de bloques, contiene una copia del superbloque, así como una copia de descriptores de grupos • Estos descriptores contienen las coordenadas de las estructuras de control presentes en cada grupo • Los descriptores de grupo se colocan todos juntos, formando así la tabla de descriptores de grupo • En el fichero de cabecera linux/ext2_fs.h se encuentra la definición de la estructuraext2_group_desc, que define el descriptor de grupo
Estructura del descriptor de grupo • Todos estos elementos son creados en el momento de creación del sistema de ficheros • bg_block_bitmap y bg_inode_bitmap contienen el número de bloque del bitmap de asignación de bloques y del bitmap de asignación de i-nodos respectivamente • Los campos bg_free_blocks_count, bg_free_inodes_count y bg_used_dirs_count mantienen información estadística sobre el uso de estos recursos en el GB
Tratamiento de errores en EXT2 • EXT2 no realiza un tratamiento del error propiamente dicho • Cualquier error ha de ser identificado por el kernel, quien debe lanzar programas de chequeo como e2fsck, debugfs ó EXT2ED • Estos programas consultan s_state (bit limpio), que está a 0 con el sistema montado y a 1 cuando se desmonta • Un error común es el apagado del sistema sin desmontar los SF montados • Causa que el s_state sea 0 en el próximo arranque -> el kernel lanza fsck • s_errors define el comportamiento del sistema en caso de darse un error: • 1 -> se ignora el error • 2 -> el kernel remontará como sólo lectura • 3 -> se entra en un kernel panic
Tratamiento de errores en EXT2 • Un error común es el apagado del sistema sin desmontar los SF montados • Causa que el s_state sea 0 en el próximo arranque -> el kernel lanza fsck • El chequeo es necesario, ya que se podían estar realizando escrituras en disco en el momento del apagado • Metadatos o datos de usuario • s_mnt_count, s_max_mnt_count, s_lastcheck y s_checkinterval, son campos que pueden comprobar estos programas, para lanzar revisiones automáticas
Operaciones vinculadas al SF • Las operaciones sobre el superbloque para EXT2 se implementan en el archivo fuente fs/ext2/super.c • El VFS realiza la correspondencia entre las funciones llamadas por procesos y la específica para ese SF. P. ej.: ext2_write_inode -> write_inode • El siguiente array de punteros a funciones, indica esta correspondencia staticstruct super_operations ext2_sops = { ext2_read_inode, NULL, ext2_write_inode, ext2_put_inode, ext2_put_super, ext2_write_super, ext2_statfs,ext2_remount};
EXT2_PUT_SUPER • ¿Para qué sirve? • Implementa put_super para el SF EXT2 • Llamada por el VFS • Se utiliza cuando un SF se desmonta • Modo de funcionamiento • Marca los bloques modificados para actualizarlos a disco desde la memoria intermedia (mark_buffer_dirty) • Libera memorias intermedias y punteros, tanto usadas por descriptores como por los mapas de bits (de i-nodos y bloques) • Libera memoria intermedia que contiene al superbloque • La función usada para liberar memoria es brelse y para liberar punteros kfree_s
EXT2_PUT_SUPER void ext2_put_super (struct super_block *sb) { int db_count; int i; /* Se indica que hay que actualizar el SB en disco */ if (!(sb->s_flags & MS_RDONLY)) { sb->u.ext2_sb.s_es->s_state = sb->u.ext2_sb.s_mount_state; mark_buffer_dirty(sb->u.ext2_sb.s_sbh, 1); } /* Libera las memorias que contienen los descriptores del FS */ db_count = sb->u.ext2_sb.s_db_per_group; for (i = 0; i < db_count; i++) if (sb->u.ext2_sb.s_group_desc[i]) brelse (sb->u.ext2_sb.s_group_desc[i]); /* Libera los punteros a esas memorias */ kfree_s (sb->u.ext2_sb.s_group_desc, db_count * sizeof (struct buffer_head *));
EXT2_PUT_SUPER /* Libera las memorias asociadas a los bitmaps de i-nodos */ for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) if (sb->u.ext2_sb.s_inode_bitmap[i]) brelse (sb->u.ext2_sb.s_inode_bitmap[i]); /* Libera las memorias asociadas a los bitmaps de bloques */ for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) if (sb->u.ext2_sb.s_block_bitmap[i]) brelse (sb->u.ext2_sb.s_block_bitmap[i]); /* Libera la memoria que contiene el superbloque */ brelse (sb->u.ext2_sb.s_sbh); return; }
EXT2_PARSE_OPTIONS • ¿Para qué sirve? • Hace un análisis de las opciones de montaje pasadas por parámetro • Modo de funcionamiento • Comprueba si se han pasado opciones • Comprueba cada una de las opciones pasadas por parámetro • Devuelve: • 1 si es correcto • 0 en caso contrario
EXT2_SETUP_SUPER • ¿Para qué sirve? • Inicializa el descriptor del SB a partir del SB del disco • Se llama cuando se (re)monta el SF • Modo de funcionamiento • Comprueba que la versión del SB no es mayor que la máxima • Comprueba que la última vez se desmontó adecuadamente • Si no, se recomienda ejecutar e2fsck • Se incrementa el número de veces que ha sido montado el SF • Se actualiza la fecha de modificación • Se indica la necesidad de actualización a disco
EXT2_SETUP_SUPER static void ext2_setup_super (struct super_block * sb, struct ext2_super_block * es) { /* Si la versión de SB > máxima versión permitida: error */ if (es->s_rev_level > EXT2_MAX_SUPP_REV) { printk ("EXT2-fs warning: revision level too high, forcing read/only mode\n"); sb->s_flags |= MS_RDONLY; } /* Si es escribible */ if (!(sb->s_flags & MS_RDONLY)) { /* Adecuadamente desmontado la última vez? */ if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS)) printk ("EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended\n"); /* Se indica que el sistema ha sido montado */ es->s_state &= ~EXT2_VALID_FS;
EXT2_SETUP_SUPER /* Se incrementa el nº de veces que se ha montado el FS */ if (!es->s_max_mnt_count) es->s_max_mnt_count = EXT2_DFL_MAX_MNT_COUNT; es->s_mnt_count++; /* Se actualiza la fecha de modificación */ es->s_mtime = CURRENT_TIME; /* Se indica que hay que actualizar en disco */ mark_buffer_dirty(sb->u.ext2_sb.s_sbh, 1); sb->s_dirt = 1; /* Opciones de depuración y chequeo */ if (test_opt (sb, DEBUG)) printk ("[EXT II FS %s, %s, bs=%lu, fs=%lu, gc=%lu, bpg=%lu, ipg=%lu, mo=%04lx]\n", EXT2FS_VERSION, EXT2FS_DATE, sb->s_blocksize,sb->u.ext2_sb.s_mount_opt); } }
EXT2_CHECK_DESCRIPTORS • ¿Para qué sirve? • Comprueba los descriptores de grupo leídos del disco • Modo de funcionamiento: • Comprueba, para cada descriptor: • Bloques de bitmap (i-nodo y bloque) • Tabla de i-nodos • Están contenidos en el grupo • Devuelve: • 1 si no hay errores • 0 si hay algún error
EXT2_CHECK_DESCRIPTORS static int ext2_check_descriptors(struct super_block * sb) { int i; int desc_block = 0; unsigned long block = sb->u.ext2_sb.s_es->s_first_data_block; struct ext2_group_desc * gdp = NULL; ext2_debug ("Checking group descriptors"); /* Se recorren todos los descriptores de grupos */ for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) { /* Se selecciona un descriptor de Grupo de Bloques */ if ((i % EXT2_DESC_PER_BLOCK(sb)) == 0) gdp = (struct ext2_group_desc *) sb->u.ext2_sb.s_group_desc[desc_block++]->b_data;
EXT2_CHECK_DESCRIPTORS /* ¿Bitmap de bloque contenido en el grupo? */ if (gdp->bg_block_bitmap < block || gdp->bg_block_bitmap >= block + EXT2_BLOCKS_PER_GROUP(sb)){ ext2_error (sb, "ext2_check_descriptors", "Block bitmap for group %d“" not in group (block %lu)!", i, (unsigned long) gdp->bg_block_bitmap); return 0; } /* ¿Bitmap de i-nodo contenido en el grupo? */ if (gdp->bg_inode_bitmap < block || gdp->bg_inode_bitmap >= block + EXT2_BLOCKS_PER_GROUP(sb)){ ext2_error (sb, "ext2_check_descriptors", "Inode bitmap for group %d" " not in group (block %lu)!",i, (unsigned long) gdp->bg_inode_bitmap); return 0; }
EXT2_CHECK_DESCRIPTORS /* tabla de i-nodos está contenida en el grupo? */ if (gdp->bg_inode_table < block || gdp->bg_inode_table + sb->u.ext2_sb.s_itb_per_group >= block + EXT2_BLOCKS_PER_GROUP(sb)) { ext2_error (sb, "ext2_check_descriptors", "Inode table for group %d" " not in group (block %lu)!", i, (unsigned long) gdp->bg_inode_table); return 0; } block += EXT2_BLOCKS_PER_GROUP(sb); gdp++; } /* Si no hubo errores, se devuelve 1 */ return 1; }
EXT2_READ_SUPER • ¿Para qué sirve? • Lee del disco el SB del SF a montar • Se llama al montar un SF • Devuelve un puntero al contenido del SB o NULL • Modo de funcionamiento • Comprobamos las opciones de montaje (parse_options) • Se lee el SB desde el disco y se guarda en memoria • Se comprueba su validez (s_magic) y otras características • Comprobamos si el modo (lect/esc) esta permitido • Inicializa y comprueba el tamaño del bloque • Incorrecto: se libera y se lee de nuevo el SB • Inicializa algunos campos del SB • Comprobamos que se va a montar un EXT2 (número mágico)