Dominando Espacios de Nombres Linux: Comandos unshare y nsenter para Aislamiento y Virtualización
Clasificado en Informática
Escrito el en español con un tamaño de 5,49 KB
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 deunshare
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 archivosproc
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 unarchivo
, se crea un espacio de nombres persistente mediante un montaje de enlace. Es importante tener en cuenta que elarchivo
debe estar ubicado en un sistema de archivos con propagación. El espacio de nombres montado solo será visible dentro de la sesiónbash
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 comandounshare
.
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 unbash
dentro de él. Si se especifica unarchivo
, 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 porpid
.