systemd-nspawn (Español)
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]
Una vez finalizada la instalación, entre en el contenedor y establezca una contraseña de root:
# systemd-nspawn -D ~/MyContainer # passwd # logout
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.
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,testingyunstable, o nombres de lanzamiento comobookwormysid: vea [1] para una lista. - Para Ubuntu, solo deben usarse nombres de versión como
jammyynobley 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.
- para Debian, los nombres de suite válidos son los alias estables
- 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
-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.
/etc/systemd/nspawn/myContainer.nspawn. Vea systemd.nspawn(5) para todas las opciones.
Manejo de contenedores
machinectl
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
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