De los Namespaces en Linux (II)
El namespace de uts
El espacio de nombres de UTS permite gestionar dos recursos: el hostname y el NIS.
El primero de ellos, hostname o nombre de equipo, sirve para identificar una máquina en una red. Se puede interactuar con él a través de comandos como [set/get]hostname o uname
Gracias al namespace, cada proceso o grupo de procesos puede disponer de su propio hostname dentro de la máquina.
En un ejemplo:
use strict;
use Eixo::Zone;
my $pid = Eixo::Zone->init(
init=>sub {
`hostname MAQUINA-HIJO`;
print “El hostname [en el espacio de hijo] es ” . `hostname`;
exit (0);
},
self_uts=>1
);
waitpid($pid, 0);
print “El hostname [en el espacio de padre es] es ” . `hostname`;
Lo cual producirá la siguiente salida (dependiendo del hostname real de la máquina)
El hostname [en el espacio de hijo] es MAQUINA-HIJO
El hostname [en el espacio de padre] es ejemplos
¿Qué ha pasado?
Se ha creado un proceso con clone pasando el flag CLONE_NEWUTS. Esto implica que el proceso hijo «disfruta» de su propio espacio de UTS
La llamada a sethostname se realiza desde el espacio UTS del hijo, por lo que el nombre que se modifica es el de ese espacio.
Si se llama a gethostname desde el espacio del padre, se obtendrá el hostname original.
Se puede concluir que: el Kernel contextualiza las llamadas a [set/get]hostname en función del espacio desde donde se llamen.
En un diagrama:
Creación de un proceso «visitante»
Imaginémonos que queremos saber cuál es el hostname empleado dentro del namespace UTS privado de un proyecto.
Linux nos va a permitir que un proceso se «introduzca» dentro del espacio de un proceso o grupo de procesos y pueda ejecutar llamadas al Kernel dentro del mismo.
Veamos el siguiente código:
use strict;
use Eixo::Zone;
my $pid = Eixo::Zone->init(
init=>sub {
`hostname MAQUINA-HIJO`;
print “El hostname [en el espacio de hijo] es ” . `hostname`;
sleep (2);
},
self_uts=>1
);
# nos introducimos en el espacio UTS del hijo
sleep (1);
Eixo::Zone->join(
$pid,
uts=>1
);
# Ahora estamos dentro del hostname del proceso
print “El hostname [en el espacio del hijo] es ” . `hostname`;
waitpid($pid, 0);
Esto produce la siguiente salida:
El hostname [en el espacio de hijo] es MAQUINA-HIJO
El hostname [en el espacio del hijo] es MAQUINA-HIJO
¿Cómo se explica esto?
El proceso hijo ha ejecutado la misma operación de la sección anterior.
Esto es:
La diferencia estriba en el proceso padre.
Mediante la ejecución de una llamada a setns, el proceso padre se ha unido al namespace de UTS del hijo.
Desde ese momento, su llamada gethostname, es relativa al mismo.
En un diagrama:
En otras palabras, mediante llamadas a setns un proceso puede «visitar» otros namespaces.