ext4 - ext4

ext4
Desarrollador (es) Mingming Cao, Andreas Dilger, Alex Zhuravlev (Tomas), Dave Kleikamp, Theodore Ts'o , Eric Sandeen, Sam Naghshineh, otros
Nombre completo Cuarto sistema de archivos extendido
Introducido con Linux 2.6.28, 2.6.19
Identificador de partición 0x83 : MBR / EBR .

EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 : GPT Windows BDP .
0FC63DAF-8483-4772-8E79-3D69D8477DE4 : Datos del sistema de archivos GPT Linux.
933AC7E1-2EB4-4F13-B844-0E14E2AEF915 : GPT / partición doméstica.

3B8F8425-20E0-4F3B-907F-1A25A76F98E8 : Partición GPT / srv (datos del servidor).
Estructuras
Contenidos del directorio Lista vinculada , árbol B con hash
Asignación de archivos Extensiones / Mapa de bits
Bloques malos Mesa
Limites
Max. tamaño del volumen 1 EiB (para un tamaño de bloque de 4 KiB)
Max. tamaño del archivo 16 TiB (para un tamaño de bloque de 4 KiB)
Max. Número de archivos 4 mil millones (especificado en el momento de la creación del sistema de archivos)
Max. longitud del nombre de archivo 255 bytes
Caracteres permitidos en nombres de archivo Todos los bytes excepto NUL ('\ 0') y '/' y los nombres de archivo especiales "." y ".." que no están prohibidos pero que siempre se utilizan para un propósito especial respectivo.
Características
Fechas registradas modificación (mtime), modificación de atributo (ctime), acceso (atime), eliminar (dtime), crear (crtime)
Rango de fechas 14 de diciembre de 1901-10 de mayo de 2446
Resolución de fecha Nanosegundo
tenedores No
Atributos acl, bh, bsddf, cometen = nrsec, data = journal, data = ordered, los datos = reescritura, delalloc, extensiones, journal_dev, mballoc, minixdf, noacl, nobh, nodelalloc, noextents, nomballoc, nombcache, nouser_xattr, oldalloc, orlov , user_xattr
Permisos del sistema de archivos POSIX , POSIX ACL
Compresión transparente No
Cifrado transparente
Deduplicación de datos No
Otro
Apoyados sistemas operativos

El sistema de archivos de diario ext4 o cuarto sistema de archivos extendido es un sistema de archivos de diario para Linux , desarrollado como el sucesor de ext3 .

ext4 fue inicialmente una serie de extensiones compatibles con versiones anteriores de ext3, muchas de ellas desarrolladas originalmente por Cluster File Systems para el sistema de archivos Luster entre 2003 y 2006, destinadas a ampliar los límites de almacenamiento y agregar otras mejoras de rendimiento. Sin embargo, otros desarrolladores del kernel de Linux se opusieron a aceptar extensiones para ext3 por razones de estabilidad, y propusieron bifurcar el código fuente de ext3, renombrarlo como ext4 y realizar todo el desarrollo allí, sin afectar a los usuarios existentes de ext3. Esta propuesta fue aceptada y el 28 de junio de 2006, Theodore Ts'o , el mantenedor de ext3, anunció el nuevo plan de desarrollo para ext4.

Se incluyó una versión de desarrollo preliminar de ext4 en la versión 2.6.19 del kernel de Linux. El 11 de octubre de 2008, los parches que marcan ext4 como código estable se fusionaron en los repositorios de código fuente de Linux 2.6.28, indicando el final de la fase de desarrollo y recomendando la adopción de ext4. El kernel 2.6.28, que contiene el sistema de archivos ext4, fue finalmente lanzado el 25 de diciembre de 2008. El 15 de enero de 2010, Google anunció que actualizaría su infraestructura de almacenamiento de ext2 a ext4. El 14 de diciembre de 2010, Google también anunció que usaría ext4, en lugar de YAFFS , en Android 2.3 .

Adopción

