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:
mviera@leonopteryx:~$ 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:
mviera@leonopteryx:~$ 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
:
mviera@leonopteryx:~$ 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:
mviera@leonopteryx:~$ umask 002
mviera@leonopteryx:~$ umask
002
Por tanto, si creamos ahora un fichero, veremos que los permisos iniciales
serán diferentes a los del ejemplo anterior:
mviera@leonopteryx:~$ touch file2.txt
mviera@leonopteryx:~$ 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:
-
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
-
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
-
Aplicamos el operador AND entre ambos valores:
666 = 110 110 110 Not 022 = 111 101 101 AND -------------------------- 110 100 100
-
El valor resultante es
110 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.