Tecnología

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

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

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 permite 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 ejecuta muchos procesos y aplicaciones diferentes en un solo servidor, como es el caso de las herramientas de implementación como Kubernetes, es importante tener cada proceso aislado, principalmente por motivos 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 el error de la CPU Fusión de un reactor obras; los diferentes subprocesos de un procesador deben aislarse entre sí. De manera similar, 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 encarcela un proceso en un directorio raíz diferente, 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 acceder 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.
  • Proceso, 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 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 se reiniciará desde 1.
  • Comunicación entre procesos, o ipc. Este espacio de nombres controla si los procesos pueden comunicarse directamente entre sí.
  • Red, o net. Este espacio de nombres administra qué dispositivos de red puede ver un proceso. Sin embargo, esto no configura nada automáticamente; 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 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, 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 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 hace 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 los espacios de nombres globales, y la mayoría de los procesos de su sistema también lo hacen a menos que se especifique lo contrario.

Trabajar con espacios de nombres

Puedes usar el lsns comando (ls-namespaces) para ver los espacios de nombres actuales que su sistema tiene activos. Este comando debe ejecutarse como root o, 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 salida 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 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 el -J flag, que puede utilizar mucho más fácilmente con un lenguaje de programación.

Puede cambiar su espacio de nombres actual con el nsenter utilidad. Este comando le permite «ingresar» 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 nombre que desea ingresar:

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

Por ejemplo, al intentar ingresar al 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 en realidad significa que funcionó, porque 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 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 lsnssalida de:

Si el comando está en blanco, unshare 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 cerrara el proceso.

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 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 tiene que realizar una depuración manual.

Leave a Comment

You may also like

Más