Creando un container con systemd-nspawn

¿qué es un container y para qué usar systemd-nspawn?

Un contenedor o container es una máquina virtual, que comparte el núcleo del sistema operativo con el equipo anfitrión, sin que pueda acceder a sus archivos.

A diferencia de chroot, systemd-nspawn virtualiza totalmente la jerarquía del sistema de archivos, así como el árbol de procesos, el nombre de host y de dominio, entre otros.

Instalando systemd-nspawn en Debian.

Primero que nada tenemos que instalar los paquetes necesarios para realizar el procedimiento.


# aptitude install systemd-container debootstrap

En segundo lugar creamos el directorio donde vamos a alojar a nuestro sistema operativo que iremos a virtualizar con systemd-nspawn.

El directorio /srv es utilizado por los servidores instalados en el ordenador y lo tomamos siguiendo el tutorial del blog http://0pointer.net/ de Lennart Poettering.

 
# mkdir -p /srv/mycontainer

Descargando SO Debian con debootstrap.

Sobre el tipo de arquitectura a elegir, como en este ejemplo la máquina anfitriona funciona sobre un kernel amd64, opte por instalar la misma que su anfitrión para evitar cualquier tipo de problemas ya que, entiendo que ambos sistemas van a compartir el mismo kernel.
Con respecto al tipo de versión de Debian elegí la versión sid.

 
# debootstrap --arch=amd64 sid /srv/mycontainer/ http://ftp.br.debian.org/debian

Antes de poner en marcha nuestro container tenemos que agregar un pasword para root

 
# systemd-nspawn --directory=/srv/mycontainer/ passwd

Iniciando el container.

Lo primero que haremos es probar que inicia nuestro container, agregando las opciones b (boot) , D (directorio donde tenemos nuestro container) y --network-macvlan (una interfaz virtual que añade una segunda dirección MAC a una red Ethernet física existente).

 
# systemd-nspawn -bD /srv/mycontainer --network-macvlan=eth0 --boot

Nos logueamos como root y procedemos a configurar la interfaz de red.

Creamos el archivo mv-eth0.network

 
# nano /etc/systemd/network/mv-eth0.network

Y agregamos el siguiente texto:

 
[Match]
nName=mv-eth0


[Network]
DHCP=yes

Enlazamos resolv.conf de systemd con el que se encuentra en /etc.

 
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Activamos el demonio systemd-networkd

 
# systemctl enable systemd-networkd.service systemd-resolved.service
# systemctl start systemd-networkd.service systemd-resolved.service

Ya con la conexión a Internet funcionando, instalamos algunos paquetes necesarios y creamos un usuario para poder loguearnos utilizando machinectl y ssh

 
# apt-get update
# apt-get install --no-install-recommends ssh
# apt-get install --no-install-recommends dbus locales
# useradd -m -s /bin/bash rocky
# passwd rocky

Desde otra pestaña del emulador de terminal ejecutamos el comando machinectl para comprobar que nuestro container se encuentra en ejecución.

 
machinectl 
MACHINE     CLASS     SERVICE       
mycontainer container systemd-nspawn

1 machines listed.

Con machinectl nos logueamos con la cuenta de usuario creada.

 
# machinectl login mycontainer

El comando machinectl lo podemos utilizar para saber el estado del container, reiniciarlo o apagarlo o listar todos los container activos.


# machinectl poweroff mycontainer

Configurando nuestro container para que se inicie junto con el sistema operativo anfitrión.

En el sistema operativo anfintrión creamos el archivo mycontainer.service


# nano /etc/systemd/system/mycontainer.service

Dentro colocamos el siguiente texto:


[Unit]
Description=Mi container

[Service]
ExecStart=/usr/bin/systemd-nspawn -jbD /srv/mycontainer --network-macvlan=eth0 3
KillMode=process

Activamos el demonio mycontainer.service


# systemctl daemon-reload
# systemctl enable mycontainer.service 
# systemctl start mycontainer.service

Si todo ha salido bien, nuestro container se iniciará junto con el sistema y podremos acceder a él desde shh o con machinectl.

Conclusión.

systemd-nspawn no es una solución tan completa como Docker o LXC, pero como punto a favor podemos destacar que se genera una completa integración entre las herramientas de la maquina anfitriona y el container (si dentro de este se ejecuta un sistema operativo con systemd) sumado a su "simplicidad" a la hora de instalar y configurar.

Fuentes.

https://copyninja.info/blog/taming_systemd_nsapwn.html

https://lindenberg.io/blog/post/debian-containers-with-systemd-nspawn/

https://wiki.debian.org/es/debootstrap

http://0pointer.net/blog/projects/socket-activated-containers.html

https://wiki.archlinux.org/index.php/Systemd-nspawn

http://sysadmin.lgs.com.ve/post/128608637577/probando-systemd-nspawn-para-crear-y-administrar

rockyiii
Imagen de rockyiii
Categoría: 
Vie, 04/03/2016 - 17:30
moonwatcher
Imagen de moonwatcher
Desconectado/a
moderador
se unió: 21/01/16

se ve interesante. por lo menos para trastear un rato con el yes

We were but stones. Your light made us stars

Dom, 06/03/2016 - 17:42
cnicolas
Imagen de cnicolas
Desconectado/a
colaborador
se unió: 21/02/16

Muy buen articulo. Gracias rockyiii

Debian y GNU/Linux en el core informatico.

te puede interesar

rsync y enlaces duros

Índice   Introducción. Enlaces duros. rsync y enlaces duros. Resumen. Referencias.   1. Introducción. En la wiki encontraréis una entrada detallando el uso de rsync. Partiendo de base que se ha leído dicha documentación vamos a detallar un caso...