Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 23 de septiembre de 2015

Creando nuestros propios containers en Debian

Los conceptos "virtualización" y "la nube" están cada vez más y más expandidos, siendo considerados como las "modas" actuales. Hoy vengo a hablaros sobre un concepto parecido a la virtualización, pero al mismo tiempo diferente: Los Linux Containers; también conocidos como LXC. Aunque ambos, máquinas virtuales y containers, son parecidos en algunos puntos, son bien distintos en otros... 

Un container se trata de un entorno virtual completamente distinto al que estamos corriendo actualmente, si bien este container ha sido creado con un Kernel de Linux, con lo que solamente será capaz albergar sistemas operativos de dicha índole. Una de las ventajas de poseer un entorno virtualizado con respecto a una máquina, se trata del gran rendimiento que se obtiene del susodicho, ya que a nivel de potencia de procesador, velocidad, etc... hereda las mismas virtudes que la máquina; con la diferencia de que este entorno está completamente aislado de nuestro sistema y no corremos peligro de que nuestro sistema se infecte en caso de que el entorno haya sido infectado. En resumen: Podría decirse que un container es una especie de híbrido entre una máquina virtual y un entorno enjaulado chroot.
Ahora que tenemos una idea general de lo que es un container, ¿Qué mejor que crearnos uno? Esto requiere que nuestro sistema posea el init systemd. En caso de tener Debian7, aunque por defecto dicho init no está instalado, podría instalarse mediante:

apt-get install systemd systemd-sysv

Si poseyésemos una versión superior a ésta, no deberíamos preocuparnos en cubrir dicha necesidad, ya que con la llegada de Debian8 se ha implantado por defecto este polémico init. Supongamos que hemos arrancado con systemd; esto no sería suficiente para ponernos a trabajar con nuestros containers, ya que necesitaríamos tener una aplicación instalada en nuestro sistema; aplicación que no tenemos instalada por defecto, llamada debootstrap. Afortunadamente se encuentra en los repositorios con lo que habría que escribir:

apt-get install debootstrap

Ahora sí que podríamos crear nuestros containers; creación que se basaría en la siguiente estructura:

debootstrap --arch=${arquitectura} ${versión_debian} ${nombre_container}

La arquitectura haría referencia a las posibles arquitecturas del sistema que podemos estar usando; arquitectura que podemos consultar mediante el comando:

uname -a |awk '{print $8}'

La versión de Debian que deseamos instalar puede ser wheezy(Debian 7), jessie(Debian8) o unstable, dependiendo de nuestras necesidades, si bien yo recomiendo optar por Jessie (aunque esto es una elección personal). Imaginemos que deseamos crear un entorno llamado Micontainer con Debian jessie instalado, en un arquitectura amd64.

debootstrap --arch=amd64 jessie Micontainer/

El proceso llevará bastante tiempo, pero una vez finalizado éste, ya podríamos disponer de un entorno virtual Linux completamente operativo. En caso de querer ejecutar el entorno virtual que hemos creado solo habría que escribir:

systemd-nspawn -D Micontainer/

Gracias a este comando habríamos ejecutado el container, pero no lo habríamos arrancado... Esto se ha hecho aposta, ya que antes de arrancar el entorno y convertirlo en un sistema 100% funcional, queremos cambiarle la contraseña al usuario root del susodicho para poder manejar el sistema con libertad; con lo que una vez dentro de este entorno pondríamos la contraseña que más nos guste y saldríamos de aquí mediante el comando quit. Ahora sí que podríamos arrancar el entorno, lo cual se realizaría mediante el mismo comando escrito anteriormente, pero con el parámetro -b añadido:

systemd-nspawn -D Micontainer/ -b

Al ser un entorno 100% dependiente de la consola, la gestión de diferentes containers se realiza también desde la consola mediante la herramienta machinectl. Para listar todos los containers en ejecución habría que escribir:

machinectl

En cambio para comprobar el estado de un container en concreto deberíamos escribir el comando machinectl status ${nombre_container}; para nuestro container sería:

machinectl status Micontainer

Dependiendo  del container podríamos obtener un resultado u otro, pero el mensaje mostrado sería algo cómo lo siguiente:


Con estos conceptos solo faltaría jugar con los distintos containers e interactuar con ellos para ver hasta cuan lejos se puede llegar. También podemos intentar dar un paso más allá y optar por herramientas más visuales como Docker, si bien siempre es interesante conocer las bases sobre las que se sostiene dicha herramienta con el fin de comprenderla mejor.

Saludos. 

No hay comentarios :

Publicar un comentario