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 Lustre entre 2003 y 2006, destinadas a ampliar los límites de almacenamiento y agregar otras mejoras de rendimiento. [4] Sin embargo, otros desarrolladores del kernel de Linux se opusieron a aceptar extensiones para ext3 por razones de estabilidad, [5] 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. [6]
Una versión preliminar de desarrollo de ext4 se incluyó en la versión 2.6.19 [7] del núcleo Linux. El 11 de octubre de 2008, los parches que marcan a ext4 como código estable se fusionaron en los repositorios de código fuente de Linux 2.6.28, [8] marcando el final de la fase de desarrollo y recomendando la adopción de ext4. El núcleo 2.6.28, que contiene el sistema de archivos ext4, fue finalmente lanzado el 25 de diciembre de 2008. [9] El 15 de enero de 2010, Google anunció que actualizaría su infraestructura de almacenamiento de ext2 a ext4. [10] El 14 de diciembre de 2010, Google también anunció que usaría ext4, en lugar de YAFFS , en Android 2.3 . [11]
Adopción
ext4 es el sistema de archivos predeterminado para muchas distribuciones de Linux, incluidas Debian y Ubuntu . [12]
Las extensiones reemplazan el esquema de mapeo de bloques tradicional utilizado por ext2 y ext3. Una extensión es un rango de bloques físicos contiguos, lo que mejora el rendimiento de archivos grandes y reduce 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. [4] 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 . [14]
Compatibilidad con versiones anteriores
ext4 es compatible con versiones anteriores de ext3 y ext2 , lo que permite montar ext3 y ext2 como ext4. Esto mejorará ligeramente el rendimiento, ya que ciertas características nuevas de la implementación de 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. [15]
ext3 es parcialmente compatible con ext4. En la práctica, ext4 no se montará como un sistema de archivos ext3 de fábrica, a menos que se deshabiliten ciertas características nuevas al crearlo, como ^extent, ^flex_bg, ^huge_file, ^uninit_bg, ^dir_nlinky ^extra_isize. [16]
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 crea. En ext4 (y algunos otros sistemas de archivos como XFS ) fallocate(), se puede utilizar una nueva llamada al sistema en el núcleo de Linux. El espacio asignado estaría garantizado y probablemente sería contiguo. Esta situación tiene aplicaciones para la transmisión de medios y bases de datos. [ cita requerida ]
Asignación retrasada
ext4 utiliza una técnica de rendimiento denominada allocate-on-flush , 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 manera eficaz mayores cantidades de datos a la vez. [ cita requerida ]
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.) [17] [ fuente obsoleta ] Para permitir directorios más grandes y un rendimiento continuo, ext4 en Linux 2.6.23 y posteriores activa los índices HTree (una versión especializada de un árbol B ) de forma predeterminada, lo que permite almacenar directorios de hasta aproximadamente 10-12 millones de entradas en el índice HTree de 2 niveles y un límite de tamaño de directorio de 2 GB para un tamaño de bloque de 4 KiB, dependiendo de la longitud del nombre de archivo. En Linux 4.12 y posteriores, la característica habilitó un HTree de 3 niveles y tamaños de directorio superiores a 2 GB, lo que permite aproximadamente 6 mil millones de entradas en un solo directorio.large_dir
Sumas de comprobación de diario
ext4 utiliza sumas de comprobación [18] en el diario para mejorar la confiabilidad, ya que el diario es uno de los archivos más utilizados del disco. Esta característica tiene un beneficio adicional: puede evitar de forma segura una espera de E/S del disco durante el registro, lo que mejora ligeramente el rendimiento. La suma de comprobación del diario se inspiró en un artículo de investigación de la Universidad de Wisconsin , titulado IRON File Systems , [19] 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 Linux 3.5 en 2012. [20] [21]
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 inodos se marcan como tales. Esto permite que e2fsck los omita por completo y reduce en gran medida el tiempo que lleva verificar el sistema de archivos. Linux 2.6.24 implementa esta función. [ cita requerida ]
Asignador de multibloques
Cuando ext3 agrega datos 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 utiliza la asignación retrasada, lo que le permite almacenar datos en búfer y asignar grupos de bloques. En consecuencia, el asignador multibloque puede tomar mejores decisiones sobre la asignación de archivos de forma contigua en el disco. El asignador multibloque también se puede utilizar cuando los archivos se abren en modo O_DIRECT. Esta función 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 diferir el problema del año 2038 por 408 años adicionales. [3]
ext4 también añade 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 técnicamente habilita el soporte para estas marcas de tiempo en ext4), es más difícil modificar o agregar las llamadas de sistema necesarias , como stat() (que probablemente requeriría una nueva versión) y las diversas bibliotecas que dependen de ellas (como glibc ). Estos cambios requerirán la coordinación de muchos proyectos. [22] 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. [23]
Cuotas de proyectos
El 8 de enero de 2016 se agregó compatibilidad con cuotas de proyecto en el kernel de Linux 4.4. Esta característica permite asignar límites de cuota 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 subdirectorios en particular independientemente de los permisos de acceso a archivos 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 múltiples directorios de nivel superior y no es estrictamente jerárquico. [24]
Cifrado transparente
En junio de 2015 se añadió soporte para cifrado transparente en el kernel de Linux 4.1. [25]
Inicialización perezosa
La función lazyinit permite limpiar las tablas de inodos en segundo plano, acelerando la inicialización al crear un nuevo sistema de archivos ext4. [26] Está disponible desde 2010 en la versión 2.6.37 del kernel de Linux. [27]
Barreras de escritura
ext4 habilita las barreras de escritura de forma predeterminada. Esto garantiza que los metadatos del sistema de archivos se escriban y ordenen correctamente en el disco, incluso cuando las cachés de escritura pierden energía. Esto implica un costo de rendimiento, especialmente para aplicaciones que usan fsync de manera intensiva o crean y eliminan muchos archivos pequeños. Para discos con una caché de escritura respaldada por batería, deshabilitar las barreras (opción 'barrier=0') puede mejorar el rendimiento de manera segura. [28]
Limitaciones
En 2008, el principal desarrollador de los sistemas de archivos ext3 y ext4, Theodore Ts'o , afirmó que aunque ext4 ha mejorado sus características, no es un gran avance, utiliza tecnología antigua y es una solución provisional. Ts'o cree que Btrfs es la mejor dirección porque "ofrece mejoras en escalabilidad, confiabilidad y facilidad de administración". [29] Btrfs también tiene "varias de las mismas ideas de diseño que reiser3 / 4 ". [30] Sin embargo, ext4 ha seguido ganando nuevas características como el cifrado de archivos y las sumas de comprobación de metadatos.
El sistema de archivos ext4 no respeta el atributo de archivo "eliminación segura" , que se supone que provoca la sobrescritura de archivos al eliminarlos. En 2011 se propuso un parche para implementar la eliminación segura, pero no resolvió el problema de los datos confidenciales que terminaban en el diario del sistema de archivos. [31]
Asignación retrasada y posible pérdida de datos
Debido a que la asignación retrasada cambia el comportamiento en el que los programadores han confiado con ext3, la característica plantea un riesgo adicional de pérdida de datos en casos en los que el sistema falla o se queda sin energía antes de que todos los datos se hayan escrito en el disco. Debido a esto, ext4 en las versiones de kernel 2.6.30 y posteriores maneja automáticamente estos casos como lo hace ext3.
El escenario típico en el que esto podría 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: [32]
En este caso, un archivo existente se trunca al abrirlo (debido a O_TRUNCuna bandera) y luego se escriben los datos nuevos. Como la escritura puede tardar un tiempo, existe la posibilidad de perder contenido incluso con ext3, pero normalmente es muy pequeña. Sin embargo, como ext4 puede demorar mucho tiempo la escritura de los datos del archivo, esta posibilidad es mucho mayor.
Existen varios problemas que pueden surgir:
Si la escritura no se realiza correctamente (lo que puede deberse a condiciones de error en el programa de escritura o a condiciones externas como un disco lleno), se perderán tanto la versión original como la nueva versión del archivo, y el archivo puede dañarse porque solo se ha escrito una parte de él.
Si otros procesos acceden al archivo mientras se escribe, ven una versión dañada.
Si otros procesos tienen el archivo abierto y no esperan que su contenido cambie, esos procesos pueden bloquearse. 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 modismo al anterior:
Se crea un nuevo archivo temporal ("file.new"), que inicialmente contiene el nuevo contenido. Luego, el nuevo archivo se renombra sobre el antiguo. rename()Se garantiza que la sustitución de archivos por la llamada sea atómica según los estándares POSIX , es decir, que el archivo antiguo permanece o se sobrescribe con el nuevo. Debido a que el modo de registro "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 antiguo o el nuevo persistirán 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 nuevo contenido del archivo llegue al disco.
El uso fsync()más frecuente para reducir el riesgo de ext4 podría generar penalizaciones de rendimiento en los sistemas de archivos ext3 montados con la data=orderedbandera (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 Linux 2.6.30 y posteriores detecta la ocurrencia de estos casos comunes y obliga a que los archivos se asignen inmediatamente. Por un pequeño costo en rendimiento, esto proporciona una semántica similar al modo ordenado de 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". [32]
Los nuevos parches se han convertido en parte del kernel principal 2.6.30, pero varias distribuciones decidieron incorporarlos a 2.6.28 o 2.6.29. [33]
Estos parches no evitan 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 utilizar software que lo haga fsync()cuando sea necesario. Los problemas de rendimiento se pueden minimizar limitando las escrituras cruciales en el disco que deben fsync()realizarse con menos frecuencia. [34]
Implementación
El sistema de archivos virtual del núcleo de Linux es un subsistema o capa dentro del núcleo de Linux. Es el resultado de un intento de integrar múltiples sistemas de archivos en una única estructura ordenada. La idea clave, que se remonta al trabajo pionero realizado por los empleados de Sun Microsystems en 1986, [35] es abstraer esa parte del sistema de archivos que es común a todos los sistemas de archivos y colocar ese código en una capa separada que llama a los sistemas de archivos concretos subyacentes para que realmente administren los datos.
Todas las llamadas del sistema relacionadas con archivos (o pseudoarchivos) se dirigen al sistema de archivos virtual del núcleo de Linux para su procesamiento inicial. Estas llamadas, que provienen de procesos de usuario, son las llamadas POSIX estándar, como open, read, write, lseek, etc.
Compatibilidad con Windows y Macintosh
Actualmente, ext4 tiene soporte completo en sistemas operativos que no son Linux.
Microsoft Windows puede acceder a ext4 desde Windows 10 Insider Preview Build 20211. [ 36] [37] [38] 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. Grandes cambios en la arquitectura de WSL llegaron con el lanzamiento de WSL 2 el 12 de junio de 2019. [39] 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. [40]
Paragon ofrece su producto comercial Linux File Systems para Windows [41] 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 total de lectura y escritura de ext2/3/4 a través de extFS para Mac de Paragon Software, [42] que es un producto comercial. El software libre como ext4fuse tiene soporte de solo lectura con funcionalidad limitada.
^ ab Anteriormente, Linux utilizaba el mismo GUID para las particiones de datos que Windows (Partición de datos básica: EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ). Linux nunca tuvo un GUID de tipo de partición único separado definido para sus particiones de datos. Esto creó problemas al iniciar Linux y Windows en modo dual en la configuración UEFI-GPT. El nuevo GUID (datos del sistema de archivos de Linux: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 ) fue definido conjuntamente por los desarrolladores de GPT fdisk y GNU Parted. Se identifica como el código de tipo 0x8300 en GPT fdisk. (Consulte las definiciones en parttypes.cc de gdisk)
^ "DiscoverablePartitionsSpec". freedesktop.org . Consultado el 7 de abril de 2018 .
^ ab "ext4: Fix management of extended tv_sec". Árbol de kernel estable para Linux . Consultado el 14 de febrero de 2017 .
^ ab Mathur, Avantika; Cao, MingMing; Bhattacharya, Suparna ; Dilger, Andreas; Zhuravlev (Tomas), Alex; Vivier, Laurent (2007). "El nuevo sistema de archivos ext4: estado actual y planes futuros" (PDF) . Actas del Simposio de Linux . Ottawa, ON, CA: Red Hat. Archivado desde el original (PDF) el 6 de julio de 2010. Consultado el 15 de enero de 2008 .
^ Ts'o, Theodore (28 de junio de 2006). "Propuesta y plan para el trabajo de desarrollo futuro de ext2/3". Lista de correo del kernel de Linux .
^ Leemhuis, Thorsten (23 de diciembre de 2008). «Higher and further: The innovations of Linux 2.6.28 (page 2)». Heise Online. Archivado desde el original el 3 de enero de 2009. Consultado el 9 de enero de 2010 .
^ "ext4: Cambiar el nombre de ext4dev a ext4". Árbol del núcleo de Linus. Archivado desde el original el 29 de mayo de 2012. Consultado el 20 de octubre de 2008 .
^ Leemhuis, Thorsten (23 de diciembre de 2008). "Más alto y más lejos: las innovaciones de Linux 2.6.28". Heise Online.
^ Paul, Ryan (15 de enero de 2010). "Google actualiza a Ext4 y contrata a un ex director de tecnología de Linux Foundation". Ars Technica .
^ "Android 2.3 Gingerbread utilizará el sistema de archivos Ext4". The H Open . 14 de diciembre de 2010.
^ "Sistema de archivos en Debian". 14 de septiembre de 2019.
^ "ext4 - Diseño de alto nivel". kernel.org . Consultado el 8 de diciembre de 2023 .
^ Pomeranz, Hal (28 de marzo de 2011). "Comprensión de EXT4 (parte 3): árboles de extensión". Blog de respuesta a incidentes y análisis forense digital de SANS . Archivado desde el original el 18 de agosto de 2019.
^ "Anatomía de ext4". IMB Developer . Consultado el 27 de mayo de 2024 .
^ "El montaje de ext4 (creado sin extensiones) como ext3 falla en RH6.2". www.linuxquestions.org . Archivado desde el original el 5 de agosto de 2023 . Consultado el 8 de diciembre de 2023 .
^ "Ext4 - Principiantes del kernel de Linux". kernelnewbies.org .
^ "Nuevas características de ext4 - Ext4". ext4.wiki.kernel.org . Archivado desde el original el 23 de septiembre de 2023 . Consultado el 8 de diciembre de 2023 .
^ Prabhakaran, Vijayan; Bairavasundaram, Lakshmi N.; Agrawal, Nitin; Gunawi, Haryadi S.; Arpaci-Dusseau, Andrea C.; Arpaci-Dusseau, Remzi H. (octubre de 2005). Sistemas de archivos IRON (PDF) . Simposio sobre principios de sistemas operativos (SOSP '05). Brighton, Reino Unido: Departamento de informática, Universidad de Wisconsin. Sección 6.1, párrafo 5 "Sumas de comprobación transaccionales" . Consultado el 8 de diciembre de 2023 .
^ "Sumas de comprobación de metadatos de Ext4 - Ext4". ext4.wiki.kernel.org . Archivado desde el original el 6 de noviembre de 2023 . Consultado el 8 de diciembre de 2023 .
^ "Linux_3.5 - Principiantes del kernel de Linux". kernelnewbies.org .
^ Ts'o, Theodore (5 de octubre de 2006). "Re: ¿Marcas de tiempo de creación para ext4?".
^ Edge, Jake (31 de marzo de 2017). «Extendiendo statx()». Archivado desde el original el 20 de septiembre de 2023. Consultado el 8 de diciembre de 2023 .
^ Li, Xi (12 de enero de 2016). «ext4: add project quota support» (Lista de correo). Archivado desde el original el 20 de septiembre de 2023. Consultado el 8 de diciembre de 2023 .
^ Ts'o, Theodore (8 de abril de 2015). «Cifrado Ext4». Archivado desde el original el 12 de octubre de 2023. Consultado el 8 de diciembre de 2023 .
^ "Sistema de archivos Ext4". Wiki de Thomas-Krenn . Archivado desde el original el 14 de febrero de 2022. Consultado el 8 de diciembre de 2023 .
^ "kernel/git/torvalds/linux.git - Árbol de código fuente del kernel de Linux". git.kernel.org .
^ "Ext4 -". ArchWiki .
^ Paul, Ryan (14 de abril de 2009). "Los panelistas reflexionan sobre el núcleo en la Cumbre de colaboración de Linux". Ars Technica . Consultado el 22 de agosto de 2009 .
^ Theodore Ts'o (1 de agosto de 2008). "Re: reiser4 para 2.6.27-rc1". linux-kernel (Lista de correo) . Consultado el 31 de diciembre de 2010 .
^ Corbet, Jonathan (11 de octubre de 2011). "Eliminación segura de archivos de sistemas de archivos ext4".
^ ab "Documentación de ext4 en el código fuente del kernel de Linux". 28 de marzo de 2009.
^ Error de Ubuntu n.° 317781 Larga discusión entre los desarrolladores de Ubuntu y Theodore Ts'o sobre la posible pérdida de datos
^ Entrada del blog Pensamientos de Ted, 12 de marzo de 2009 Una publicación del blog de Theodore Ts'o sobre el tema
^ Kleiman
^ Brandon LeBlanc (10 de septiembre de 2020). "Anuncio de Windows 10 Insider Preview Build 20211". Blogs de Windows . Consultado el 25 de mayo de 2021 .
^ Pierre Boulay (10 de septiembre de 2020). «Acceda a los sistemas de archivos de Linux en Windows y WSL 2». Línea de comandos de Windows . Consultado el 25 de mayo de 2021 .
^ "Comience a montar un disco Linux en WSL 2". Microsoft Docs . Consultado el 25 de mayo de 2021 .
^ Craig Loewen (12 de junio de 2019). «WSL 2 ya está disponible para los participantes de Windows Insiders». Línea de comandos de Windows . Consultado el 25 de mayo de 2021 .
^ "Guía de instalación del subsistema de Windows para Linux para Windows 10". Documentos de Windows . Consultado el 25 de mayo de 2021 .
^ "Sistemas de archivos Linux para Windows". Paragon Software . Consultado el 25 de mayo de 2021 .
^ "extFS para Mac". Paragon Software . Consultado el 25 de mayo de 2021 .
Enlaces externos
Documentación de ext4 en el código fuente del kernel de Linux
Discusión de Theodore Ts'o en ext4, 29 de junio de 2006
"Desfragmentación en línea de ext4" Archivado el 30 de diciembre de 2019 en Wayback Machine (materiales del Simposio sobre Linux de Ottawa de 2007)
"El nuevo sistema de archivos ext4: estado actual y planes futuros" (materiales del Simposio Linux de Ottawa 2007)
Registro del núcleo: Ext4 completa la fase de desarrollo como paso intermedio hacia btrfs, 17 de octubre de 2008
"Mejoras en el asignador de bloques e inodos de Ext4" Archivado el 31 de marzo de 2010 en Wayback Machine (materiales del Simposio sobre Linux de Ottawa 2008)
"Ext4: La próxima generación del sistema de archivos Ext2/3"
Wiki de Ext4 (y Ext2/Ext3)
Wiki de Ext4 en kernelnewbies.org
Puerto nativo de Windows de Ext4 y otros sistemas de archivos en CROSSMETA
Ext2read Una aplicación de Windows para leer/copiar archivos ext2/ext3/ext4 con extensión y soporte LVM2.
Ext2Fsd Controlador de sistema de archivos de lectura/escritura ext2/ext3/ext4 de código abierto para Windows. ext4 es compatible desde la versión 0.50 en adelante
Ext4fuse Controlador ext4 de código abierto de solo lectura para FUSE . (Compatible con Mac OS X 10.5 y versiones posteriores, utilizando MacFuse)