By

Entendiendo umask

Ahora mismo estoy preparándome para obtener la certificación LPIC-1 y uno de los objetivos del tema que estoy estudiando es conocer y saber utilizar umask, pero me ha parecido que la documentación no es muy clara, al menos en el libro LPIC-1: Linux Professional Institute Certification: Guia de estudio: Examenes 101 y 102, que es el que estoy leyendo.

He buscado en otros libros de GNU/Linux y administración de sistemas que tengo, y tampoco me ha dejado satisfecho. Así que he decidido escribir este post con lo que se acerca de umask y aportar mi humilde granito de arena.

¿Qué es umask?

umask o user mask, la máscara de usuario usada para establecer los permisos a un fichero o directorio recién creado.

Hagamos una prueba, crearé un fichero nuevo y veremos qué permisos tiene:

[email protected]:~$ ls -l file.txt
-rw-r--r-- 1 mviera users 0 jun  1 15:01 file.txt

Podemos observar que el fichero ha sido creado con permisos 0644, es decir, lectura y escritura para el propietario y lectura para el grupo y para el resto de usuarios.

Ahora crearé un directorio y mostraré los permisos como en el ejemplo anterior:

[email protected]:~$ ls -l |grep umask
drwxr-xr-x  2 mviera users       4096 jun  1 15:04 umask-test/

Se puede apreciar que los permisos para los directorios son diferentes, en este caso 0755, o lo que es lo mismo, lectura, escritura y ejecución para el propietario; y lectura y ejecución para el grupo y para el resto de usuarios.

Es posible que ahora mismo nos surjan varias preguntas, ¿por qué estos permisos y no otros?¿Dónde está definido este comportamiento? La respuesta, umask.

Conociendo más a umask

Antes de seguir, lo primero que debemos saber es el valor de umask configurado en nuestro sistema. Normalmente su valor suele ser 022. Podemos averiguarlo ejecutando el comando umask:

[email protected]:~$ umask
022

El valor devuelto se encuentra en formato octal, es decir, como cuando se definen los permisos de un fichero con chmod 755 file.

Es posible modificar el valor ejecutando umask y especificando el nuevo valor a continuación, como en el siguiente ejemplo:

[email protected]:~$ umask 002
[email protected]:~$ umask
002

Por tanto, si creamos ahora un fichero, veremos que los permisos iniciales serán diferentes a los del ejemplo anterior:

[email protected]:~$ touch file2.txt
[email protected]:~$ ls -l file2.txt
-rw-rw-r-- 1 mviera users 0 jun  1 18:03 file2.txt

Hay que tener en cuenta que si modificamos el valor de umask desde la consola, este cambio solo estará vigente en la sesión actual. Es decir, si abrimos una nueva consola el valor de umask se habrá restablecido al valor por defecto (que suele ser 022).

Para modificar el valor de umask de forma permanente será necesario incluir dicha configuración en /etc/profile o /etc/bash.bashrc afectando el cambio a todo el sistema; o en los ficheros ~/.profile o ~/.bashrc si se quiere aplicar el cambio para un usuario en concreto.

Pero…

Cómo funciona umask

Los ficheros y directorios tienen definidos por defecto unos permisos base, 666 para los ficheros y 777 para los directorios.

El valor de umask es un valor octal que representa los bits a eliminar de los permisos base, así que para determinar el permiso inicial que obtendrá un fichero o directorio habrá que restar el valor de umask al permiso base.

Por eso, cuando creamos un fichero, el permiso inicial de éste será 644 (-rw-r–r–), valor resultante de realizar la operación 666 - 022. Al igual que cuando creamos un directorio, el permiso inicial será 755 (drwxr-xr-x), resultado de 777 - 022.

Pero ojo! no se trata de una operación decimal, es decir, no es una resta de un número con otro, es una diferencia a nivel de bits.

umask realiza la diferencia a nivel de bits utilizando el operador AND. Para aclararlo, veamos un ejemplo con los permisos de un fichero:

  1. Los permisos base para un fichero son 666 y el valor de umask, por defecto, es 022. Estos son valores en formato octal, pero el kernel opera a nivel de bits, es decir, en binario. Así que traduciremos estos valores a binario:

    666 = 110 110 110
    022 = 000 010 010
    
  2. Para hacer la diferencia con el operador AND tendremos que invertir el valor de 022 con Not, quedando el siguiente valor:

    Not 022 = 111 101 101
    
  3. Aplicamos el operador AND entre ambos valores:

        666 = 110 110 110
    Not 022 = 111 101 101  AND
    --------------------------
              110 100 100
    
  4. El valor resultante es 111 100 100 que si lo volvemos a traducir a octal resulta ser 644.

Espero que os sirva de ayuda, a mi me ha servido para afianzar conocimientos :-)

Un saludo, Manu.