Mkfs ext4
ext4 fue inicialmente una serie de extensiones retrocompatibles con ext3, muchas de ellas desarrolladas originalmente por Cluster File Systems para el sistema de archivos Lustre entre 2003 y 2006, con la intención de ampliar los límites de almacenamiento y añadir otras mejoras de rendimiento[4]. Sin embargo, otros desarrolladores del kernel de Linux se opusieron a aceptar extensiones a 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 de ext4[6].
El sistema de archivos ext4 puede soportar 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[13] Los límites de tamaño máximo de archivos, directorios y sistemas 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 CPUs ARM y PowerPC/Power ISA.
Inodo Ext4
EXT4 es un sistema de archivos de nueva generación que sustituye a la familia de sistemas de archivos de Linux EXT2/EXT3. Fue aceptado como “estable” en el kernel Linux 2.6.28 en octubre de 2008[1]. En el momento de escribir este artículo, está empezando a aparecer como sistema de archivos por defecto en las nuevas versiones de varias distros de Linux. Aunque los desarrolladores intentaron mantener cierto grado de compatibilidad con EXT2/EXT3, hay bastantes cosas nuevas y diferentes en EXT4. Herramientas forenses populares como Sleuthkit no son totalmente compatibles con estos cambios en EXT4, aunque algunas de sus funcionalidades siguen funcionando.
Aunque había leído algunas de las presentaciones[2] relacionadas con EXT4, tenía curiosidad por saber cómo se veían realmente las estructuras de EXT4 en el disco y cómo y por qué los cambios realizados en el sistema de archivos EXT4 rompían las herramientas forenses existentes. Así que decidí encender el viejo editor hexadecimal y comprobarlo por mí mismo. Este es el primero de una serie de artículos que describen mis hallazgos.
EXT4 ha pasado a tener direcciones de bloque de 48 bits. Te remito al artículo citado anteriormente para conocer los porqués de esta decisión y lo que significa en cuanto al tamaño máximo del sistema de archivos, etc. Sin embargo, lo que realmente supone un cambio en EXT4 es el uso de extensiones en lugar del antiguo e ineficiente mecanismo de bloque indirecto[3] utilizado por los anteriores sistemas de archivos Unix (por ejemplo, EXT2/EXT3) para el seguimiento del contenido de los archivos. Los extents son similares a las ejecuciones de cluster en el sistema de archivos NTFS – esencialmente especifican una dirección de bloque inicial y el número de bloques que componen el extent. Un archivo fragmentado tendrá múltiples extensiones, pero EXT4 se esfuerza por mantener los archivos contiguos.
El mejor sistema de archivos
Este documento intenta describir el formato en disco de los sistemas de archivos ext4. Las mismas ideas generales deberían aplicarse también a los sistemas de archivos ext2/3, aunque no soportan todas las características que soporta ext4, y los campos serán más cortos.
NOTA: Este es un trabajo en progreso, basado en las notas que el autor (djwong) hizo mientras desmontaba un sistema de archivos a mano. Las definiciones de las estructuras de datos deberían ser actuales a partir de Linux 4.12 y e2fsprogs-1.43. Todos los comentarios y correcciones son bienvenidos, ya que indudablemente hay mucha sabiduría que podría no estar reflejada en los sistemas de archivos de demostración recién creados.
ext4 divide un dispositivo de almacenamiento en una matriz de bloques lógicos tanto para reducir la sobrecarga de contabilidad como para aumentar el rendimiento al forzar tamaños de transferencia más grandes. Generalmente, el tamaño del bloque será de 4KiB (el mismo tamaño que las páginas en x86 y el tamaño de bloque por defecto de la capa de bloques), aunque el tamaño real se calcula como 2 ^ (10 + sb.s_log_block_size) bytes. A lo largo de este documento, las ubicaciones de disco se dan en términos de estos bloques lógicos, no LBAs crudos, y no bloques de 1024 bytes. Por conveniencia, el tamaño de bloque lógico será referido como $tamaño_de_bloque en el resto del documento.
Ext3 vs ext4
En artículos anteriores sobre los sistemas de archivos de Linux, escribí una introducción a los sistemas de archivos de Linux y sobre algunos conceptos de alto nivel como que todo es un archivo. Quiero entrar en más detalle sobre los detalles de los sistemas de archivos EXT, pero primero, vamos a responder a la pregunta, “¿Qué es un sistema de archivos?” Un sistema de archivos es todo lo siguiente:
Aunque está escrito para Linux, el sistema de archivos EXT tiene sus raíces en el sistema operativo Minix y en el sistema de archivos Minix, que es anterior a Linux en unos cinco años, ya que se publicó por primera vez en 1987. Entender el sistema de archivos EXT4 es mucho más fácil si miramos la historia y la evolución técnica de la familia de sistemas de archivos EXT desde sus raíces en Minix.
Cuando escribió el núcleo original de Linux, Linus Torvalds necesitaba un sistema de archivos pero no quería escribir uno en ese momento. Así que simplemente incluyó el sistema de archivos Minix, que había sido escrito por Andrew S. Tanenbaum y formaba parte del sistema operativo Minix de Tanenbaum. Minix era un sistema operativo tipo Unix escrito con fines educativos. Su código estaba disponible libremente y con la licencia adecuada para permitir a Torvalds incluirlo en su primera versión de Linux.