Linux Containers

Después de una laaaarga ausencia, voy a llevarlos a un breve paseo por los “Linux Containers”

Según Dwight Schauer (quien hizo el howto más completo):

Los Contenedores Linux (LXC) son un método de virtualización a nivel sistema operativo, para ejecutar múltiples servidores aislados (contenedores) en un sólo Host controlador. LXC no provee una máquina virtual, pero si provee un entorno virtual que tiene sus propios espacios de proceso y red. Es similar a chroot, pero ofrece mucho más aislamiento.

¿Qué significa esto?

Que con sólo disponer de un kernel nuevo (o al menos en su versión >= 2.6.27), LXC estará habilitado.

Veamos las ventajas rápidamente:

  • Mejor aislamiento comparado con las viejas y queridas jaulas chroot.
  • LXC utiliza recursos mínimos. La respuesta es mucho más rápida que utilizando otro software de máquina virtual ( VMWare / VirtualBox / KVM ).
  • Los servicios y aplicaciones corren a velocidad nativa.
  • Existe soporte para Contenedores Linux en libvirt .
  • LXC trabaja bien con btrfs .
  • No es necesario hardware especial, corre en procesadores de 32 y 64 bits.
  • LXC es Open source.
  • A diferencia de XEN o OpenVZ , no se necesita ningún parche de kernel.

en contra podemos contar:

  • LXC corre procesos Linux en un kernel Linux. Esto quiere decir que se puede ejecutar Fedora en un host Ubuntu, por ejemplo, pero no se puede ejecutar otros sistemas operativos  (Ni BSD, OSX o Windows).
  • No hay interfaz gráfica (GUI) para configuración; todo a mano y con editor de texto.
  • Hay poca documentación en cuanto a instalar y configurar un contenedor.
  • Configurar un contenedor requiere habilidad y conocimiento técnico modesto, pero no es imposible.

Se estarán preguntando ¿para qué corno necesito varios linux virtualizados…? si no puedo con uno solo!!

Bueno, en mi caso, me hice 3 contenedores. Un webserver donde tengo mi wiki personal y voy probando diferente software, un server de compilación (ya que no me gusta tener miles y miles de paquetes “dev” en mi desktop) y un servidor para probar Xrdp, ya que hago muchos cambios a nivel escritorio, recompilación de xrdp, testeo de teclado, etc.

Bien podría hacer todo esto en mi desktop… pero dado que las herramientas están ahí y me gusta investigar… este es el resultado.

Preparación del Host

Voy a utilizar un equipo con Ubuntu 11.04 Natty Narwhal, que tiene kernel 2.6.38-8-generic de 64bits.

Para este caso vamos a necesitar instalar algunos paquetes: lxc, debootstrap y bridge-utils

$ sudo apt-get install lcx debootstrap bridge-utils

Eso debería bastar para instalar todas las dependencias.

Luego hace falta crear una nueva carpeta cgroup

$ sudo mkdir /cgroup

y agregar una entrada en el archivo /etc/fstab de la siguiente manera:

none    /cgroup cgroup defaults 0 0

Network Bridge

En mi caso tengo dos interfaces de red:

  • eth0 está en la red 192.168.1.0/24 y es gestionada por Network-Manager
  • eth1 está en la red 192.168.0.0/24 y es gestionada por archivo interfaces.

Cada interfaz está conectada a un router diferente. Es un esquema como este:

Mi caso es bastante particular, así que como la mayoría dispone sólo de una interfaz, tendrían que desinstalar Network-Manager y gestionar la red a la antigua: a través del archivo /etc/network/interfaces.

Al editar ese archivo les deben quedar las siguientes líneas:

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 192.168.0.3
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns1 192.168.0.1
bridge_ports eth1
bridge_stp off
bridge_maxwait 5
post-up /usr/sbin/brctl setfd br0 0

Fijense que uso mi segunda placa eth1 para ponerla en modo bridge (la segunda está conectada al segundo router, la LAN de trabajo). Hecho esto, podemos reiniciar y verificar que tenemos acceso a internet, a los recursos de red, y que nada a fallado.

Preparación del Container

