# Espacio de nombres Linux

Los espacios de nombres (en inglés: namespace) son una característica del kernel de Linux que divide y aísla los recursos del kernel de manera que un conjunto de procesos asignado a cierto nombre de espacio ve un conjunto de recursos, mientras que otro conjunto de procesos asignado a un nombre de espacios diferente ve un conjunto diferente de recursos.
La característica funciona al tener el mismo espacio de nombres para un conjunto de recursos y procesos, pero esos espacios de nombres se refieren a recursos distintos. Los recursos pueden existir en varios espacios de nombres. Ejemplos de dichos recursos son ID de proceso, nombres de host, ID de usuario, nombres de archivo, algunos nombres asociados con el acceso a la red y comunicación entre procesos .
Los espacios de nombres son un aspecto fundamental de los contenedores en Linux.
Un sistema Linux comienza con un único espacio de nombres de cada tipo, utilizado por todos los procesos. Los procesos pueden crear espacios de nombres adicionales y también pueden unir diferentes espacios de nombres para configurar diferentes niveles de aislamiento.

## Historia

Los espacios de nombres de Linux se inspiraron en la funcionalidad de espacios de nombres utilizada en el Plan 9 de Bell Labs. Los espacios de nombres de Linux se implementaron en el 2002 en la versión del kernel 2.4.19 con trabajo en el tipo de espacio de nombres de Mount y a partir del 2006 se empezaron a agregar más espacios de nombres.
A partir de la introducción de espacios de nombres de usuario en la versión 3.8 del Kernel la se obtuvo el soporte adecuado para la implementación de contenedores.

## Tipos

A partir de la versión 5.6 del kernel, existen 8 tipos de espacios de nombres:
* mnt
* pid
* net
* ipc
* uts
* user
* cgroups
* time
La funcionalidad del espacio de nombres es la misma en todos los tipos: cada proceso está asociado con un espacio de nombres es aislado del resto de procesos y solo puede ver o usar los recursos asociados con ese espacio de nombres al que se encuentra asignado así como aquellos de los espacios de nombres descendientes cuando corresponda. De esta manera, cada proceso (o grupo de procesos del mismo) puede tener una vista única de los recursos.
El recurso que se aísla depende del tipo de espacio de nombres que se ha creado para un grupo de procesos determinado.

### MNT
#### Montaje - Mount

Los espacios de nombres de montaje controlan los puntos de montaje . Tras su creación, los montajes del espacio de nombres de montaje actual se copian al nuevo espacio de nombres, pero los puntos de montaje creados posteriormente no se propagan entre espacios de nombres (al usar subárboles compartidos, es posible propagar puntos de montaje entre espacios de nombres).
El indicador de clonación utilizado para crear un nuevo espacio de nombres de este tipo es CLONE_NEWNS, abreviatura de "NEW NameSpace". Nótese que no se indica qué tipo de espacio de nombres se va a crear, esto es debido a que Mount fue el primer tipo de espacios de nombres en ser creado y no se anticipo la existencia de más tipos de espacios de nombres .

### PID
#### ID de Proceso - Process ID

El espacio de nombres PID proporciona a los procesos un conjunto independiente de ID de proceso (PID) de otros espacios de nombres. Los espacios de nombres PID están anidados, lo que significa que cuando se crea un nuevo proceso tendrá un PID para cada espacio de nombres desde su espacio de nombres actual hasta el espacio de nombres PID inicial. Por lo tanto, el espacio de nombres PID inicial puede ver todos los procesos, aunque con PID diferentes a los que otros espacios de nombres verán los procesos.
Al primer proceso creado en un espacio de nombres PID se le asigna el número de ID de proceso 1 y recibe la mayor parte del mismo tratamiento especial que el proceso de inicio normal, en particular que se le adjuntan procesos huérfanos dentro del espacio de nombres. Esto también significa que la terminación de este proceso PID 1 terminará inmediatamente todos los procesos en su espacio de nombres PID y cualquier descendiente.

### NET
#### Red - Network

Los espacios de nombres de red virtualizan la pila de red . Al crearse, un espacio de nombres de red contiene solo una interfaz de bucle invertido . Cada interfaz de red (física o virtual) está presente en exactamente 1 espacio de nombres y se puede mover entre espacios de nombres. Cada espacio de nombres tendrá un conjunto privado de direcciones IP, su propia tabla de enrutamiento, listado de sockets, tabla de seguimiento de conexiones, firewall y otros recursos relacionados con la red. Al destruir un espacio de nombres de red, se destruyen todas las interfaces virtuales que contiene y se mueven las interfaces físicas de nuevo al espacio de nombres de red inicial.

### IPC
#### Comunicación entre procesos - Inter-process Communication

Los espacios de nombres IPC aíslan los procesos de la comunicación entre procesos estilo SysV . Esto evita que procesos en diferentes espacios de nombres IPC utilicen, por ejemplo, la familia de funciones SHM para establecer un rango de memoria compartida entre los dos procesos. En cambio, cada proceso podrá utilizar los mismos identificadores para una región de memoria compartida y producir dos regiones distintas.

