systemd-nspawn (Español)

From ArchWiki

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 Arch Linux en un contenedor

En primer lugar instale arch-install-scripts.

Cree un directorio para mantener el contenedor. En este ejemplo se usará ~/MyContainer.

Use pacstrap para instalar un sistema básico de arch dentro del contenedor. Como mínimo es necesario instalar el grupo de paquetes base.

# pacstrap -i -c -d ~/MyContainer base [pkgs/grupos adicionales]
Sugerencia: El parametro -i omitira auto confirmación en la selección de paquetes. Ya que no es necesario instalar el kernel en el contenedor, lo puede remover de la lista de selección para ahorrar espacio. Vea pacman#Utilización.
Nota: El paquete linux-firmware requerido por linux, que esta incluido en el grupo de paquetes base no es necesario para ejecutar el contenedor. Este causa algunos problemas con systemd-tmpfiles-setup.service durante el arranque del contenedor con systemd-nspawn. Es posible instalar el grupo base excluyendo el paquete linux y sus dependecias al construir el contenedor con # pacstrap -i -c -d ~/MyContainer base --ignore linux [additional pkgs/groups]. El parámetro --ignore es pasado a pacman. Vea FS#46591 para más información.

Cuando la instalación ha finalizado, arranque el contenedor ejecutando:

# systemd-nspawn -b -D ~/MyContainer

El parámetro -b arranca el contenedor (v.g. ejecuta systemd como PID=1), en lugar de simplemente iniciar una shell, y el parámetro -D especifica el directorio que se usara como directorio raíz del contenedor.

Después que el contenedor arranque, inicie sesión con el usuario "root" sin contraseña.

El contenedor se puede apagar ejecutando poweroff desde dentro del contenedor. Desde el sistema anfitrión, los contenedores se pueden controlar con la herramienta machinectl.

Nota: Para terminar la sesión estando dentro del contenedor, oprima Ctrl y rápidamente presione ] tres veces. Teclados con disposición diferente a US, deben usar % en lugar de ].

Crear un Arch Linux i686 dentro de un anfitrión x86_64

Es posible instalar un sistema mínimo de Arch Linux i686 dentro de un directorio y usarlo como un contenedor de systemd-nspawn en lugar de usar chroot o virtualización. Esto es útil para examinar la compilación de PKGBUILD en un sistema de i686. Este seguro de usar pacman.conf sin el repositorio multilib.

 # pacman_conf=/tmp/pacman.conf # este es pacman.conf sin multilib
 # mkdir /mnt/i686-archlinux
 # linux32 pacstrap -C "$pacman_conf" -di /mnt/i686-archlinux base base-devel

Se puede dejar el paquete linux fuera del grupo base, ya que el sistema creado no pretende ser encendido en hardware real o virtual.

Para arrancar el sistema i686 resultante como una instancia de systemd-nspawn, ejecute:

 # linux32 systemd-nspawn -D /mnt/i686-archlinux

Crear un ambiente Debian o Ubuntu

Instale debootstrap, gnupg1AUR, y uno de estos paquetes: debian-archive-keyring o ubuntu-keyring (obviamente instale el llavero del distro que quiere).

Nota: systemd-nspawn requiere que el sistema operativo dentro del contenedor ejecute systemd como PID 1 y que systemd-nspawn este instalado en el contenedor. Esto quiere decir que Ubuntu antes de la version 15.04 no funcionaran, y configuraciones extras para cambiar de upstart a systemd son necesarias. También asegurese que el paquete systemd-container esta instalado en el contenedor.

Desde este punto es relativamente trivial crear un ambiente con Debian o Ubuntu:

# cd /var/lib/machines
# debootstrap <nombrecodigo> myContainer <url-repositorio>

Para Debian nombres código validos son "stable" o "testing", también nombres de publicaciones "stretch" and "sid". Para Ubuntu el nombre código puede ser "xenial" o "zesty". Una lista completa de nombres codigo esta en /usr/share/debootstrap/scripts.

En caso de una imagen de Debian la "url-repositorio" puede ser https://deb.debian.org/debian/. Para Ubuntu la "url-repositorio" puede ser http://archive.ubuntu.com/ubuntu/.

A diferencia de Arch, Debian y Ubuntu no dejaran iniciar sesión sin una contraseña. Para establecer la contraseña de root inicie sesión con el parámetro -b y cambie la contraseña:

# systemd-nspawn -D myContainer
# passwd
# logout

Si los comandos de arriba no funcionaron, es posible arrancar el contenedor y ejecutar estos comandos:

# systemd-nspawn -b -D myContainer  # Arranca el contenedor
# machinectl shell root@myContainer /bin/bash  # Obtenga una shell con root
# passwd
# logout

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 [1] 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