Ahora comienza el trabajo duro. Hay que crear el archivo de configuración de nuestro contenedor. Generalmente se puede colocar dentro de /etc/lxc, pero puede ir en cualquier lugar que gusten. El archivo se llamará webserver.conf

lxc.utsname = webserver
lxc.tty = 4
lxc.pts = 1024
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.mtu = 1500
lxc.network.ipv4 = 0.0.0.0
lxc.network.hwaddr = 08:00:27:48:00:01
lxc.rootfs = /home/lxc/webserver/rootfs
lxc.mount  = /home/lxc/webserver/fstab
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
#lxc.cgroup.devices.allow = c 4:0 rwm
#lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm

Para este ejemplo voy a mostrarles como monté el webserver.

La variable lxc.utsname es el nombre del contenedor: “webserver”. lxc.network.ipv4 y lxc.network.hwaddr figuran así (con ip 0.0.0.0 y MAC) dado que mi segundo router me brindará dhcp estático (la misma IP siempre según la MAC). Si ustedes configuran con una IP fija, hwaddr no hace falta.

Luego lxc.rootfs y lxc.fstab figuran en /home/lxc/webserver. Como mi /home está en una partición separada de /, me pareció lo ideal para aprovechar el espacio libre; pero bien podría estar en cualquier lado. En la documentación se menciona /var/lxc por ejemplo.

Ahora hace falta el archivo fstab para el contenedor, lo vamos a crear en /home/lxc/webserver/fstab:

none            /home/lxc/webserver/rootfs/proc         proc    nodev,noexec,nosuid 0 0
none            /home/lxc/webserver/rootfs/sys          sysfs defaults  0 0

Creamos los directorios si es necesario:

$ sudo mkdir -p /home/lxc/webserver/rootfs/

Creando rootfs

En /usr/lib/lxc/templates vamos a encontrar diferentes scripts que nos permitirán crear/descargar las diferentes versiones que queramos tener en nuestro contenedor, en este caso usaremos el script lxc-natty. Ejecutamos:

$ sudo lxc-natty -p /home/lxc/webserver

Esperamos a que finalice el proceso de copiado y descarga y ya podremos crear el contenedor y arrancarlo:

$ sudo lxc-create -n webserver -f /etc/lxc/webserver.conf
$ sudo lxc-start -d -n webserver

Si todo ha salido bien, ya debemos tener corriendo nuestro webserver.

Vamos a acceder usando lxc-console y a verificar que tiene la IP que definimos (sea dhcp o fija)

$ sudo lxc-console -n webserver

Vemos como cambia el prompt y ya podemos operar con nuestro contenedor. El usuario es root y la contraseña root.

A mi me ha pasado que no toma ip, por lo que tuve que agregar dhclient eth0 al archivo /etc/rc.local. Hecho esto, solo reinicié el contenedor con reboot y ya comenzó a tomar la IP correspondiente.

Una vez que verificamos que tenemos IP válida en nuestro contenedor ya podemos acceder por ssh (lo instala por default).

Autoarranque

En Ubuntu, dentro de /etc/default/ existe un archivo de texto plano “lxc
Este archivo contiene:

# Comment out to run the lxc init script
RUN=yes
# Directory containing the container configurations
CONF_DIR=/etc/lxc
# Start /etc/lxc/example.conf, /etc/lxc/autostart.conf, etc.
CONTAINERS="webserver"
#MIRROR="http://archive.ubuntu.com/ubuntu"

Donde la línea CONTAINERS llevará los nombres de los contenedores, separados por un espacio, que queremos arranquen automáticamente al bootear la PC.

Conclusión

Hecho. Ya tenemos nuestro contenedor listo para empezar a instalar lo que necesitemos: Apache, MySQL, PHP, Java, Ruby, etc, etc.

Enlaces

http://blog.bodhizazen.net/linux/lxc-linux-containers/

http://lxc.teegra.net

http://blog.screv.com/?p=171

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

Archivos

junio 2011
D L M X J V S
« May   Jul »
 1234
567891011
12131415161718
19202122232425
2627282930  
A %d blogueros les gusta esto: