Usando containers con systemd

Una funcionalidad tal vez poco conocida de systemd es la capacidad de correr containers sin necesidad de lxc o docker. Debajo describiremos brevemente dos de sus componentes.

¿Qué es systemd-nspawn?

  • Un container de espacios de nombres liviano para comandos o sistemas operativos
  • Virtualiza
    • La jerarquía del sistema de archivos
    • El árbol de procesos
    • Subsistemas de IPC
    • El nombre del host y del dominio
  • No se puede desde el container:
    • Modificar las interfaces de red del host
    • Cambiar el reloj del del sistema
    • Crear archivos de dispositivos
    • No se puede reiniciar el host
    • No se pueden cargar módulos del kernel del host
  • Para crear containers se usa:
    • dnf
    • debootstrap
    • pacman

¿Qué es systemd-machined?

Es un servicio que mantiene un seguimiento de las máquinas virtuales y containers y de los procesos que les pertenecen.

Como crear un container Debian

sudo debootstrap --arch=amd64 stretch /var/lib/machines/stretch-2

Como listar images

# machinectl list-images

Como setear la password de root en un container

Para setear la password de root ingresamos el siguiente comando: # systemd-nspawn -UD /var/lib/machines/stretch-2

La opción -U hace que se active el espacio de nombres de usuario. Se selecciona números de UID y GID al azar como dueño del directorio raíz del container y de ser necesario se realizan los ajustes de permisos y ACLs necesarios.

Como preparar el container

Para poder establecer la comunicación entre el host y el container es necesario instalar en este último el paquete systemd-container, de manera que ejecutamos en el mismo:

# apt-get update && apt-get install systemd-container

Luego salimos con Ctrl-D

Como arrancar un container

# machinectl start stretch-2

Como loguearse al container

# systemd-run --machine stretch-2 --pty /bin/login

Otra manera posible es:

# machinectl login stretch-2

Como configurar la red en el container

Hay varias maneras de configurar la red en el container, una manera es aprovecharse de una opción que utiliza systemd:

En resumen, --network-veth : - Crea un enlace virtual entre el host y el container. - La interfaz del host se llamará ve-MACHINE_NAME. Donde MACHINE_NAME será el nombre del container.

  • La interfaz del container se llamará host0.

Tras activar las dos interfaces y darle direcciones IP apropiadas, el host y el container podrán comunicarse por red.

El problema con esta configuración es que el container no tiene manera de acceder al mundo exterior, más allá del host. Ni siquiera configurando al host como default gateway. La manera de solucionarlo es sencilla: arrancando tanto en host como en container el servicio systemd-networkd y luego lanzando el cliente dhcp en el container.

Aquí vemos la configuración asignada al container:

Aun así, tuve que configurar el archivo /etc/resolv.conf a mano.

Como ver el estado de un container

# machinectl status stretch-2

Otra opción es:

# systemctl status systemd-nspawn@stretch-2.service

Conclusión

Teniendo en cuento que la mayoría de las distribuciones actuales más utilizadas usan systemd, es útil contar con un gestor de containers directamente integrado. Seguramente no reemplaza a otras soluciones más sofisticadas, pero para hacer demostraciones, debugging y testing es una excelente opción.

Comentarios

Comments powered by Disqus