Espacios de nombres en Linux: comandos unshare y nsenter para aislamiento

InformáticaActualizado el 5,49 KB

Resumen

El documento explica los espacios de nombres (namespaces) del kernel de Linux, base de tecnologías como Docker y LXC, y el uso de los comandos unshare y nsenter. Describe las opciones principales para crear espacios de nombres UTS, PID, de montaje y de usuario, y cómo entrar en los espacios de nombres de un proceso existente.

Puntos clave

  • Los espacios de nombres permiten aislar recursos del sistema y son la base de los contenedores como Docker y LXC.
  • unshare -u crea un nuevo espacio de nombres UTS y ejecuta un bash dentro de él; el cambio de nombre de la máquina no afecta al espacio por defecto.
  • La opción -f (--fork) ejecuta el programa como proceso secundario de unshare, y --mount-proc monta /proc antes de ejecutar el programa.
  • La opción -p (--pid) desvincula el espacio de nombres PID; la opción -m (--mount) hace lo propio con el de montaje.
  • La opción -r (--map-root-user) mapea el usuario actual al superusuario dentro del nuevo espacio de nombres de usuario, sin soportar rangos múltiples de UID y GID.
  • El comando nsenter ejecuta un programa dentro de los espacios de nombres de otro proceso; con -a entra en todos y con -t indica el pid de destino.

Ponte a prueba

Introducción a los Espacios de Nombres en Linux

Los espacios de nombres (namespaces) en Linux son una característica fundamental del kernel que permite el aislamiento de recursos del sistema. Cada proceso tiene su propio conjunto de espacios de nombres, lo que proporciona una forma ligera de virtualización y es la base de tecnologías como los contenedores (Docker, LXC).

El comando unshare es una herramienta poderosa que permite crear y manipular estos espacios de nombres, ejecutando un programa en un nuevo entorno aislado. A continuación, exploraremos su funcionamiento y algunas de sus opciones clave, junto con el comando nsenter, que permite entrar en los espacios de nombres de un proceso existente.

Conceptos Fundamentales de unshare

El comando unshare -u crea un nuevo espacio de nombres UTS (Unix Time-sharing System) y ejecuta un bash dentro de ese nuevo espacio de nombres UTS.

La existencia de este nuevo espacio de nombres UTS puede verificarse comparando la salida de los comandos ls -l /proc/$$/ns: todos los espacios de nombres serán idénticos, excepto el de UTS. Esta misma información también es accesible mediante el comando lsns.

Es posible cambiar el nombre de la máquina dentro de este nuevo espacio de nombres, pero los procesos en el espacio de nombres por defecto no percibirán dicho cambio.

Cuando el proceso bash finaliza, el nuevo espacio de nombres UTS se destruye.

Opciones Clave de unshare y nsenter

Experimento 2: Opciones de unshare para Procesos y Montajes

  • -f, --fork: Crea el programa especificado como un proceso secundario de unshare en lugar de ejecutarlo directamente. Esto es útil al crear un nuevo espacio de nombres.
  • --mount-proc: Justo antes de ejecutar el programa, monta el sistema de archivos proc en el punto de montaje (/proc). Esto es particularmente útil al crear un nuevo espacio de nombres PID. Implica también la creación de un nuevo espacio de nombres de montaje, ya que de otro modo el montaje de /proc podría generar conflictos.
  • -p, --pid: Descomparte el espacio de nombres PID. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace.

Experimento 3: Gestión de Espacios de Nombres de Montaje

El comando mount -t tipo dispositivo dir indica al núcleo que adjunte el sistema de archivos ubicado en el dispositivo al directorio dir. El contenido previo, el propietario y los permisos de dir se vuelven invisibles. Mientras este sistema de archivos permanezca montado, la ruta de acceso dir se referirá a la raíz del sistema de archivos en el dispositivo.

  • -m, --mount [=archivo]: Descomparte el espacio de nombres de montaje. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace. Es importante tener en cuenta que el archivo debe estar ubicado en un sistema de archivos con propagación. El espacio de nombres montado solo será visible dentro de la sesión bash donde se realizó el montaje; si se accede desde otro terminal, el archivo montado parecerá no existir. Esto se debe a la acción del flag -m del comando unshare.

Experimento 4: Espacios de Nombres UTS y Mapeo de Usuarios

  • -u, --uts [=archivo]: Descomparte el espacio de nombres UTS, lo que significa que crea un nuevo espacio de nombres UTS y ejecuta un bash dentro de él. Si se especifica un archivo, se crea un espacio de nombres persistente mediante un montaje de enlace.
  • -r, --map-root-user: Ejecuta el programa solo después de que los ID de usuario y grupo efectivos actuales se hayan mapeado al UID y GID de superusuario dentro del espacio de nombres de usuario recién creado. Esto permite adquirir las capacidades necesarias para gestionar diversos aspectos de los espacios de nombres recién creados, incluso cuando se ejecuta sin privilegios, sirviendo como una característica de conveniencia. Sin embargo, no soporta casos de uso más complejos, como la asignación de múltiples rangos de UID y GID.

Experimento 6: El Comando nsenter

El comando nsenter permite ejecutar un programa dentro de los espacios de nombres de otros procesos.

  • -a, --all: Entra en todos los espacios de nombres del proceso de destino, utilizando las rutas por defecto /proc/[pid]/ns/*. Las rutas por defecto a los espacios de nombres del proceso de destino pueden ser sobrescritas por el espacio de nombres. El espacio de nombres del usuario se ignorará si es el mismo que el espacio de nombres de usuario actual del proceso que llama.
  • -t, --target pid: Especifica un proceso de destino (pid) para obtener sus contextos de espacio de nombres. Existen diferentes rutas para obtener todos los contextos por pid.

Descargar

PDF Word HTML

Preguntas frecuentes

¿Qué hace el comando unshare -u en Linux?

Crea un nuevo espacio de nombres UTS y ejecuta un bash dentro de él. Al finalizar el proceso bash, el nuevo espacio de nombres UTS se destruye.

¿Para qué sirve el comando nsenter?

Permite ejecutar un programa dentro de los espacios de nombres de otros procesos. Con la opción -t se indica el proceso de destino y con -a se entra en todos sus espacios de nombres.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué espacio de nombres crea el comando unshare -u?
2. ¿Qué hace la opción --mount-proc de unshare?
3. ¿Qué opción de nsenter entra en todos los espacios de nombres del proceso de destino?
4. ¿Qué hace la opción -r (--map-root-user) de unshare?
5. ¿Qué ocurre con el cambio de nombre de la máquina realizado dentro del nuevo espacio UTS?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.