Los sistemas de archivos ext2/3/4 soportan un conjunto de atributos de archivo que pueden ser listados y modificados mediante los utilitarios lsattr y chattr. Este artículo demuestra el uso básico de dichas herramientas.

Más allá de los permisos Unix (bits de modo) y bits SETUID y SETGID (que pueden ser visualizados con ls), los sistemas de archivos extendidos 2, 3 y 4 (conocidos como ext2, ext3 y ext4, respectivamente) soportan un conjunto de atributos de archivo adicionales, los cuales extienden la funcionalidad básica.

Los sistemas de archivos ext2, ext3 y ext4 son utilizados históricamente como formato de sistema de archivo por defecto para la mayoría de las distribuciones GNU/Linux. Son sistemas de archivo de propósito general diseñados con la meta de lograr extensibilidad y mantener compatibilidad hacia atrás. Particularmente, un sistema de archivos en formato ext2 y ext3 puede ser montado con el driver ext4. La página de manual de ext4 describe todas las características, opciones de montaje y atributos de archivo para los sistemas de archivos ext2, ext3 y ext4:

man ext4

Los atributos de archivo que soportan los sistemas de archivos ext2, ext3 y ext4 actualmente en Linux son los siguientes:

  • a: sólo append (sólo se pueden agregar datos, no modificar los existentes).
  • A: no atime (no se mantiene la fecha y hora de acceso).
  • d: no dump (se ignora al momento de hacer backups con el programa dump).
  • D: el directorio se sincroniza a disco en cada escritura.
  • i: inmutable (no se puede modificar, sólo renombrar o eliminar).
  • S: el archivo se sincroniza a disco en cada escritura.

Adicionalmente, los sistemas de archivo ext3 y ext4 soportan el siguiente atributo:

  • j: journaling. Cuando un archivo tiene seteado este atributo, significa que se emplea data journaling. Los datos del archivo son escritos en el journal (bitácora de disco) antes de ser archivos en el archivo en sí mismo (siempre que el sistema de archivos esté montado con las opciones data=ordered o data=writeback y el sistema de archivos tenga un journal, ver las opciones de montaje en el manual de ext4). Si el sistema de archivos está montado con la opción data=journal, todos los datos se registran en el journal, y este atributo no tiene efecto.

Finalmente, los sistemas de archivos ext4 soportan el siguiente atributo:

  • e: extents. Indica que el archivo está utilizando extents para mapear los bloques en disco. Los extents son rangos de bloques continuos, lo cual: reduce la cantidad de metadatos necesarios para mantener el archivo; mejora el rendimiento para archivos grandes; reduce la fragmentación del sistema de archivos.
  • Cabe destacar que la implementación actual del kernel Linux para el controlador ext2, ext3 y ext4 ignora algunos atributos no soportados como c (compressed), s (zeroed), u (undeletable) y otros que se mencionan a continuación.
  • Ejemplos

    La herramienta lsattr permite listar los atributos de un archivo pasando su ruta como parámetro:

    root@hal9000:~# ls -ld /etc
    drwxr-xr-x 134 root root 12288 Nov 22 08:03 /etc
    root@hal9000:~# lsattr -d /etc
    -----------I--e---- /etc
    

    En este caso se observa que se trata de un directorio indexado (I) y utiliza extents (e). Las diferentes letras en la salida de lsattr tienen el siguiente significado:

    • a: sólo append.
    • A: no atime.
    • c: utiliza compresión.
    • C: no utiliza copy on write.
    • d: no dump.
    • D: el directorio se sincroniza a disco en cada escritura.
    • e: formato extent.
    • E: archivo encriptado.
    • i: inmutable.
    • I: directorio indexado.
    • j: journaling.
    • N: inline data.
    • P: jerarquía de proyecto.
    • s: borrado seguro (zerofree).
    • S: el archivo se sincroniza a disco en cada escritura.
    • t: no tail-merging.
    • T: tope de jerarquía de directorio.
    • u: inborrable.

    Todos estos atributos pueden ser modificados con chattr excepto E, I y N, los cuales son de sólo-lectura.

    Por ejemplo, si quisiera que un archivo se vuelva inmutable (no pueda ser modificado):

    root@hal9000:~# echo "¡Hola Mundo!" > /tmp/inmutable
    root@hal9000:~# chattr +i /tmp/inmutable 
    

    El seteo de atributos es similar al de la herramienta chmod. Con un símbolo + se agrega un atributo, mientras que con un símbolo - se elimina.

    Al listar el archivo con ls, no se nota cambio alguno. Sin embargo, al listar los atributos se comprueba que el archivo tiene seteado el atributo i:

    root@hal9000:~# ls -l /tmp/inmutable 
    -rw-r--r-- 1 root root 14 Nov 28 11:56 /tmp/inmutable
    root@hal9000:~# lsattr /tmp/inmutable 
    ----i---------e---- /tmp/inmutable
    

    Si se intenta modificar el archivo, el kernel Linux no lo permite:

    root@hal9000:~# echo 1234 > /tmp/inmutable 
    -bash: /tmp/inmutable: Operation not permitted
    root@hal9000:~# cat /tmp/inmutable 
    ¡Hola Mundo!
    

    Este archivo sólo puede ser renombrado o eliminado, pero no modificado.

    Para volver a poder modificarlo, es necesario quitar el atributo i:

    root@hal9000:~# chattr -i /tmp/inmutable 
    root@hal9000:~# lsattr /tmp/inmutable 
    --------------e---- /tmp/inmutable
    root@hal9000:~# echo 1234 > /tmp/inmutable 
    root@hal9000:~# cat /tmp/inmutable 
    1234
    

    Tanto lsattr como chattr son parte del paquete "e2fsprogs".

    Referencias

    Compartí este artículo