### UTS
#### Tiempo Compartido de UNIX - UNIX Time Sharing

Los espacios de nombres UTS (UNIX Time-Sharing ) permiten que un único sistema parezca tener diferentes nombres de host y dominio para diferentes procesos. "Cuando un proceso crea un nuevo espacio de nombres UTS... el nombre de host y el dominio del nuevo espacio de nombres UTS se copian de los valores correspondientes en el espacio de nombres UTS de la persona que llama".

### USER
#### ID de usuario - User ID

Los espacios de nombres de usuario son una característica que proporciona aislamiento de privilegios y segregación de identificación de usuarios en múltiples conjuntos de procesos, disponibles desde el kernel 3.8. Con asistencia administrativa, es posible construir un contenedor con aparentes derechos administrativos sin otorgar privilegios elevados a los procesos de usuario. Al igual que el espacio de nombres PID, los espacios de nombres de usuario están anidados y cada nuevo espacio de nombres de usuario se considera hijo del espacio de nombres de usuario que lo creó.
Un espacio de nombres de usuario contiene una tabla de mapeo que convierte los ID de usuario desde el punto de vista del contenedor al punto de vista del sistema. Esto permite, por ejemplo, que el usuario raíz tenga el ID de usuario 0 en el contenedor, pero en realidad el sistema lo trata como ID de usuario 1.400.000 para las comprobaciones de propiedad. Se utiliza una tabla similar para asignaciones de ID de grupo y comprobaciones de propiedad.
Para facilitar el aislamiento de privilegios de las acciones administrativas, cada tipo de espacio de nombres se considera propiedad de un espacio de nombres de usuario según el espacio de nombres de usuario activo en el momento de la creación. Un usuario con privilegios administrativos en el espacio de nombres de usuario apropiado podrá realizar acciones administrativas dentro de ese otro tipo de espacio de nombres. Por ejemplo, si un proceso tiene permiso administrativo para cambiar la dirección IP de una interfaz de red, puede hacerlo siempre que su propio espacio de nombres de usuario sea el mismo (o ancestro de) el espacio de nombres de usuario propietario del espacio de nombres de red. Por lo tanto, el espacio de nombres de usuario inicial tiene control administrativo sobre todos los tipos de espacios de nombres en el sistema.

### cgroup
#### grupo de control - Control group

El tipo de espacio de nombres cgroup oculta la identidad del grupo de control del cual el proceso es miembro. Un proceso en dicho espacio de nombres, al verificar de qué grupo de control forma parte cualquier proceso, vería una ruta que en realidad es relativa al grupo de control establecido en el momento de la creación, ocultando su verdadera posición e identidad del grupo de control. Este tipo de espacio de nombres existe desde marzo de 2016 en Linux 4.6.
No debe confundirse el grupo de control con el espacios de nombres cgroup, donde el espacio de nombres es una capa de aislamiento para la identidad del primero.

### Time
#### tiempo - time

El espacio de nombres de tiempo permite a los procesos ver diferentes tiempos del sistema de una manera similar al espacio de nombres UTS. Se propuso en 2018 y aterrizó en Linux 5.6, que se lanzó en marzo de 2020.

## Espacios de nombres propuestos
### syslog

El espacio de nombres syslog fue propuesto por Rui Xiang, un ingeniero de Huawei, pero no se fusionó con el kernel de Linux. systemd implementó una función similar llamada espacio de nombres de revista (journal namespace) en febrero de 2020.

## Implementación

El kernel asigna a cada proceso un enlace simbólico por tipo de espacio de nombres en /proc/<pid>/ns/ . El número de inodo al que apunta este enlace simbólico es el mismo para cada proceso en este espacio de nombres. Esto identifica de forma única cada espacio de nombres por el número de inodo al que apunta uno de sus enlaces simbólicos.
La lectura del enlace simbólico mediante readlink devuelve una cadena que contiene el nombre del tipo de espacio de nombres y el número de inodo del espacio de nombres.

### Llamadas al sistema

Tres llamadas al sistema pueden manipular directamente los espacios de nombres:
* Clonar (clone), banderas para especificar a qué nuevo espacio de nombres se debe migrar el nuevo proceso.
* Dejar de compartir (unshare), permite que un proceso (o subproceso) desasocia partes de su contexto de ejecución que actualmente se están compartiendo con otros procesos (o subprocesos).
* Setns, ingresa el espacio de nombres especificado por un descriptor de archivo.

### Destrucción

Si ya no se hace referencia a un espacio de nombres, se eliminará; el manejo del recurso contenido depende del tipo de espacio de nombres. Se puede hacer referencia a los espacios de nombres de tres maneras:
* Por un proceso perteneciente al espacio de nombres.
* Mediante un descriptor de archivo abierto al archivo del espacio de nombres ( /proc/<pid>/ns/<ns-kind> )
* Un montaje de enlace del archivo del espacio de nombres ( /proc/<pid>/ns/<ns-kind> )

## Adopción

Varios gestores de contenedores utilizan espacios de nombres de Linux en combinación con cgroups para aislar sus procesos, incluidos Docker y LXC .