¿Qué son los espacios de nombres de Linux y para qué sirven?

Los espacios de nombres de Linux son la tecnología detrás de las tecnologías de contenedores como Docker. Son una característica del kernel de Linux que permite al sistema limitar los recursos mostrados por los procesos en contenedores y asegura que ninguno de ellos pueda interferir con otro.

Índice de contenidos
  1. ¿Qué son los espacios de nombres?
  2. Trabajar con espacios de nombres

¿Qué son los espacios de nombres?

Cuando ejecuta muchos procesos y aplicaciones diferentes en un solo servidor, como es el caso de herramientas de implementación como Kubernetes, es importante aislar cada proceso, principalmente por razones de seguridad.

Un contenedor no debería poder controlar los recursos de otro, porque si ese contenedor se ve comprometido, podría comprometer todo el sistema. Este método de ataque es similar a cómo funciona el error de la CPU Meltdown; varios subprocesos de un procesador deben aislarse entre sí. Asimismo, los procesos que se ejecutan en diferentes sistemas virtuales (contenedores) deben aislarse de otros contenedores.

Los espacios de nombres logran este aislamiento a nivel de kernel. De manera similar a cómo funciona la aplicación chroot, que aprisiona un proceso en un directorio raíz diferente, los espacios de nombres separan otros aspectos del sistema. Hay siete espacios de nombres:

  • Configurar, o mnt. Muy parecido a chroot, el espacio de nombres Mount particiona virtualmente el sistema de archivos. Los procesos que se ejecutan en espacios de nombres de montaje separados no pueden acceder a archivos fuera de su punto de montaje. Dado que esto se hace a nivel del kernel, es mucho más seguro que cambiar el directorio raíz con chroot.
  • Procesos, o pid. En Linux, los primeros procesos se generan como hijos de PID 1, que es la raíz del árbol de procesos. El espacio de nombres del proceso corta una rama del árbol PID y no permite el acceso más arriba en la rama. Los procesos en los espacios de nombres secundarios tendrán en realidad varios PID: el primero representa el PID global utilizado por el sistema principal y el segundo PID representa el PID dentro del árbol del proceso secundario, que comenzará de nuevo desde 1.
  • Comunicación entre procesos, o ipc. Este espacio de nombres controla si los procesos pueden comunicarse directamente entre sí.
  • Neto, o net. Este espacio de nombres administra los dispositivos de red que puede ver un proceso. Sin embargo, esto no configura nada automáticamente para usted; aún deberá crear dispositivos de red virtual y administrar la conexión entre las interfaces de red global y las interfaces de red secundarias. El software de contenedorización como Docker ya ha descubierto esto y puede administrar la red por usted.
  • Usuario. Este espacio de nombres permite que el proceso tenga una "raíz virtual" dentro de su propio espacio de nombres, sin tener acceso de raíz real al sistema principal. También divide la información de UID y GID, de modo que los espacios de nombres secundarios puedan tener sus propias configuraciones de usuario.
  • UTS. Este espacio de nombres verifica el nombre de host y la información del dominio y permite que los procesos piensen que se están ejecutando en servidores con nombres diferentes.
  • Cgroup es otra característica del kernel muy similar a los espacios de nombres. Los Cgroups permiten que el sistema defina límites de recursos (CPU, memoria, espacio en disco, tráfico de red, etc.) para un grupo de procesos. Esta es una característica útil para aplicaciones en contenedores, pero no realiza ningún tipo de "aislamiento de información" como lo harían los espacios de nombres. El espacio de nombres cgroup es una cosa separada y solo controla qué cgroups puede ver un proceso y no lo asigna a un cgroup específico.

De forma predeterminada, cualquier proceso que ejecute utiliza espacios de nombres globales y también la mayoría de los procesos del sistema, a menos que se especifique lo contrario.

Trabajar con espacios de nombres

Puedes usar el lsns comando (ls-namespaces) para mostrar los espacios de nombres activos actuales en el sistema. Este comando debe ejecutarse como root, de lo contrario, la lista puede estar incompleta.

Utilice el comando lsns (ls-namespaces) para ver los espacios de nombres actuales

Arriba está el lsns el resultado de una nueva instalación de Ubuntu. Cada espacio de nombres se enumera junto con el ID de proceso, el usuario y el comando que lo creó. Los siete espacios de nombres generados por /sbin/init con PID 1 son los siete espacios de nombres globales. Los únicos otros espacios de nombres son mnt espacios de nombres para demonios del sistema, junto con el servicio Livepatch de Canonical.

Si trabajara con contenedores, esta lista sería mucho más larga. Puede imprimir esta lista en formato JSON con la -J flag, que puede utilizar mucho más fácilmente con un lenguaje de secuencias de comandos.

Puede cambiar su espacio de nombres actual al nsenter utilidad. Este comando le permite "insertar" el espacio de nombres de otro proceso, generalmente con fines de depuración. En realidad, puede ejecutar cualquier comando en ese espacio de nombres, pero de forma predeterminada solo intenta cargar un shell (/bin/bash generalmente).

Usted especifica un ID de proceso, luego cada espacio de nombres que desea insertar:

sudo nsenter -t PID --mount --net --pid  //etc.

Por ejemplo, al intentar ingresar el espacio de nombres de montaje para kdevtmpfs lo cargará en ese espacio de nombres, pero posteriormente fallará porque no puede encontrar /bin/bash, lo que significa que realmente funcionó, porque se cambió el directorio raíz aparente.

Un intento de poner el espacio de nombres de montaje para kdevtmpfs lo carga en ese espacio de nombres, pero posteriormente falla porque no puede encontrar / bin / bash

Si tu hijo mnt espacio de nombres incluido /bin/bash, puede ingresar y cargar un shell. Esto se puede hacer manualmente, pero debe hacerse mediante montajes de enlace, que pueden manipular el árbol de directorios y vincular archivos a través de mnt espacios de nombres. Esto puede llevar a algunos casos de uso interesantes, como que dos procesos lean contenido diferente del mismo archivo.

Para crear nuevos espacios de nombres, debe bifurcar a partir de uno existente (generalmente global) y especificar qué espacios de nombres desea cambiar. Esto se hace con el unshare comando, que ejecuta un comando con un nuevo espacio de nombres "no compartido" del maestro.

Para dejar de compartir el espacio de nombres del nombre de host, utilice:

sudo unshare -u command

Si el comando se deja en blanco, unshare ejecuta bash por defecto. Esto crea un nuevo espacio de nombres que aparecerá en lsnsla salida de:

Si el comando está en blanco, dejar de compartir ejecuta bash de forma predeterminada

El multiplexor de terminales screen se usa aquí para mantener bash ejecutándose en segundo plano, de lo contrario, el espacio de nombres desaparecería cuando se cierre el proceso.

A menos que esté realizando una programación de muy bajo nivel, probablemente no tendrá que acceder a los espacios de nombres usted mismo. Los programas de contenedorización como Docker se encargarán de los detalles por usted y, en la mayoría de los casos en los que se necesita aislamiento de procesos, solo debe usar una herramienta existente. Sin embargo, es importante comprender cómo funcionan los espacios de nombres en el contexto de la contenedorización, especialmente si está realizando una configuración de bajo nivel de sus contenedores Docker o necesita realizar una depuración manual.

Descubre más contenido

Deja una respuesta

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

Subir Change privacy settings