Jump to content

systemd-nspawn (Español)

From ArchWiki

Esta traducción de Systemd-nspawn fue revisada el 2018-01-04. Si existen cambios puede actualizarla o avisar al equipo de traducción.

systemd-nspawn es parecido al comando chroot, pero es un chroot en esteroides.

systemd-nspawn puede ser usado para ejecutar un comando o un sistema operativo en contenedor de namespace muy ligero. Es mas poderoso que chroot ya que virtualiza toda estructura del sistema de archivos, así como el árbol de procesos, los sub sistemas IPC y los nombres de dominio y del servidor.

systemd-nspawn limita el acceso a varias interfaces del kernel como /sys, /proc/sys o /sys/fs/selinux en modo de lectura unicamente. Interfaces de red y el tiempo del sistema no se pueden modificar desde el contenedor. Nodos de dispositivos no se pueden crear. El sistema anfitrión no se puede reiniciar y módulos del kernel no se pueden montar desde el contenedor.

Este mecanismo difiere de LXC o Libvirt, ya que es una herramienta mucho mas fácil de configurar.

Instalación

systemd-nspawn es parte y viene empaquetado con systemd.

Ejemplos

Crear e iniciar un contenedor mínimo de Arch Linux

Cree un directorio para contener el contenedor, en este ejemplo utilizaremos ~/MyContainer.

Utilice pacstrap del paquete arch-install-scripts para instalar un sistema Arch básico en el contenedor. Como mínimo se necesita instalar el paquete base.

# pacstrap -K -c ~/MyContainer base [paquetes/grupos adicionales]
Sugerencia El paquete base no depende del paquete del kernel linux y está preparado para el uso en contenedores.
Nota Si se crea desde un sistema operativo donde pacstrap no está disponible, se puede utilizar el bootstrap tarball como imagen del contenedor. El llavero de pacman deberá inicializarse dentro del contenedor, vea Install Arch Linux from existing Linux (Español)#Inicializar el llavero de pacman.

Una vez finalizada la instalación, entre en el contenedor y establezca una contraseña de root:

# systemd-nspawn -D ~/MyContainer
# passwd
# logout
Sugerencia Establecer la contraseña de root es opcional. Puede obtener una shell de root en un contenedor iniciado directamente sin tener que iniciar sesión ejecutando machinectl shell root@MyContainer. Vea #machinectl.

Finalmente, inicie el contenedor:

# systemd-nspawn -b -D ~/MyContainer

La opción -b iniciará el contenedor (es decir, ejecutará systemd como PID=1), en lugar de simplemente ejecutar una shell, y -D especifica el directorio que se convierte en el directorio raíz del contenedor.

Una vez que el contenedor se inicie, inicie sesión como "root" con su contraseña.

El contenedor puede apagarse ejecutando poweroff desde dentro del mismo. Desde el anfitrión, los contenedores pueden controlarse mediante la herramienta machinectl.

Nota Para terminar la sesión desde el interior del contenedor, mantenga presionada Ctrl y pulse rápidamente ] tres veces.

Crear un entorno Debian o Ubuntu

Instale debootstrap y uno o ambos paquetes debian-archive-keyring o ubuntu-keyring dependiendo de la distribución que desee.

A continuación, invoque debootstrap con la siguiente estructura:

# debootstrap [OPCIONES...] VERSION DIRECTORIO [URL-REPOSITORIO]
  • VERSION (requerido) es el nombre en clave o alias de la versión específica de la distribución deseada tal como se encuentra en el directorio de scripts:
    • para Debian, los nombres de suite válidos son los alias estables stable, testing y unstable, o nombres de lanzamiento como bookworm y sid: vea [1] para una lista.
    • Para Ubuntu, solo deben usarse nombres de versión como jammy y noble y no números de versión: vea [2] y [3] para una tabla de nombres codigo y números de versión.
    • existen otras referencias en el directorio de scripts para otras distribuciones basadas en Debian como Devuan, eLxr, Kali Linux, Pardus, PureOS, Trisquel y Tanglu (descontinuada desde 2017). Invocarlas suele requerir la adquisición de su llavero específico y pasarlo a la opción --keyring, o desactivar la comprobación de firmas OpenPGP de los archivos Release descargados con --no-check-sig.
  • DIRECTORIO (requerido) es el directorio que contendrá el sistema debootstrap; se creará si aún no existe.
  • URL-REPOSITORIO (opcional): la URL del archivo desde la cual se deben descargar los paquetes. Para los lanzamientos actuales de Debian puede ser cualquier espejo válido como https://deb.debian.org/debian (predeterminado), y para Ubuntu cualquier espejo de [4] como la referencia https://archive.ubuntu.com/ubuntu (también usado por defecto).
