Virtualizando GNU/Linux con VServer

En estos días es más y más común tener computadoras con muchos recursos (memoria ram, discos duros, procesadores). La virtualización permite simular a varias computadoras y/o sistemas opertivos en un mismo hardware.

Un poco de teoría - Porque VServer?

Existen muchos métodos de virtualizar un sistema operativo, con los mismos resultados, el poder simular varias computadoras en un solo hardware. El método más común (y mas costoso) es el de simular todo el hardware real o ficticio (Qemu, VirtualBox, etc). Su popularidad está basada a que ni el sistema operativo anfitrión ni el huésped necesita ninguna modificación.

Otro método utilizado para virtualizar consiste en pequeños drivers aplicados al anfitrión o húesped para miniminizar el trabajo adicional de simular el hardware para el húesped. Apesar del gran mejora aún se desperdicián recursos en la mediación entre el anfitrión y el huesped Las más populares implementaciones son UML y XEN.

La gran mayoría de las veces no se dese tener maquinas virtuales con sistemas operativos distintos, sino solo tener varias instancias de del mismo sistema operativo huésped, ya que la gran mayoría de las veces las aplicaciones no necesitan acceso directo al hardware o al kernel del sistema operativo. Para esa opción se puede usar el “chroot” de unix, pero también se puede obtener una solución más avanzada como ser VServer.

Para más detalles de la implementación de VServer pueden leer este Paper de su implementación (muy interesante)

Instalando VServer

Algunas personas critican a VServer porque el huésped necesita tener un kernel Linux “patcheado”, cosa que me parece críticas sin fundamentos, porque compilar el kernel es un juego de niños, con unos cuantos comandos y ~20 minutos (dependiendo del hardware) tendremos nuestro kernel listo para la virtualización. Para ello hay que bajar el patch necesario para la versión del kernel que se desea utilizar de la página de VServer.

wget "http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.19.tar.bz2"
wget "http://ftp.linux-vserver.org/pub/kernel/vs2.2/patch-2.6.22.19-vs2.2.0.7.diff"
tar xfvj "linux-2.6.22.19.tar.bz2"
cd "linux-2.6.22.19"
patch -p1 < "../patch-2.6.22.19-vs2.2.0.7.diff"

Ahora ya tenemos preparado nuestro kernel, solo tenemos que configurarlo y compilarlo. El kernel viene con varias aplicaciones que facilitan su configuración, yo uso el menuconfig, pero existe varias otras opciones (make help ayudaría)

make menuconfig

Configuring the kernel

Si puede ven en la lista principal VServer significa que “parchearon” correctamente su kernel, ahora tienen que elegir las opciones de VServer, aqui estan las opciones con las que compilé mi kernel (el Dynamic context id no me funcionó…)

Configuring the kernel

Luego también puede personalizar su kernel sacando lo que no hace falta, y agregando atras necesarias que no estan incluidas por defecto. Una vez configurado el kernel hay que compilarlo (make help para mas info)

#compilamos todo
make all
#instalamos
make install
#reiniciamos
reboot

Luego si el sistema operativo inicia bien, ya terminamos con la parte mas complicada (que no es complicado) del proceso de instalación de VServer, ahora tenemos que instalar algunos utilitarios que nos ayudaran para crear a los huéspedes. Si son “redhateros” pueden hacer lo siguiente:

yum install util-vserver* -y

O si usan debian (no probé personalmente)

apt-get install util-vserver\*

Una vez instalado las aplicaciones *-vserver y con el kernel nuevo tenemos que testear si todo nos fue bien, para eso podemos hacer lo siguiente:

wget http://vserver.13thfloor.at/Stuff/SCRIPT/testme.sh
chmod +x testme.sh
./testme.sh

Si todo esta funcionando correctamente tendras que ver algo similar a esto:

Creando a los huespedes

Antes que nada existen varias formas de crear máquinas huésped, yo utilizo Yum para instalar los paquetes necesarios para el la distro huésped, para utilizar yum, necesita ser recompilado con un patch.

#!/bin/bash
NAME=virt01
HOSTNAME=virt01.foo-bar.com
#
ROOTDIR="/virtual/"
PKGBASE=$ROOTDIR/.pkg
VSERVER=$HOSTNAME
IP="eth0:192.168.1.106/24"
INTERFACE=$NAME
CONTEXT="43"
# por defecto VServer solo soporta hasta FC6,
# mas adelante escribiré como instalar versiones posteriores
# de Fedora
DIST="fc6"
PM="yum" 

/usr/sbin/vserver $VSERVER build -m $PM --context $CONTEXT --hostname=$HOSTNAME \
--interface $INTERFACE=$IP --rootdir $ROOTDIR --pkgbase $PKGBASE -- -d $DIST

Ahora tenemos una maquina huésped, y para comenzar a jugar con