ext4 es el sistema de archivos predeterminado para muchas distribuciones de Linux, incluidas Debian y Ubuntu .

Características

Gran sistema de archivos
El sistema de archivos ext4 puede admitir volúmenes con tamaños de hasta 1 exbibyte (EiB) y archivos individuales con tamaños de hasta 16 tebibytes (TiB) con el tamaño de bloque estándar de 4 KiB . Los límites máximos de tamaño de archivo, directorio y sistema de archivos crecen al menos proporcionalmente con el tamaño de bloque del sistema de archivos hasta el tamaño de bloque máximo de 64 KiB disponible en las CPU ARM y PowerPC / Power ISA .
Extensiones
Las extensiones reemplazan el esquema de mapeo de bloques tradicional usado por ext2 y ext3. Una extensión es un rango de bloques físicos contiguos que mejoran el rendimiento de archivos grandes y reducen la fragmentación. Una sola extensión en ext4 puede mapear hasta 128  MiB de espacio contiguo con un tamaño de bloque de 4 KiB. Puede haber cuatro extensiones almacenadas directamente en el inodo . Cuando hay más de cuatro extensiones en un archivo, el resto de las extensiones se indexan en un árbol .
Compatibilidad con versiones anteriores
ext4 es retrocompatible con ext3 y ext2 , lo que hace posible montar ext3 y ext2 como ext4. Esto mejorará ligeramente el rendimiento, porque ciertas características nuevas de la implementación ext4 también se pueden usar con ext3 y ext2, como el nuevo algoritmo de asignación de bloques, sin afectar el formato en disco.
ext3 es parcialmente compatible con ext4. Prácticamente, ext4 no se montará como un sistema de archivos ext3 fuera de la caja, a menos que ciertas nuevas características están desactivadas cuando se crea, como por ejemplo ^extent , ^flex_bg , ^huge_file , ^uninit_bg , ^dir_nlink , y ^extra_isize .
Preasignación persistente
ext4 puede preasignar espacio en disco para un archivo. Para hacer esto en la mayoría de los sistemas de archivos, se escribirían ceros en el archivo cuando se creara. En ext4 (y algunos otros sistemas de archivos como XFS ) fallocate() , se puede usar una nueva llamada al sistema en el kernel de Linux. El espacio asignado estaría garantizado y probablemente contiguo. Esta situación tiene aplicaciones para transmisión de medios y bases de datos.
Asignación retrasada
ext4 utiliza una técnica de rendimiento llamada asignación al ras , también conocida como asignación retrasada . Es decir, ext4 retrasa la asignación de bloques hasta que los datos se vacían en el disco; por el contrario, algunos sistemas de archivos asignan bloques inmediatamente, incluso cuando los datos van a una caché de escritura. La asignación retrasada mejora el rendimiento y reduce la fragmentación al asignar de forma eficaz mayores cantidades de datos a la vez.
Número ilimitado de subdirectorios
ext4 no limita el número de subdirectorios en un solo directorio, excepto por el límite de tamaño inherente del directorio en sí. (En ext3, un directorio puede tener como máximo 32.000 subdirectorios). Para permitir directorios más grandes y un rendimiento continuo, ext4 en Linux 2.6.23 y versiones posteriores activa los índices HTree (una versión especializada de un árbol B ) de forma predeterminada, lo que permite que los directorios hasta aproximadamente 10–12 millones de entradas para almacenar en el índice HTree de 2 niveles y el límite de tamaño del directorio de 2 GB para un tamaño de bloque de 4 KiB, según la longitud del nombre de archivo. En Linux 4.12 y posteriores, la largedir función habilitaba un HTree de 3 niveles y tamaños de directorio superiores a 2 GB, lo que permitía aproximadamente 6 mil millones de entradas en un solo directorio.
Sumas de comprobación de diario
ext4 usa sumas de comprobación en el diario para mejorar la confiabilidad, ya que el diario es uno de los archivos más utilizados del disco. Esta función tiene un beneficio adicional: puede evitar de forma segura una espera de E / S de disco durante el registro en diario, lo que mejora ligeramente el rendimiento. La suma de verificación de la revista se inspiró en un artículo de investigación de la Universidad de Wisconsin , titulado IRON File Systems (específicamente, la sección 6, llamada "sumas de verificación de transacciones"), con modificaciones dentro de la implementación de transacciones compuestas realizadas por el sistema de archivos IRON (originalmente propuesto por Sam Naghshineh en la cumbre RedHat).
Suma de comprobación de metadatos
Desde el lanzamiento del kernel 3.5 de Linux en 2012
Comprobación más rápida del sistema de archivos
En ext4, los grupos de bloques no asignados y las secciones de la tabla de inodo se marcan como tales. Esto permite a e2fsck omitirlos por completo y reduce en gran medida el tiempo que lleva verificar el sistema de archivos. Linux 2.6.24 implementa esta característica.
Dependencia del tiempo de fsck en el recuento de inodos ( ext3 vs.
Asignador multibloque
Cuando ext3 se agrega a un archivo, llama al asignador de bloques, una vez por cada bloque. En consecuencia, si hay varios escritores simultáneos, los archivos pueden fragmentarse fácilmente en el disco. Sin embargo, ext4 usa la asignación retrasada, lo que le permite almacenar datos en búfer y asignar grupos de bloques. En consecuencia, el asignador de multibloques puede tomar mejores decisiones sobre la asignación de archivos de forma contigua en el disco. El asignador de multibloques también se puede utilizar cuando los archivos se abren en modo O_DIRECT. Esta característica no afecta el formato del disco.
Marcas de tiempo mejoradas
A medida que las computadoras se vuelven más rápidas en general y que Linux se usa más para aplicaciones de misión crítica , la granularidad de las marcas de tiempo basadas en segundos se vuelve insuficiente. Para resolver esto, ext4 proporciona marcas de tiempo medidas en nanosegundos . Además, se agregan 2 bits del campo de marca de tiempo expandido a los bits más significativos del campo de segundos de las marcas de tiempo para aplazar el problema del año 2038 por 408 años adicionales.
ext4 también agrega soporte para marcas de tiempo de creación. Pero, como señala Theodore Ts'o , si bien es fácil agregar un campo de fecha de creación adicional en el inodo (lo que permite técnicamente el soporte para estas marcas de tiempo en ext4), es más difícil modificar o agregar las llamadas al sistema necesarias , como stat () (que probablemente requeriría una nueva versión) y las diversas bibliotecas que dependen de ellos (como glibc ). Estos cambios requerirán la coordinación de muchos proyectos. Por lo tanto, la fecha de creación almacenada por ext4 actualmente solo está disponible para los programas de usuario en Linux a través de la statx() API.
Cuotas de proyectos
El 8 de enero de 2016 se agregó soporte para cuotas de proyectos en el kernel 4.4 de Linux. Esta función permite asignar límites de cuotas de disco a un ID de proyecto en particular. El ID de proyecto de un archivo es un número de 32 bits almacenado en cada archivo y es heredado por todos los archivos y subdirectorios creados debajo de un directorio principal con un ID de proyecto asignado. Esto permite asignar límites de cuota a un árbol de subdirectorio en particular independientemente de los permisos de acceso al archivo en el archivo, como cuotas de usuario y proyecto que dependen del UID y GID. Si bien esto es similar a una cuota de directorio, la principal diferencia es que el mismo ID de proyecto se puede asignar a varios directorios de nivel superior y no es estrictamente jerárquico.
Cifrado transparente
La compatibilidad con el cifrado transparente se agregó en el kernel 4.1 de Linux en junio de 2015.
Inicialización perezosa
La función lazyinit permite limpiar tablas de inodo en segundo plano, acelerando la inicialización al crear un nuevo sistema de archivos ext4. Está disponible desde 2010 en la versión 2.6.37 del kernel de Linux.
Escribir barreras
ext4 habilita las barreras de escritura por defecto. Garantiza que los metadatos del sistema de archivos se escriban y ordenen correctamente en el disco, incluso cuando las memorias caché de escritura pierden energía. Esto conlleva un costo de rendimiento, especialmente para aplicaciones que usan fsync en gran medida o crean y eliminan muchos archivos pequeños. Para discos con caché de escritura respaldada por batería, la desactivación de barreras (opción 'barrera = 0') puede mejorar el rendimiento de forma segura.

Limitaciones

En 2008, el principal desarrollador de los sistemas de archivos ext3 y ext4, Theodore Ts'o , declaró que aunque ext4 tiene características mejoradas, no es un avance importante, utiliza tecnología antigua y es un recurso provisional. Ts'o cree que Btrfs es la mejor dirección porque "ofrece mejoras en escalabilidad, confiabilidad y facilidad de administración". Btrfs también tiene "varias de las mismas ideas de diseño que tenía reiser3 / 4 ". Sin embargo, ext4 ha seguido adquiriendo nuevas funciones, como el cifrado de archivos y las sumas de comprobación de metadatos.

El sistema de archivos ext4 no respeta el atributo de archivo de "eliminación segura" , que se supone que causa la sobrescritura de los archivos al eliminarlos. En 2011 se propuso un parche para implementar la eliminación segura, pero no resolvió el problema de que los datos confidenciales terminen en el diario del sistema de archivos.

Asignación retrasada y posible pérdida de datos

Debido a que la asignación demorada cambia el comportamiento en el que los programadores han estado confiando con ext3, la función presenta un riesgo adicional de pérdida de datos en los casos en que el sistema falla o pierde energía antes de que todos los datos se hayan escrito en el disco. Debido a esto, ext4 en las versiones 2.6.30 y posteriores del kernel maneja automáticamente estos casos como lo hace ext3.

El escenario típico en el que esto puede ocurrir es un programa que reemplaza el contenido de un archivo sin forzar una escritura en el disco con fsync . Hay dos formas comunes de reemplazar el contenido de un archivo en sistemas Unix:

  • fd=open("file", O_TRUNC); write(fd, data); close(fd);
En este caso, un archivo existente se trunca en el momento de la apertura (debido a la O_TRUNC marca), luego se escriben los nuevos datos. Dado que la escritura puede llevar algún tiempo, existe la posibilidad de perder contenido incluso con ext3, pero normalmente es muy pequeño. Sin embargo, debido a que ext4 puede retrasar la escritura de datos de archivos durante mucho tiempo, esta oportunidad es mucho mayor.
Pueden surgir varios problemas:
  1. Si la escritura no tiene éxito (lo que puede deberse a condiciones de error en el programa de escritura, o debido a condiciones externas como un disco lleno), tanto la versión original como la nueva versión del archivo se perderán y el archivo puede estar dañado porque solo se ha escrito una parte.
  2. Si otros procesos acceden al archivo mientras se está escribiendo, ven una versión dañada.
  3. Si otros procesos tienen el archivo abierto y no esperan que su contenido cambie, esos procesos pueden fallar. Un ejemplo notable es un archivo de biblioteca compartida que se asigna a programas en ejecución.
Debido a estos problemas, a menudo se prefiere el siguiente idioma al anterior:
  • fd=open("file.new"); write(fd, data); close(fd); rename("file.new", "file");
Se crea un nuevo archivo temporal ("archivo.nuevo"), que inicialmente contiene los nuevos contenidos. Luego, el nuevo archivo se renombra sobre el anterior. rename() Se garantiza que la sustitución de archivos por la llamada es atómica según los estándares POSIX , es decir, o el archivo antiguo permanece o se sobrescribe con el nuevo. Debido a que el modo de registro por diario "ordenado" predeterminado de ext3 garantiza que los datos del archivo se escriban en el disco antes que los metadatos, esta técnica garantiza que el contenido del archivo nuevo o antiguo persistirá en el disco. La asignación retrasada de ext4 rompe esta expectativa, porque la escritura del archivo puede retrasarse durante mucho tiempo, y el cambio de nombre generalmente se lleva a cabo antes de que el contenido del archivo nuevo llegue al disco.

Usar fsync() más a menudo para reducir el riesgo de ext4 podría dar lugar a penalizaciones de rendimiento en los sistemas de archivos ext3 montados con el data=ordered indicador (el valor predeterminado en la mayoría de las distribuciones de Linux). Dado que ambos sistemas de archivos estarán en uso durante algún tiempo, esto complica las cosas para los desarrolladores de aplicaciones de usuario final. En respuesta, ext4 en los kernels de Linux 2.6.30 y posteriores detectan la ocurrencia de estos casos comunes y fuerzan la asignación de los archivos de inmediato. Por un pequeño costo de rendimiento, esto proporciona una semántica similar al modo ordenado ext3 y aumenta la posibilidad de que cualquiera de las versiones del archivo sobreviva al bloqueo. Este nuevo comportamiento está habilitado de forma predeterminada, pero se puede deshabilitar con la opción de montaje "noauto_da_alloc".

Los nuevos parches se han convertido en parte del núcleo principal 2.6.30, pero varias distribuciones optaron por exportarlos a 2.6.28 o 2.6.29.

Estos parches no previenen por completo la posible pérdida de datos ni ayudan en absoluto con los archivos nuevos. La única forma de estar seguro es escribir y usar software que lo haga fsync() cuando sea necesario. Los problemas de rendimiento se pueden minimizar limitando las escrituras de disco cruciales que deben fsync() ocurrir con menos frecuencia.

Implementación

Estructura simplificada del kernel de Linux: ext4 se implementa entre el sistema de archivos virtual del kernel de Linux y la capa de bloques genéricos.

El sistema de archivos virtual del kernel de Linux es un subsistema o capa dentro del kernel de Linux. Es el resultado de un intento muy serio de integrar múltiples sistemas de archivos en una estructura única ordenada. La idea clave, que se remonta al trabajo pionero realizado por los empleados de Sun Microsystems en 1986, es abstraer esa parte del sistema de archivos que es común a todos los sistemas de archivos y poner ese código en una capa separada que llama al archivo concreto subyacente. sistemas para gestionar realmente los datos.

Todas las llamadas al sistema relacionadas con archivos (o pseudoarchivos) se dirigen al sistema de archivos virtual del kernel de Linux para su procesamiento inicial. Estas llamadas, procedentes de procesos de usuario, son las llamadas POSIX estándar, tales como open , read , write , lseek , etc.

Compatibilidad con Windows y Macintosh

Actualmente, ext4 tiene soporte completo en sistemas operativos que no son Linux.

Windows puede acceder a ext4 desde Windows 10 Insider Preview Build 20211. Es posible gracias al Subsistema de Windows para Linux (WSL) que se introdujo con la Actualización de aniversario de Windows 10 (versión 1607) el 2 de agosto de 2016. WSL solo está disponible en versiones de 64 bits de Windows 10 a partir de la versión 1607. También está disponible en Windows Server 2019. Se produjeron grandes cambios en la arquitectura WSL con el lanzamiento de WSL 2 el 12 de junio de 2019. WSL 2 requiere Windows 10 versión 1903 o superior, con compilación 18362 o superior, para sistemas x64 y versión 2004 o superior, con compilación 19041 o superior, para sistemas ARM64.

Paragon ofrece su producto comercial Linux File Systems para Windows que permite capacidades de lectura / escritura para ext2 / 3/4 en Windows 7 SP1 / 8 / 8.1 / 10 y Windows Server 2008 R2 SP1 / 2012/2016.

macOS tiene capacidad completa de lectura y escritura ext2 / 3/4 a través de extFS para Mac de Paragon Software, que es un producto comercial. El software gratuito como ext4fuse tiene soporte de solo lectura con funcionalidad limitada.

Ver también

Referencias

enlaces externos