Nota Las versiones archivadas de Debian (a partir de 2025-01 esto es cualquier versión anterior a Debian 10/Buster) utilizan la URL especial del espejo debian-archive https://archive.debian.org/debian/. Para Ubuntu, los scripts utilizan https://old-releases.ubuntu.com/ubuntu/. Tenga en cuenta, sin embargo, que surgen problemas relacionados con «llave de firma desconocida» para los lanzamientos no incluidos en los paquetes de llaveros mencionados anteriormente, por ejemplo, cualquier lanzamiento anterior al 9 («Stretch») para Debian[5], lo que convierte a este último en el lanzamiento más antiguo instalable sin obtener un llavero diferente o desactivar la comprobación de firmas como se mencionó anteriormente.

debootstrap no puede resolver dependencias de paquetes virtuales[6] y, como consecuencia, no instala las dependencias recomendadas de systemd dbus y libpam-systemd por defecto[7][8]. Como resultado, algunas funcionalidades relacionadas con systemd/dbus (por ejemplo, localectl), así como la gestión del contenedor con #machinectl, no funcionan de inmediato.

Para obtener una funcionalidad completa en sistemas basados en systemd, añada --include=dbus,libpam-systemd a la invocación de debootstrap o instale esos paquetes una vez dentro del contenedor:

# debootstrap --include=dbus,libpam-systemd,libnss-systemd stable /ruta/a/la/maquina
Nota Pueden surgir otras dificultades al iniciar (es decir, utilizando la opción -b, --boot) contenedores que no utilicen systemd como su sistema de inicio. systemd es el sistema de inicio predeterminado para Debian desde Debian 8 («jessie»)[9] y Ubuntu desde 15.04 («vivid»)[10]. Obtener una shell debería funcionar independientemente del sistema de inicio.

Al igual que Arch, Debian y Ubuntu no le permitirán iniciar sesión sin una contraseña. Para establecer la contraseña de root, ejecute systemd-nspawn sin la opción -b:

# systemd-nspawn -D /ruta/a/la/maquina
# passwd
# logout


Crear un entorno derivado de RHEL usando Podman o Docker

Estas instrucciones deberían ser aplicables a cualquier distribución que utilice dnf. Necesitará Podman o Docker.

# mkdir -p /var/lib/machines/my-machine
# podman pull centos:stream9
# podman run --rm -it -v /var/lib/machines/my-machine:/machine centos:stream9

Desde dentro de ese contenedor, puede construir el entorno raíz para su máquina:

bash-5.1# dnf update -y
bash-5.1# dnf --repo=baseos \
              --releasever=9 \
              --best \
              --installroot=/machine \
              install \
              systemd-udev \
              hostname \
              yum \
              dnf \
              centos-gpg-keys \
              centos-stream-release \
              rootfiles \
              shadow-utils \
              util-linux
bash-5.1# sed -i 's/^root:[^:]*:/root::/' /machine/etc/shadow  # eliminar la contraseña de root para el inicio de sesión inicial
bash-5.1# exit

Desde ahí, debería poder iniciar la máquina:

# systemd-nspawn --machine=my-machine --boot

Activar inicio automático de los contenedores

Al usar un contenedor frecuentemente, seria deseable iniciarlo al arrancar el sistema anfitrión.

Active el target machines.target, después ejecute systemd-nspawn@myContainer.service, donde myContainer es un contenedor de nspawn ubicado en /var/lib/machines.

Sugerencia Para personalizar el arranque de los contenedores, edite /etc/systemd/nspawn/myContainer.nspawn. Vea systemd.nspawn(5) para todas las opciones.

Manejo de contenedores

machinectl

Nota La herramienta machinectl requiere systemd y que el paquete dbus este instalado en el contenedor. Vea [11] para más detalles en la discusión.

El manejo de contenedores es efectuado principalmente con el comando machinectl. Vea machinectl(1) para más detalles.

Ejemplos:

Inicie una shell dentro de un contenedor que ya ha iniciado:

$ machinectl login MyContainer

Mostrar informacion detallada sobre un contenedor:

$ machinectl status MyContainer

Reinicie un contenedor:

$ machinectl reboot MyContainer

Apague un contenedor:

$ machinectl poweroff MyContainer
Sugerencia Apagar y reiniciar se pueden ejecutar desde dentro de una sesión del contenedor, ejecutando los comandos de systemctl poweroff o reboot.

Descargar una imagen:

# machinectl pull-tar URL name

Utilidades de systemd

Bastantes de las utilidades de systemd han sido actualizadas para que funcionen con contenedores. Herramientas que generalmente proporcionan un parámetro -M, --machine= tomaran el nombre del contenedor como argumento.

Ejemplos.

Ver el histórico de una maquina especifica:

# journalctl -M MyContainer

Mostrar el contenido del grupo de control:

$ systemd-cgls -M MyContainer

Mostrar el tiempo de arranque del contenedor:

$ systemd-analyze -M MyContainer

Para una perspectiva de los recursos usados:

$ systemd-cgtop