#para iniciar la máquina virtual
vserver $NAME start
#para "entrar" a la máquina virtual
vserver $NAME enter
#para detener la máquina virtual
vserver $NAME stop
# ejecuta "something" en la máquina virtual
vserver $NAME exec something
# instalar algo en la máquina virtual
vyum $NAME -- install algo
# te queda la curiosidad?
man vserver

Algunas peculiaridades del VServer

VServer no cuenta con aislamiento de red, en vez de la virtualización, lo que en otras palabras significa que si la máquina huésped y el anfitrión utilizan una misma tarjeta pero diferentes IP, en realidad el IP de la máquina huésped es un Alias del IP del host. Claro que desde el huésped (por seguridad) solo se puede ver su IP. Esto es una gran punto a favor en rendimiento, ya que no hay desperdicios de tiempo en el CPU para la virtualización de los paquetes de red.

Sin embargo no todo es tan bueno, ya que generalmente los servicios que escuchan puertos, escuchan utilizando 0.0.0.0 (escucha en todo los IPs y alias de la máquina). Si que queremos tener httpd (o cualquier otro progama) instalado en el anfitrión y el huésped tenemos que fijarnos que desde el anfitrión no escuche desde el IP 0.0.0.0, para ver esto solo pueden ejecutar:

$ netstat -nlp | grep httpd
tcp        0      0 0.0.0.0:80                0.0.0.0:*                   LISTEN      2400/httpd

Si la httpd-anfitrión escucha 0.0.0.0:80, todas las consultas que le hagamos a nuestro httpd-huésped serán recibidas y procesadas por el http-anfitrión (por lo explicado anteriormente). Para solucionar el conflicto tendremos que forzar al httpd-anfitrión que escuche el IP-anfitrión. Si configuramos todo correctamente tendremos que ver algo similar a esto.

$ netstat -nlp | grep httpd
tcp        0      192.168.1.14:80                0.0.0.0:*                   LISTEN      2400/httpd

Debemos repetir el mismo proceso para cada aplicación que escucha el IP 0.0.0.0 y que queríamos ejecutar en el huésped y el anfitrión (eg: mysql, sshd, etc).

Lo que se viene

Conocí VServer gracias a que tuve la necesidad de virtualizar servidores en mi trabajo, y me encanto, ya que es muy similar a los Jails de FreeBSD, ademas que todo el filesystem del huésped es visto desde el anfitrión, ademas que las máquinas pueden compartir directorios entre si. Más adelante escribiré sobre como virtualizar servidores existentes, como instalar versiones más nuevas de Fedora, como forzar a vyum que lea desde el DVD de Fedora en vez de internet, esto es verdaderamente útil para instalaciones nuevas.

Espero que les haya gustado este introducción a VServer… espero sus comentarios con dudas o sugerencias.

3 Comments

  1. Pablito says:

    Para serte sincero por mas q me parezca increible poder emular una pc dentro de otra (y si quieren, dentro de otra) no tiene mucho sentido. Al menos no veo la aplicacion practica directa.

    La opcion de vserver la verdad no la conocia, cuando juego con otros OS suelo usar vbox directamente. Pero la verdad lo uso mas q nada para eso, para probar otros OS (diferentes sabores de linux en realidad) y nada mas…

    Igualmente no tengo q trabajar con servidores en este nivel (aun ;) ) asi q no me puedo imaginar q tipo de problemas pueda tener para q esto me parezca una solucion valida.

    De toda maneras, excelente la guia como siempre ;)

  2. Samuel Giubi says:

    Excelente Cesar!.-

    VServer es lo mejor que probé lejos, tuve problemas con X que seria lindo escribir intensamente sobre ello pero la estabilidad que brinda, es única, lo use en server file y me salvo una vida entera, aunque un amigo español lo quizo probar para experimentar red sobre ipv6 pero vserver no soporta aun :S

    La guia esta completisima, hay que decir que para usuarios ubuntu hay que instalar los build essential antes y el gcc maker

    Con respecto a lo de Pablito, no lo veo a vbox directamente “compitiendo” con vserver, es mas, muchas veces usare vbox nada mas y aca en el laburo (cosa que gracias a dios ya no se dio, y digo gracias que cuando lo use fue para salvarme la continuidad :P ), usaria 4vserver, las ventanas son alocadas, por dar un ejemplo, puedo virtualizar ya un servidor linux existente en mi red (rompe culos), aunque vbox tiene lo suyo, tiene otro target ;)

    Buenisimo Cesar!.-

  3. César Rodas says:

    virtualbox no es libre… prefiero Qemu! :P

    Y la idea de virtualizar usando VServer es sacarle el provecho máximo (y de paso ahorrar espacio :P) al hardware que existente actualmente.

    Otra idea puede ser correr servicios que suelen ser vulnerables a ataques en un VServer, ya que si alguien “hackea” la máquina huésped, el anfitrión queda sin ningún efecto.

Leave a Reply