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-systemd[archived page] o Libvirt-lxc, 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]
-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.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.
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).
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
.
/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