19 May

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:

Llamadas desde ambos namespaces al Kernel

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:

Se crean ambos procesos y un nuevo namespace

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:

El proceso padre se “une” al espacio UTS del hijo

En otras palabras, mediante llamadas a setns un proceso puede “visitar” otros namespaces.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *