[Linux] LXC: La “virtualización” barata

¿Qué es LXC?

LinuX Containers, una tecnología de contenedores que permite crear jaulas aisladas, una jaula contenedora es un sistema GNU/Linux auto-contenido dentro de otro, al que se le pueden aplicar cuotas de disco, CPU, memoria y algunos límites y capacidades, asignarle una (o varias) interfaces de red e “iniciarlo” como si fuera un equipo independiente.

LXC es construido encima de una jaula (chroot) y proporciona un sistema virtual completo, con mecanismos de “aislamiento e individualización” (isolation) que son completamente nativos al kernel Linux.

A diferencia de una virtualización al estilo de Xen, una “virtualización” basada en contenedores solamente puedes levantar el sistema operativo del host (en este caso, GNU/Linux), sin embargo, se puede levantar diversas “versiones” de GNU/Linux, al estilo de openVZ, con LXC se pueden levantar contenedores “compatibles” en Linux basados en Fedora, CentOS o Ubuntu y a diferencia de openVZ,  no requieren un micro-kernel o un parche completo al kernel Linux, ya que se basa exclusivamente en una tecnología de espacios y grupos (CGROUPS) que es nativa del kernel Linux desde el 2.6.30 y cualquier equipo con un kernel 2.6.30 (o superior), CGROUPS habilitado y los scripts de LXC puede comenzar a crear contenedores.

Se conoce como una “virtualización barata” puesto que no se requiere mucho recurso para levantar un contenedor LXC, consumen mucho menos que una maquina completa Xen y un poco menos que openVZ puesto que LXC se basa en un “chroot aislado y mejorado”, se pueden levantar docenas de “mini-máquinas virtuales” en un simple host.

¿Para qué usaríamos LXC?

A diferencia de openVZ, LXC no requiere un kernel “parcheado” (incluso un kernel Xen puede levantar recursos LXC), sin embargo, LXC no es una tecnología muy “completa”, por ejemplo, a diferencia de openVZ, no se pueden limitar capacidades de manera granular y específica y el kernel “oficial” de Debian estable (Squeeze 6.02) no posee por ejemplo habilitado el control de memoria (cgroup.memory).
Aún asi, LXC es muy útil para iniciar servicios aislados que anteriormente utilizabas una jaula chroot (como DNS) o aquellos que por su bajo consumo de recursos podrían correr perfectamente sobre una jaula LXC, algunos ejemplos serían: DNS, DHCP, Kerberos, Entidad Certificadora, pero que ahora, teniendo su propia reserva de recursos y su propia IP, podrás correrlo de manera aislada y segura.

¿Qué necesitamos?

LXC corre muy bien en Debian Squeeze estable, incluso sobre el kernel Xen 2.6.32, sin embargo, las herramientas para crear “contenedores” están bastante “desfasadas”, yo me hice mi propio script bash que crea un contenedor LXC de Debian usando debootstrap, tengo ya algo más de año y medio con ese script y lo pongo a disposición de quien lo necesite.

Si deseas “experimentar”, tendrás que saber que los núcleos 3.01 y 3.02 fallaron en su configuración de CGROUPS namespaces para soportar claramente LXC (Debian bug) y si desean utilizarlo conjuntamente con Xen, tendrán que subir hasta la última versión en backports, o sea:

  • * linux-image-3.2.0-0.bpo.1-rt-amd64
  • * cgroups habilitado
  • * xen-linux-system-3.2.0-0.bpo.1-rt-amd64
  • * lxc 0.7.5-24

Sin embargo, luego de algunas pruebas, he notado que ambos (Xen 4.1 sobre Kernel 3.2) y LXC (versión 7.4 en adelante) pueden coexistir pacíficamente:

xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  2985     4     r—–    541.9
ldap                                         1   256     1     -b—-     24.1

Y en el mismo equipo, LXC:

lxc-ls
cache
vm1

LXC-Tools: creando contenedores

LXC incorpora algunas “plantillas” para crear contenedores, pero están bastante desatendidas (aún en Wheezy, se consiguen plantillas solamente para crear VMs en Debian Lenny), por lo que hemos creado una serie de scripts que permiten crear contenedores para Debian Squeeze o Wheezy sobre un servidor con CGROUPS y LXC < 0.7.4.

Con LXC > 7.4 lxc-create incorpora la posibilidad de crear contenedores Debian incluso sobre Debian Sid, del que hablaremos en el siguiente capítulo.

Hay que tomar en cuenta que las cosas no se quedan ahí, ya que podemos crear contenedores para cualquier versión de GNU/Linux Debian-Based utilizando debootstrap (Ubuntu, Canaima) y podemos crear Fedora o CentOS utilizando rpmstrap, pero a su vez, una template para openVZ/proxmox (con algunos cambios) es compatible con una VPS LXC, por lo que veremos algunos avances en los scripts de lxc-tools.

Instalando lxc-tools

Tome nota que para poder utilizar contenedores LXC debería cumplir algunas cosas:

* Montado los CGROUPS (tip: agregar esta línea en el archivo /etc/fstab “none /sys/fs/cgroup cgroup defaults 0 0”)
* Instalado paquete LXC
* La forma más fácil de configurar red, es a través de un bridge, debe existir uno configurado (vea: mi artículo sobre virtualización)
* La interfaz bridge debe estar activa (revisar: “brctl show”)

Instalamos las dependencias del script:

apt-get install lxc lsb-release

Descarguen lxc-tools desde su fuente en Gitorious:

git clone https://git.gitorious.org/lxc-tools/bash_version.git

Cambie el modo a ejecutable al script principal:

chmod +x lxc-tool

y ya estamos listos para utilizarlo!.

Usando lxc-tools

lxc-tools viene con un archivo de configuración que permite definir ciertas opciones del script como por ejemplo el tamaño del contenedor, la versión de GNU/Linux (default: Debian), la Suite (default: squeeze) y otras opciones como el grupo de volumen donde crear la VM (TODO: en próxima entrega crearé contenedores directamente en un directorio); sin embargo, el script tratará de auto-descubrir la mayoría de las opciones necesarias.

Crear una VM es tan fácil como ejecutar:

lxc-tool create -n nombre

Este hará las preguntas necesarias y las otras las tomará del archivo de configuración o las autodetectará.

Notas: lxc-tools son unos scripts que tuve más de un año desatendidos, por unas necesidades inmediatas, hice algunos cambios y estaré agregando otros (como la creación de VMs a partir de plantillas de proxmox u openvz), sin embargo, la template para Debian incorporada en LXC 0.7.4 es realmente superior!.

Usando LXC

El comando más básico que deben conocer es “lxc-checkconfig”, este permite verificar si la configuración de nuestro Kernel Linux corresponde a las necesidades de LXC:

lxc-checkconfig

Verán una salida semejante a esta:

Kernel config /proc/config.gz not found, looking in other places…
Found kernel config file /boot/config-3.2.0-1-amd64
— Namespaces —
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

— Control groups —
Cgroup: enabled
Cgroup namespace: required
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

— Misc —
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Si CGROUPS está activo y el kernel soporta LXC, al instalar LXC podremos comenzar a crear VMs.

* Creando una VM:

lxc-create -n nombre -t [debconf|ubuntu|debian]

Donde:

-n : nombre que le daremos al conenedor

-t : template de construcción (debconf, debian base o ubuntu)

* Iniciando una VM:

lxc-start -n nombre

* Deteniendo una VM:

lxc-stop -n nombre

* Listando las VMs activas y creadas:

lxc-ls

Si desean una guía completa de LXC, revisen acá http://lxc.teegra.net/

Conclusiones

LXC se levanta como una alternativa fácil (de gestionar, de trabajar, de configurar, de mantener) a otros sistemas de virtualización/contenedores) su incorporación al ecosistema LIBVIRT nos permite administrarlo fácilmente con cualquier herramienta diseñada para usar libvirt (ej. virt-manager) y su bajo consumo de recursos permite ser pensado para virtualizar en entornos donde otras tecnologías serían imposibles de lograr (ejemplo: ¿se imaginan virtualizar contenedores LXC dentro de una Tablet Android para paralelizar tareas?).

TODO: ¿sería posible crear contenedores Fedora/CentOS desde cero si incorporamos rpmstrap a la fórmula?, ¿será posible incorporar LXC a un sistema Dual-Core Nvidia-Tegra 2 de una tablet?

Prueben y opinen sobre LXC, y como siempre:

Happy Hacking!

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 4 marzo 2012 en Blogeando!, Cultura Libre, La nota del día, Linux, PlanetaLinux, Programacion, Software Libre, Virtualizacion y etiquetado en , , , , , , . Guarda el enlace permanente. 18 comentarios.

  1. Bien a probarlo hace rato no me pongo a estudiar las tecnologías de virtualización que hay

  2. Excelente articulo compañero Jesús; no conocía esta herramienta de LXC para virtualizacion.

    saludos

  3. Excelente artículo !! Gracias por compartirnos tus pruebas y conocimientos🙂

  4. Muy bueno e interesante tu artículo!.
    Pregunta: tengo una placa wireless PCI en la PC que uso habitualmente con Debian Squeeze y quisiera hacer algunas pruebas con esa placa pero no quiero “ensuciar” la instalación con ciertos servicios. ¿Me permite un contenedor LXC usar esta placa wireless con las mismas funcionalidades que tiene en la PC anfitriona ?. Me refiero a si tiene un soporte del tipo “PCI passthrough”.

    Gracias!.
    Saludos.

    • PCI passthrough es algo que verás en sistemas “virtualizados”, LXC es un sistema “embebido” dentro de una jaula, por ende, solamente puedes desplegar hacia los contenedores aquellas cosas que puedas gestionar vía CGROUPS, los USB-devices (a través de cgroup.devices.allow) son posibles de acceder (siempre y cuando la permisología lo permita), pero PCI aún requiere una cantidad de configuración adicional.
      Sin embargo, si usando un Kernel que soporte PCI-binding (enlazado, ocultamiento y asignación de dispositivos), básico para Xen, se podría ocultar un dispositivo PCI y “mostrarlo” mediante permisos en el contenedor, no he realizado las pruebas …
      Sería muy interesante …

  5. Buenas tardes como hago para configurar una red, y que todos los terminales accedan al servidor para usar unar maquina virtual, suponiendo que los terminales no poseen disco duro.

  6. Saludos, excelente artículo.
    Para un novato nato como yo cual recomiendas? Sólo he usado el virtualbox y cuando usaba WinBugs también probé VMWare, pero hoy en día estoy con canaima y escuchando la ponencia del 8vo CNSL me enteré de otras alternativas =D como XEN, KVN, LXC, (Simple Protocol for Independent Computing Environment), Qubes OS. Pero es mucha información como para digerirla. No tengo virtualización por Hardware y al ejecutar cat /proc/cpuinfo | grep vmx no me arroja ningún dato. Gracias a quién pueda responder y a todas aquellas personas que creen y apoyan difundir el conocimiento, un abrazo desde Cabudare-Estado Lara, Venezuela

    • Pues si no cuentas con virtualización por hardware en tu equipo, te puedo recomendar 2 opciones:
      * Si deseas virtualizar (para-virtualizar) otros sistemas, monta Xen 4 (aún puedes correr virtualbox para correr windows sobre Xen)
      * Puedes usar LXC para un ambiente de contenedores, esto es más que todo para usar diferentes versiones de Linux.

      Lo ideal es practicar!😉

  7. Jesus en mi debian jessie al hacer el # lxc-checkconfig
    Kernel config /proc/config.gz not found, looking in other places…
    Found kernel config file /boot/config-3.10-2-amd64
    — Namespaces —
    Namespaces: enabled
    Utsname namespace: enabled
    Ipc namespace: enabled
    Pid namespace: enabled
    User namespace: missing
    Network namespace: enabled
    Multiple /dev/pts instances: enabled

    — Control groups —
    Cgroup: enabled
    Cgroup clone_children flag: enabled
    Cgroup device: enabled
    Cgroup sched: enabled
    Cgroup cpu account: enabled
    Cgroup memory controller: missing
    Cgroup cpuset: enabled

    — Misc —
    Veth pair device: enabled
    Macvlan: enabled
    Vlan: enabled
    File capabilities: enabled

    Note : Before booting a new kernel, you can check its configuration
    usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

    Me parece que para activar el User namespace y Cgroup memory controller debo compilar un kernel con esas opciones, aunque tengo 3.10-2-amd64

    • En mi artículo sobre LXC en el nuevo blog, explico cómo activar el cgroup memory controller, esto es una opción que se incorpora en el GRUB (cgroup_controller=memory), favor visita mi otro blog (blog.phenobarbital.info) y allí encontrarás la opción.
      Saludos!

  8. Hola!
    Muy bueno el articulo.

    Sería muy bueno que nos muestres como utilizar las LXC creadas, y si hay cambios grandes en las nuevas versiones (veo que van ya por la 1.0.0.0alpha1.

    Te hago unas preguntas:
    Como puedo hacer para “meterme dentro del contenedor creado”, instalar algo, ejecutar alguna otra cosa y salir?

    Hay manera de guardar “imagenes” de los contenedores? necesito hacer algo así: “Entrar, instalar algo, ejecutar algo y salir” y al entrar de nuevo, que se haya borrado lo que instalé y no haya logs de ningun tipo… como si todo lo que hice en la anterior vez que entré, se borró.

    Dentro de este contenedor creado, hay un arbol de directorios como un gnu/linux recien instalado? Puedo compartir un directorio entre el contenedor y el linux host? (ejemplo, que la carpeta del contendor: /var/noel, sea el /var/share/contenedores/noel de mi linux host).

    Saludos! y muchas gracias!

    • Hola, no hay muchos cambios realmente, a ver con las respuestas:
      – meterse en un contenedor lxc: lxc-console -n nombre_contenedor
      – salir de ese contenedor: CTRL+A Q
      – puedes crear snapshots de los contenedores, sobre todo si estos los montas en LVM o sobre BTRFS
      – Si, dentro del contenedor tienes un Linux completo
      – Claro, puedes compartirlo via el montaje del contenedor, ahora bien, recuerda que no todos los sistemas de archivos permiten que el mismo punto de montaje esté lectura-escritura montado en dos instancias.

      Saludos y no dudes en preguntar!

  9. Muy buenas Jesus,
    He montando LXC Web Panel y a través de la interfaz web he creado un primer contenedor bajo ubuntu todo. Mi duda es como poder acceder a ese contenedor que acabo de crear?
    Cuales son los credenciales de acceso? o como se definen? También veo que me crea una red 10.0.3.0/24 que es inaccesible por los PCs que voy a utilizar para desarrollar, debo hacer algo de routing? declarar otra subred que si sea accesible? Como trabaja este tipo de bridge?

    Como ves no paro de hacer preguntas jeje pero me parece una opción muy buena y me gustaría potenciarla desarrollando sobre ella.

    Crees posible intercomunicar LXC con otra tecnología de virtualización como KVM?

    Saludos y mil gracias.

    • Cada plantilla tiene su configuración, si no te pidió clave, entonces debe tener una configuración por defecto, para acceder ejecutas:
      lxc-console -n {nombre del contenedor}

      Para acceder puedes hacer NAT o crear un bridge, que es la mejor forma de comunicación.

      Y si, es una máquina virtual de contenedores, incluso dentro de una VM hecha con KVM puedes tener contenedores LXC.

      Saludos!

  1. Pingback: Virtualizacion | Kimeds's Blog

  2. Pingback: [Linux] LXC: La “virtualización” barata | Phenobarbital con Soda! « Aguilared

  3. Pingback: LXC - Linux containers en Debian Wheezy - Phenobarbital con Soda!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: