systemd-nspawn (Español)

Esta traducción de
Systemd-nspawn
fue revisada el
2018-01-04
. Si existen
cambios
puede
actualizarla
o avisar al
equipo de traducción
.
Artículos relacionados
systemd (Español)
Linux Containers
systemd-networkd (Español)
Docker
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