Ext2
El ext2 o segundo sistema de archivos extendido es un sistema de archivos para el kernel de Linux. Inicialmente fue diseñado por el desarrollador de software francés Rémy Card como reemplazo del sistema de archivos extendido (ext). Habiendo sido diseñado de acuerdo con los mismos principios que el sistema de archivos rápido de Berkeley de BSD, fue el primer sistema de archivos de grado comercial para Linux.
La implementación canónica de ext2 es "ext2fs" controlador del sistema de archivos en el kernel de Linux. Existen otras implementaciones (de diversa calidad e integridad) en GNU Hurd, MINIX 3, algunos núcleos BSD, en MiNT, Haiku y como controladores de Microsoft Windows y macOS de terceros.
ext2 era el sistema de archivos predeterminado en varias distribuciones de Linux, incluidas Debian y Red Hat Linux, hasta que fue reemplazado por ext3, que es casi completamente compatible con ext2 y es un sistema de archivos de diario. ext2 sigue siendo el sistema de archivos elegido para medios de almacenamiento basados en flash (como tarjetas SD y unidades flash USB) porque la falta de un diario aumenta el rendimiento y minimiza la cantidad de escrituras, y los dispositivos flash pueden soportar una cantidad limitada de ciclos de escritura. Desde 2009, el kernel de Linux admite un modo sin diario de ext4 que brinda beneficios que no se encuentran con ext2, como archivos y volúmenes más grandes.
Historia
El desarrollo inicial del kernel de Linux se realizó como un desarrollo cruzado bajo el sistema operativo MINIX. El sistema de archivos MINIX se utilizó como el primer sistema de archivos de Linux. El sistema de archivos Minix estaba en su mayoría libre de errores, pero usaba compensaciones de 16 bits internamente y, por lo tanto, tenía un límite de tamaño máximo de solo 64 megabytes, y también había un límite de longitud de nombre de archivo de 14 caracteres. Debido a estas limitaciones, se comenzó a trabajar en un sistema de archivos nativo de reemplazo para Linux.
Para facilitar la adición de nuevos sistemas de archivos y proporcionar una API de archivo genérica, se agregó VFS, una capa de sistema de archivos virtual, al kernel de Linux. El sistema de archivos extendido (ext) se lanzó en abril de 1992 como el primer sistema de archivos que utiliza la API de VFS y se incluyó en la versión 0.96c de Linux. El sistema de archivos ext resolvió los dos problemas principales en el sistema de archivos Minix (tamaño máximo de partición y limitación de longitud de nombre de archivo a 14 caracteres) y permitió 2 gigabytes de datos y nombres de archivo de hasta 255 caracteres. Pero aún tenía problemas: no había soporte para marcas de tiempo separadas para acceso a archivos, modificación de inodos y modificación de datos.
Como solución a estos problemas, en enero de 1993 se desarrollaron dos nuevos sistemas de archivos para el kernel 0.99 de Linux: xiafs y el segundo sistema de archivos extendido (ext2), que fue una revisión del sistema de archivos ampliado que incorpora muchas ideas del sistema de archivos rápido de Berkeley. ext2 también se diseñó teniendo en cuenta la extensibilidad, dejando espacio en muchas de sus estructuras de datos en disco para uso en futuras versiones.
Desde entonces, ext2 ha sido un banco de pruebas para muchas de las nuevas extensiones de la API de VFS. Características tales como la propuesta de borrador de ACL POSIX retirada y la propuesta de atributo extendido retirada generalmente se implementaron primero en ext2 porque era relativamente simple de extender y sus componentes internos se entendían bien.
En los kernels de Linux anteriores a 2.6.17, las restricciones en el controlador de bloque significan que los sistemas de archivos ext2 tienen un tamaño de archivo máximo de 2 TiB.
Se sigue recomendando ext2 sobre los sistemas de archivos de diario en unidades flash USB de arranque y otras unidades de estado sólido. ext2 realiza menos escrituras que ext3 porque no hay registro en diario. Dado que el principal factor de envejecimiento de un chip flash es la cantidad de ciclos de borrado, y dado que los ciclos de borrado ocurren con frecuencia en las escrituras, la disminución de las escrituras aumenta la vida útil del dispositivo de estado sólido. Otra buena práctica para sistemas de archivos en dispositivos flash es el uso de la opción de montaje noatime, por la misma razón.
Estructuras de datos Ext2
El espacio en ext2 se divide en bloques. Estos bloques se agrupan en grupos de bloques, de forma análoga a los grupos de cilindros en el sistema de archivos de Unix. Por lo general, hay miles de bloques en un sistema de archivos grande. Los datos de cualquier archivo dado suelen estar contenidos en un solo grupo de bloques cuando es posible. Esto se hace para minimizar el número de búsquedas de disco al leer grandes cantidades de datos contiguos.
Cada grupo de bloques contiene una copia de la tabla de descriptores de grupos de bloques y superbloques, y todos los grupos de bloques contienen un mapa de bits de bloque, un mapa de bits de inodo, una tabla de inodo y, finalmente, los bloques de datos reales.
El superbloque contiene información importante que es crucial para el arranque del sistema operativo. Por lo tanto, las copias de seguridad se realizan en múltiples grupos de bloques en el sistema de archivos. Sin embargo, normalmente solo se utiliza en el arranque la primera copia, que se encuentra en el primer bloque del sistema de archivos.
El descriptor de grupo almacena la ubicación del mapa de bits del bloque, el mapa de bits del inodo y el inicio de la tabla de inodos para cada grupo de bloques. Estos, a su vez, se almacenan en una tabla de descriptores de grupo.
Inodos
Cada archivo o directorio está representado por un inodo. El término "inodo" proviene del "nodo de índice" (con el tiempo, se convirtió en i-node y luego en inode). El inodo incluye datos sobre el tamaño, el permiso, la propiedad y la ubicación en el disco del archivo o directorio.
Ejemplo de estructura de inodo ext2:
Cita de la documentación del kernel de Linux para ext2:
"Hay punteros a los primeros 12 bloques que contienen los datos del archivo en el interior. Hay un puntero a un bloque indirecto (que contiene punteros al siguiente conjunto de bloques), un puntero a un bloque doblemente indirecto y un puntero a un bloque indirecto trebly."
Por lo tanto, hay una estructura en ext2 que tiene 15 punteros. Los punteros 1 a 12 apuntan a bloques directos, el puntero 13 apunta a un bloque indirecto, el puntero 14 apunta a un bloque doblemente indirecto y el puntero 15 apunta a un bloque triplemente indirecto.
Directorios
Cada directorio es una lista de entradas de directorio. Cada entrada de directorio asocia un nombre de archivo con un número de inodo y consta del número de inodo, la longitud del nombre de archivo y el texto real del nombre de archivo. Para encontrar un archivo, se busca en el directorio de adelante hacia atrás para encontrar el nombre de archivo asociado. Para tamaños de directorio razonables, esto está bien. Pero para directorios muy grandes esto es ineficiente, y ext3 ofrece una segunda forma de almacenar directorios (HTree) que es más eficiente que solo una lista de nombres de archivo.
El directorio raíz siempre se almacena en el inodo número dos, para que el código del sistema de archivos pueda encontrarlo en el momento del montaje. Los subdirectorios se implementan almacenando el nombre del subdirectorio en el campo de nombre y el número de inodo del subdirectorio en el campo de inodo. Los enlaces duros se implementan almacenando el mismo número de inodo con más de un nombre de archivo. Acceder al archivo por cualquier nombre da como resultado el mismo número de inodo y, por lo tanto, los mismos datos.
Los directorios especiales "." (directorio actual) y ".." (directorio principal) se implementan almacenando los nombres "." y ".." en el directorio, y el número de inodo de los directorios actual y principal en el campo de inodo. El único tratamiento especial que reciben estas dos entradas es que se crean automáticamente cuando se crea cualquier directorio nuevo y no se pueden eliminar.
Asignación de datos
Cuando se crea un nuevo archivo o directorio, ext2 debe decidir dónde almacenar los datos. Si el disco está casi vacío, los datos se pueden almacenar en casi cualquier lugar. Sin embargo, agrupar los datos con datos relacionados minimizará los tiempos de búsqueda y maximizará el rendimiento.
ext2 intenta asignar cada nuevo directorio en el grupo que contiene su directorio principal, con la teoría de que los accesos a los directorios principal y secundario probablemente estén estrechamente relacionados. ext2 también intenta colocar archivos en el mismo grupo que sus entradas de directorio, porque los accesos a directorios a menudo conducen a accesos a archivos. Sin embargo, si el grupo está lleno, el nuevo archivo o el nuevo directorio se colocan en algún otro grupo que no esté lleno.
Los bloques de datos necesarios para almacenar directorios y archivos se pueden encontrar en el mapa de bits de asignación de datos. Cualquier espacio necesario en la tabla de inodos se puede encontrar mirando el mapa de bits de asignación de inodos.
Límites del sistema de archivos
Tamaño del bloque: | 1 KiB | 2 KiB | 4 KiB | 8 KiB |
---|---|---|---|---|
Max. tamaño del archivo: | 16 GiB | 256 GiB | 2 TiB | 2 TiB |
Max. tamaño del sistema de archivos: | 4 TiB | 8 TiB | 16 TiB | 32 TiB |
La razón de algunos límites de ext2 es el formato de archivo de los datos y el núcleo del sistema operativo. En su mayoría, estos factores se determinarán una vez que se construya el sistema de archivos. Dependen del tamaño del bloque y de la proporción del número de bloques e inodos. En Linux, el tamaño del bloque está limitado por el tamaño de la página de la arquitectura.
También hay algunos programas de espacio de usuario que no pueden manejar archivos de más de 2 GiB.
Si b es el tamaño del bloque, el tamaño máximo del archivo está limitado a min(((b/4)3 + (b/4)2 + b/4 + 12) × b, (232 − 1) × 512) debido a la estructura i_block (una matriz de EXT2_N_BLOCKS directos/indirectos) e i_blocks (valor entero de 32 bits) que representa el número de "bloques" de 512 bytes; en el archivo.
El número máximo de directorios de subnivel es 31998, debido al límite de número de enlaces. La indexación de directorios no está disponible en ext2, por lo que existen problemas de rendimiento para directorios con una gran cantidad de archivos (>10,000). El límite teórico en el número de archivos en un directorio es 1,3 × 1020, aunque esto no es relevante para situaciones prácticas.
Nota: En Linux 2.4 y versiones anteriores, los dispositivos de bloque estaban limitados a 2 TiB, lo que limitaba el tamaño máximo de una partición, independientemente del tamaño del bloque.
Extensión de compresión
e2compr es una modificación del controlador ext2 en el kernel de Linux para admitir la compresión y descompresión de archivos por parte del sistema de archivos, sin ningún tipo de soporte por parte de las aplicaciones del usuario. e2compr es un pequeño parche contra ext2.
e2compr comprime solo archivos regulares; los datos administrativos (superbloque, inodos, archivos de directorio, etc.) no están comprimidos (principalmente por razones de seguridad). Se proporciona acceso a bloques comprimidos para operaciones de lectura y escritura. El algoritmo de compresión y el tamaño del clúster se especifican por archivo. Los directorios también se pueden marcar para la compresión, en cuyo caso cada archivo recién creado en el directorio se comprimirá automáticamente con el mismo tamaño de clúster y el mismo algoritmo que se especificó para el directorio.
e2compr no es un nuevo sistema de archivos. Es solo un parche para ext2 hecho para admitir el indicador EXT2_COMPR_FL. No requiere que el usuario cree una nueva partición y continuará leyendo o escribiendo sistemas de archivos ext2 existentes. Uno puede considerarlo simplemente como una forma de que las rutinas de lectura y escritura accedan a archivos que podrían haber sido creados por una utilidad simple similar a gzip o compress. Los archivos comprimidos y sin comprimir coexisten muy bien en las particiones ext2.
La rama e2compr más reciente está disponible para las versiones actuales de Linux 2.4, 2.6 y 3.0. El parche más reciente para Linux 3.0 se lanzó en agosto de 2011 y proporciona compatibilidad con memoria alta y multinúcleo. También hay ramas para Linux 2.0 y 2.2.
Bajo otros sistemas operativos
El acceso a las particiones ext2 en Microsoft Windows es posible a través de un sistema de archivos instalable, como ext2ifs o ext2Fsd. El sistema de archivos en Userspace se puede usar en macOS.
Contenido relacionado
Instituto de Tecnología de California
Desnormalización
Principio de Kerckhoff