Tutoriales

Cree contenedores manualmente usando espacios de nombres: espacio de nombres UTS

Este artículo se basa en mi artículo anterior sobre espacios de nombres, los 7 espacios de nombres de Linux más utilizados y mi serie sobre el uso de espacios de nombres, el uso de espacios de nombres de montaje y la creación manual de contenedores de Linux mediante espacios de nombres PID. Este artículo presentó el espacio de nombres UTS y su relación con los contenedores.

El espacio de nombres Unix Time-Sharing System (UTS) a menudo es malinterpretado por observadores casuales, principalmente porque su nombre ya no se ajusta a su propósito.A pesar de su nombre, el espacio de nombres UTS en realidad controla el nombre de host y nuevo sistema de información campo.Así es como la página del manual lo describe espacio de nombres UTS:

Estos identificadores se establecen mediante sethostname(2) y setdomainname(2)y puede usar uname(2), gethostname(2)y getdomainname(2)Los cambios en estos identificadores son visibles para todos los demás procesos en el mismo espacio de nombres de UTS, pero no para los procesos en otros espacios de nombres de UTS.

Esto significa que algunas herramientas modernas (systemd y otras) pueden no generar los cambios esperados.

Como puede imaginar, existen varios casos de uso en los que podría desear que los procesos tengan diferentes nombres de host. Por ejemplo, los servidores web tienden a advertir si el nombre de host no coincide con el certificado SSL que sirven. Por otro lado, algunos procesos pueden adjuntar nombres de host a procesos de red. Los nombres de host incorrectos pueden hacer que las conexiones fallen o sean rechazadas u otros innumerables problemas.

Dicho todo esto, veamos algunos ejemplos.

Explore el espacio de nombres de UTS

Puede invocar el espacio de nombres UTS con:

$ unshare --uts /bin/bash

Sin embargo, puede notar que una vez que esté en el nuevo espacio de nombres, use hostnamectl set-hostname Los nombres de host en el nuevo espacio de nombres no se cambiarán.

# unshare --uts
# hostname
bastion.stratus.lab
# hostnamectl set-hostname tux
# hostname
bastion.stratus.lab

Sin embargo, si abre un nuevo shell, el nombre de host en realidad ha cambiado:

[[email protected] ~]$ ssh [email protected]
Last login: Tue Dec 7 08:17:48 2021 from 192.168.99.198
[[email protected] ~]# hostname
tux

¿Por qué es como este? systemd no se ejecuta sethostname llamada del sistema. En cambio, systemd hace su trabajo conectándose a un socket. Dado que el socket está asociado con el espacio de nombres anterior, el nombre de host del espacio de nombres anterior se ajusta, pero el nuevo espacio de nombres no.

Usar espacio de nombres raíz

En mi artículo de espacio de nombres de montaje, escribí:

Ahora que está en el nuevo espacio de nombres, probablemente no esperaría ver ninguno de los puntos de montaje originales del host. Sin embargo, no lo es. El motivo es que systemd comparte puntos de montaje de forma recursiva con todos los espacios de nombres nuevos de forma predeterminada.

Da la casualidad de que mucha información sobre systemd proviene de /runque se comparte en el espacio de nombres que creé aquí.

En el artículo del espacio de nombres de montaje, monto tmpfs en un nuevo espacio de nombres en un directorio que no quiero compartir con el antiguo espacio de nombres.

Puedo deshabilitar la mayoría de las llamadas systemd instalando un nuevo espacio de nombres con las siguientes opciones:

$ unshare --mount --uts /bin/bash

luego volver a montar /run:

$ mount -t tmpfs tmpfs /run

Todo el proceso es así:

# unshare --fork --mount --uts /bin/bash
# mount -t tmpfs tmpfs /run
# hostnamectl set-hostname bastion.stratus.lab
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
# hostname tux
# hostname
tux

Puedo confirmar esto abriendo un nuevo shell:

[[email protected] ~]$ ssh [email protected]
Last login: Tue Dec 7 08:33:04 2021 from 192.168.99.198
[[email protected] ~]# hostname
bastion.stratus.lab

Puedo usar lsns Pedido:

[[email protected] ~]# lsns |grep uts
4026531838 uts 133 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532479 mnt 2 11507 root unshare --fork --mount --uts /bin/bash
4026532480 uts 2 11507 root unshare --fork --mount --uts /bin/bash

Entonces puedo usar nsenter Pedido:

[[email protected] ~]# nsenter -t 11507 -a 
[[email protected] /]#

Usar espacio de nombres de usuario

En mi artículo Espacios de nombres de usuario, mencioné algunas consideraciones adicionales al crear un espacio de nombres como usuario sin privilegios:

Cuando crea un nuevo espacio de nombres de usuario, su usuario actual se asignará a ese usuario nadieEsto se debe a que, de forma predeterminada, no se produce ninguna asignación de ID de usuario. Cuando no se define una asignación, el espacio de nombres simplemente usa las reglas del sistema para determinar cómo manejar usuarios no definidos.

Para obtener más información sobre la asignación de usuarios, consulte ese artículo.En este caso quiero raíz Los usuarios se asignan automáticamente. De esta manera, tengo «raíz» en el nuevo espacio de nombres. (Nuevamente, vea el artículo Espacios de nombres de usuario para una discusión sobre espacios de nombres y permisos).

Si practico mi curso integral en un host CentOS Stream 9, observo:

[email protected] ~  $ unshare --map-root-user --user --mount --uts --fork /bin/bash
[email protected] ~  $ hostnamectl set-hostname tux
Could not set static hostname: Interactive authentication required.

Esto se debe a que como polkit Configurado en distribuciones de la serie RHEL. Otras distribuciones no arrojan necesariamente este error. Arch Linux (sin especial polkit config), por ejemplo, los contenedores aún pueden cambiar los nombres de host.Por lo tanto, sigue siendo una buena práctica de seguridad volver a montar independientemente de su distribución. /run.

Es importante tener en cuenta la salida lsns Puede ser más fácil de leer usando --fork Al crear un espacio de nombres.

Así es como se ve sin él --fork bandera:

[[email protected] ~]# lsns |grep uts
4026531838 uts 135 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532414 uts 1 11962 ocp /bin/bash

y con --fork bandera:

[[email protected] ~]# lsns |grep uts
4026531838 uts 134 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532412 user 2 11939 ocp unshare --map-root-user --user --mount --uts --fork /bin/bash

a pesar de que --fork No es estrictamente necesario en este caso, puede ser útil o incluso necesario si se requiere un nuevo espacio de nombres PID (consulte mi artículo sobre espacios de nombres PID para obtener más información).

envolver

El espacio de nombres UTS no es el espacio de nombres Linux más complejo. Sin embargo, es muy útil, especialmente en el contexto de los contenedores.

Para aprovechar al máximo el espacio de nombres UTS, utilícelo junto con el espacio de nombres de montaje al menos cuando use el espacio de nombres raíz, y use los espacios de nombres de montaje y de usuario cuando genere un usuario sin privilegios.

[ Download the intermediate Linux cheat sheet to keep key commands at your fingertips. ]

En mi próximo artículo, hablaré sobre el espacio de nombres de red y cómo usarlo para darle a un espacio de nombres su propia IP y espacio de puerto.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba