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

Contenidos

Espacios de nombres de Linux

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

¿Qué son los espacios de nombres?

Cuando está ejecutando muchos procesos y aplicaciones diferentes en un solo servidor, como es el caso de herramientas de implementación como Kubernetes, es esencial tener cada procedimiento aislado, principalmente por seguridad.

Un contenedor no debería poder controlar los recursos de otro, debido a que si ese contenedor se ve comprometido, podría comprometer todo el sistema. Este método de ataque es equivalente a cómo el error de la CPU Fusión de un reactor obras; los diferentes subprocesos de un procesador deben aislarse entre sí. De manera equivalente, 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 equivalente a cómo funciona la aplicación chroot, que encarcela un procedimiento en un directorio raíz distinto, los espacios de nombres separan otros aspectos del sistema. Hay siete espacios de nombres disponibles:

  • Montar, 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 tener acceso a archivos fuera de su punto de montaje. Debido a que esto se hace a nivel de kernel, es mucho más seguro que cambiar el directorio raíz con chroot.
  • Procedimiento, o pid. En Linux, los primeros procesos se generan como hijos de PID 1, que forma la raíz del árbol de procesos. El espacio de nombres del procedimiento corta una rama del árbol PID y no posibilita 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 procedimiento secundario, que se reiniciará desde 1.
  • Comunicación entre procesos, o ipc. Este espacio de nombres controla si los procesos pueden comunicarse de forma directa entre sí.
  • La red, o net. Este espacio de nombres administra qué dispositivos de red puede ver un procedimiento. A pesar de esto, 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 lo ha resuelto y puede administrar las redes por usted.
  • Usuario. Este espacio de nombres posibilita que el procedimiento tenga una «raíz virtual» dentro de su propio espacio de nombres, sin tener acceso de raíz real al sistema principal. Además divide la información de UID y GID, por lo que los espacios de nombres secundarios pueden tener sus propias configuraciones de usuario.
  • UTS. Este espacio de nombres controla la información del dominio y el nombre de host, y posibilita que los procesos piensen que se están ejecutando en servidores con nombres diferentes.
  • Cgroup es otra característica del kernel muy equivalente a los espacios de nombres. Los Cgroups posibilitan 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 hace ningún tipo de «aislamiento de información» como lo harían los espacios de nombres. los espacio de nombres cgroup es una cosa separada, y solo controla qué cgroups puede ver un procedimiento, y no lo asigna a un cgroup específico.

De forma predeterminada, cualquier procedimiento que ejecute utiliza los espacios de nombres globales, y la mayoría de los procesos de su sistema además lo hacen a menos que se especifique lo contrario.

Trabajar con espacios de nombres

Puedes utilizar el lsns comando (ls-namespaces) para ver los espacios de nombres actuales que su sistema tiene activos. Este comando debe ejecutarse como root o, caso contrario, la lista puede estar incompleta.

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

Arriba está el lsns salida de una nueva instalación de Ubuntu. Cada espacio de nombres se enumera junto con el ID de procedimiento, el usuario y el comando que lo creó. Los siete espacios de nombres generados a partir de /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 Canonical Livepatch Servicio.

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

Puede cambiar su espacio de nombres actual con el nsenter utilidad. Este comando le posibilita «ingresar» el espacio de nombres de otro procedimiento, de forma general 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 de forma general).

Usted especifica un ID de procedimiento, después cada espacio de nombres que desea ingresar:

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

A modo de ejemplo, al intentar ingresar al espacio de nombres de montaje para kdevtmpfs lo cargará en ese espacio de nombres, pero posteriormente fallará debido a que no puede hallar /bin/bash, lo que en realidad significa que funcionó, debido a que se cambió el directorio raíz aparente.

Intentar ingresar al 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 a través de enlazar montajes, que puede 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 hacer dos procesos leer diferentes contenidos del mismo archivo.

Para crear nuevos espacios de nombres, debe bifurcar a partir de uno existente (de forma general 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 lsnssalida de:

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

El multiplexor de terminales screen se utiliza aquí para mantener bash ejecutándose en segundo plano; caso contrario, el espacio de nombres desaparecería cuando se cerrara el procedimiento.

A menos que esté realizando una programación de muy bajo nivel, probablemente no tendrá que tocar los espacios de nombres usted mismo. Los programas de contenedorización como Docker administrarán los detalles por usted y, en la mayoría de los casos en los que necesite aislamiento de procesos, solo debe utilizar una herramienta existente. A pesar de esto, es esencial 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 tiene que realizar una depuración manual.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.