{ "nodes": [{ "uri": "https:\/\/log.exos.ninja\/3V", "content": "# Configurando un container Debian en Ubuntu server sin LXC ni Docker\r\n## Usando systemd-nspawn en Ubuntu\/Debian\r\n\r\nHace rato cuando veo a profesionales de IT usando sistemas operativos como M$ windoors o OS\/X me agarra una especie de nostalgia mezclada con gran incertidumbre, \u00bfc\u00f3mo alguien que supuestamente sabe puede usar un sistema operativo sin cgroups? \u00bfen que mundo picapiedruzco vive esta gente? \u00bfen serio levanta todos los servicios en el host?.\r\n\r\nComo sea, [cgroups](https:\/\/en.wikipedia.org\/wiki\/Cgroups) es una caracter\u00edstica fant\u00e1stica, que agarro un concepto como la paravirtualizaci\u00f3n y la simplific\u00f3 a niveles rid\u00edculos, haciendo que levantar un container en GNU\/Linux sea algo tan natural como levantar un servicio cualquiera.\r\n\r\nEntre LXC, LXD, Docker y toda la gama de tecnolog\u00edas que aprovechan esta caracter\u00edstica del SO del ping\u00fcino, existe una menos popular, que viene en [systemd](https:\/\/log.exos.ninja\/?q=systemd); **systemd-nspawn**.\r\n\r\nSi no lo conoc\u00e9s te invito a leer la [wiki de arch](https:\/\/wiki.archlinux.org\/index.php\/Systemd-nspawn) que, como siempre, tiene la mejor documentaci\u00f3n.\r\n\r\nPero bueno ahora me toco levantar un container Debian en un Ubuntu Server y not\u00e9 que a diferencia de Arch tiene unas vueltitas m\u00e1s, as\u00ed que hago este log.\r\n\r\n## Instalando lo necesario\r\n\r\nPrimero que nada aclaro que estoy en un [Ubuntu Xenial](http:\/\/releases.ubuntu.com\/16.04\/), que es el \u00faltimo LTS, para versiones mas nuevas puede que se diferencie un poco.\r\n\r\nEs necesario instalar el paquete **systemd-container** para tener el target *machines*, de tiro tambi\u00e9n vamos a instalar **debootstrap**:\r\n\r\n $ sudo apt-get install -y systemd-container debootstrap\r\n\r\nUna vez hecho esto procederemos a crear el container.\r\n\r\n## Creando el container\r\n\r\nPrimero, debemos ser conscientes que tenemos que trabajar en ```\/var\/lib\/machines```.\r\n\r\n # cd \/var\/lib\/machines\r\n # debootstrap jessie micontainer\r\n\r\nObviamente ```micontainer``` es el nombre que deseen, como tercer par\u00e1metro se puede pasar un mirror espec\u00edfico.\r\n\r\nEsto nos va a instalar un *chroot* con Debian Jessie, y esa fue toda la complejidad :P.\r\n\r\nAhora para levantar el container lo \u00fanico que deberemos hacer es:\r\n\r\n # systemd-nspawn -D micontainer\r\n\r\nY listo! ya est\u00e1, es as\u00ed de simple.\r\n\r\nBueno tal vez te aparezca como a m\u00ed un error feo:\r\n\r\n> Failed to create directory \/var\/lib\/machines\/micontainer\/sys\/fs\/selinux: Read-only file system\r\n\r\nPero [aparentemente es ignorable](https:\/\/github.com\/systemd\/systemd\/pull\/3748).\r\n\r\n**Importante**: una vez en esta instancia hay que definir una contrase\u00f1a al usuario root para poder acceder c\u00f3modamente al container.\r\n\r\n # passwd\r\n\r\n## Arrancando container on boot\r\n\r\nSi, me acabo de dar cuenta que no se como traducir *on boot*, supongo que no quiero usar algo cutre como \"al inicio del sistema\"...\r\n\r\nPrimero habilitamos y arrancamos el **target machines**:\r\n\r\n # systemctl enable machines.target\r\n # systemctl start machines.target\r\n\r\nAhora solo tenemos que levantar el unit **systemd-nspawn@micontainer**, si el root est\u00e1 en el directorio que dijimos tendr\u00eda que funcionar de una:\r\n\r\n # systemctl start systemd-nspawn@micontainer \r\n\r\nY obviamente habilitarlo:\r\n\r\n # systemctl enable systemd-nspawn@micontainer \r\n\r\nAhora se puede entrar poniendo:\r\n\r\n # machinectl login micontainer\r\n\r\nY listo!!... \u00bfno? bueno, si a esta altura pudiste entrar, seguramente fixearon el bug y te pod\u00e9s saltar la siguiente parte, pero si te da el mismo error que a mi:\r\n\r\n> Failed to get login PTY: There is no system bus in container\r\n\r\nBienvenido al ruedo:\r\n\r\n## Resolviendo el error con PTY\r\n\r\nEl por qu\u00e9 no podemos acceder directamente es un problema con varias partes:\r\n\r\n**Primero**, por un lado la versi\u00f3n que trae hasta la fecha Ubuntu Server de systemd todav\u00eda no tiene [esto parchado](https:\/\/github.com\/systemd\/systemd\/commit\/f2273101c21bc59a390379e182e53cd4f07a7e71) as\u00ed que la condici\u00f3n para poder entrar es que en el container est\u00e9n corriendo **systemd** y **dbus** simult\u00e1neamente.\r\n\r\n**Segundo**, por una restricci\u00f3n de Debian no podemos logearnos como root en terminales en ```\/dev\/pts\/*``` y si bien muchos recomiendan habilitarlas, Debian dice que es inseguro, y como a mi me encanta la seguridad, no voy a hacer algo que la baje, as\u00ed que propongo otra soluci\u00f3n alternativa.\r\n\r\nPrimero que nada detenemos el container, y entramos a mano:\r\n\r\n # systemctl stop systemd-nspawn@micontainer\r\n # cd \/var\/lib\/machines\r\n # systemd-nspawn --boot -D micontainer\r\n\r\nEl ```--boot``` es para que inicie systemd dentro del container, una vez que nos de el login nos logueamos como root, e instalamos dbus y sudo:\r\n\r\n # apt-get update && apt-get -y install dbus sudo\r\n\r\nLuego creamos un usuario para administrar el container (recuerden que no vamos a poder usar el usuario root):\r\n\r\n # useradd -m -G sudo miusuario\r\n # passwd miusuario\r\n\r\nUna vez hecho esto, podremos entrar como el usuario (en este caso) **miusuario**, primero *apagamos* el container apretando ```Ctrl``` + ```Alt gr``` + ```]``` un par de veces, luego volvemos a levantar desde systemctl:\r\n\r\n # systemctl start systemd-nspawn@micontainer\r\n\r\nY entramos:\r\n\r\n # machinectl login micontainer\r\n\r\nNos logueamos con el usuario que creamos y **no con root** y luego ya podemos hacer un ```sudo su``` o similar.\r\n\r\n## Configurando la red\r\n\r\nBueno esto es otro tema ya que hay muchos casos, pero explico un forma muy b\u00e1sica. En Ubuntu por lo menos la red se configura por defecto con la opci\u00f3n ```--network-veth```, esto crea una interfaz llamada ```ve-micontainer``` (donde *micontainer* es el nombre del container). Y por defecto no tiene ninguna configuraci\u00f3n de IP.\r\n\r\nLa manera mas f\u00e1cil de darle salida a internet al container es instalando en ambos extremos (host y container) ```systemctl-networkd```:\r\n\r\n # apt-get install -y systemctl-networkd\r\n\r\nTambi\u00e9n recomiendan instalar ```systemctl-resolved```, pero podemos, en cambio editar el archivo ```\/etc\/resolv.conf``` a mano y usar alguno de los tantos dns que hay por ah\u00ed.\r\n\r\nOtra cosa que necesitamos tambi\u00e9n es tener habilitado el forwarding del lado del host, para lo que podemos crear el archivo ```\/etc\/sysctl.d\/30-ipforward.conf``` con el siguiente contenido:\r\n\r\n net.ipv4.ip_forward=1\r\n net.ipv6.conf.default.forwarding=1\r\n net.ipv6.conf.all.forwarding=1\r\n\r\nTambi\u00e9n tiramos el siguiente comando:\r\n\r\n # sysctl net.ipv4.ip_forward=1\r\n\r\nPor \u00faltimo, hacemos nat con iptables:\r\n\r\n # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\n # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\r\n # iptables -A FORWARD -i ve-micontainer -o eth0 -j ACCEPT\r\n\r\nAc\u00e1 suponemos que la salida a internet est\u00e1 en la interfaz ```eth0```. \r\n\r\nUna vez hecho todo esto, reiniciamos ```systemctl-networkd``` en el host:\r\n\r\n # systemctl restart systemctl-networkd\r\n\r\nPara configuraciones personalizadas por container se puede usar [el archivo .nspawn](https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd.nspawn.html#.nspawn%20File%20Discovery)\r\n\r\n## Links utilizados\/le\u00eddos:\r\n\r\n* https:\/\/wiki.archlinux.org\/index.php\/Systemd-nspawn\r\n* https:\/\/github.com\/systemd\/systemd\/pull\/3748\r\n* https:\/\/github.com\/systemd\/systemd\/issues\/685\r\n* https:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=771675#20\r\n* https:\/\/github.com\/systemd\/systemd\/issues\/2808\r\n* https:\/\/lindenberg.io\/blog\/post\/debian-containers-with-systemd-nspawn\/\r\n* https:\/\/wiki.archlinux.org\/index.php\/Systemd-networkd#Usage_with_containers\r\n* https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd.nspawn.html\r\n* https:\/\/wiki.archlinux.org\/index.php\/Internet_sharing#Enable_packet_forwarding\r\n* https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd.nspawn.html#.nspawn%20File%20Discovery", "created": "2017-05-31 12:31:44"}] }