Wednesday, February 7, 2007

¿QUIÉN ES QUIÉN EN VIRTUALIZACIÓN? PARTE II. LA VIRTUALIZACIÓN EN LINUX.

Hola de nuevo a todos/as,

Siguiendo con la serie de artículos sobre virtualización, hemos llegado al segundo, en el que toca hablar sobre virtualización en Linux.
Aquí me centraré exclusivamente en la tecnología de virtualización en Linux, como trabaja internamente, y qué bondades ofrecen todas estas tecnologías.
Si bien no será hasta el 3º artículo donde veremos una comparativa detallada de qué ofrecen unos respecto a otros, aquí ya veremos los puntos fuertes de la virtualización bajo Linux.

A día de hoy, son muchas las posibilidades y programas disponibles en el mundo de Linux, relativos a virtualización.

De hecho, por la propia naturaleza libre y abierta del kernel de Linux (ains, que bien suena), es muy fácil poder encontrar muchos otros aplicativos para Linux que no figuren aquí (sí vamos, aplicaciones hechas por un mega-friki que saburre mazo y decide ponerse a picar código por su cuenta y riesgo pá sacar un programita con el que puedas correr un Windows sobre un Linux... jejeje)

Por tanto, trataremos aquí los más conocidos y utilizados en la actualidad.

Pues nada, sin más dilación, vamos a ello. Entremos en harina.
(BIENVENIDO A MATRIX BAJO LINUX, LA VERSIÓN DE MATRIX DE CÓDIGO ABIERTO)
Hypervisor Vs LinuxBased
Algunas tecnologías de virtualización están íntegramente basadas en la tecnología hypervisor (por ejemplo Xen y L4Linux), mientras que otras usan Linux como base para la plataforma virtualizada (por ejemplo KVM). Antes de responder a la cuestión obvia -¿Cuál es mejor, hypervisor o Linux based?- he aquí una pequeña explicación de la diferencia.
Cómo funcionan las cosas
En un sistema GNU/Linux normal -no virtualizado-, el núcleo se encarga de controlar el hardware y todos los procesos que se ejecutan en el sistema. En la virtualización basada en Linux (Linux Based), las máquinas virtuales se gestionan de forma muy similar a los procesos normales del sistema. No obstante, si se desea, el núcleo puede ser modificado para tratarlas de forma ligeramente diferente al resto de procesos, dándoles por ejemplo una prioridad diferente en el planificador o manteniéndolas siempre en memoria, pero básicamente podría decirse que tienen bastante similitud con los procesos.
Los sistemas basados en hypervisor como Xen, no dejan a Linux pleno control sobre el hardware. Es un pequeño fragmento de software, el hypervisor, el que controla ciertas partes del sistema, a saber:
  • Programación del tiempo de CPU.
  • Asignación de memoria física y protección de memoria entre máquinas virtuales.
  • Encaminamiento de interrupciones.
  • Conservación de estado guardado.
  • Intercambio de mensajes entre máquinas virtuales.

En el caso de Xen, normalmente una de las máquinas virtuales es la que se hace cargo del resto de cuestiones relacionadas con el hardware, tales como drivers para discos, tarjetas de red, de video, etc. Las demás máquinas virtuales se comunican con esa primera máquina virtual privilegiada (domain 0) para manipular sus dispositivos virtuales. Un hypervisor puede entenderse como una especie de microkernel.


En ambos casos, existen un gran número de ventajas y desventajas para cada uno de ellos, a saber:


Ventajas de Hypervisor

  • El sistema está controlado por un pequeño fragmento de software, lo suficientemente pequeño para ser auditado por cuestiones de seguridad.


- IMPORTANTE: en la práctica, el código que se almacena en domain 0 necesita también ser auditado, de modo que el software no es definitivamente tan pequeño.

  • El hypervisor utiliza un espacio pequeño de direcciones virtuales, detalle importante en sistemas de 32 bits.

  • Es posible ejecutar exactamente el mismo núcleo en el Sistema Operativo huésped (domain 0), y en los Sistemas Operativos invitados.

- IMPORTANTE: Esta ventaja está desapareciendo con coopvirt o la infraestructura paravirt ops.

  • Puede usarse el mismo hypervisor para múltiples Sistemas Operativos.

-EJEMPLO: emplear Linux o FreeBSD como SO huésped, con el mismo software de virtualización.

-IMPORTANTE: también puede hacerse con VMI o un interfaz coopvirt limpio, sin necesidad de un hypervisor.

  • El hypervisor ofrece un nivel adicional de seguridad para aislar a unos invitados de otros.


Ventajas de los sistemas Linux based

  • El software de virtualización puede ser más pequeño, porque comparte más funcionalidades con el núcleo de Linux.

  • De hecho, funcionalidades del SO de muy bajo nivel como kexec+kdump se ejecutan perfectamente, sin necesitar soporte en el hypervisor.


-Esto incluye aspectos tan importantes como el escalado de frecuencia en la CPU, o la función suspender/recuperar en los portátiles, que actualmente no funcionan en Xen.

  • Lo mismo ocurre para otro soporte de hardware que necesitaría soporte de hypervisor como pmtimer o algunas funcionalidades de ACPI.

  • Ubicuidad: una vez que la tecnología de virtualización basada en Linux esté en el núcleo principal (kernel.org), podrá ser habilitada de forma muy sencilla para todas las distribuciones de Linux.
  • Memoria Virtual. Un hypervisor como Xen, administra únicamente la memoria física. Por el contrario, si se ejecuta bajo el Kernel de Linux, es posible la paginación en Memoria Virtual así como la sobreescritura.


Proyectos de virtualización relacionados con Linux

Una vez hemos visto a grandes rasgos en qué consisten dos de los tipos de virtualización sobre Linux, vamos a pasar a estudiar uno por uno el software existente actualmente.
En la Tabla 1, podemos ver una lista de las tecnologías disponibles actualmente. En ella, aparecen las diferentes posibilidades de virtualización en Linux, muchas de ellas soluciones de código abierto.

Tabla 1. Proyectos de virtualización relacionados con Linux

Dicho esto, veamos como funciona cada una de ellas.

Emulación

Bochs (emulación)

Bochs simula un ordenador x86, es portable y se ejecuta sobre diferentes plataformas, incluyendo x86, PowerPC, Alpha, SPARC y MIPS. El interés de Bochs, es que no solo emula el procesador, sino el ordenador entero, incluyendo los periféricos como el teclado, ratón, hardware gráfico, adaptadores de red, etc.

Bochs puede configurarse como un antiguo Intel 386, o sucesores como el 486, Pentium, Pentium Pro, o una variante de 64 bits. Incluso emula instrucciones gráficas opcionales como MMX y 3DNow.

Utilizando el emulador Bochs, puedes ejecutar cualquier distribución Linux en Linux, Microsoft Windows 95/98/NT/2000 (y una variedad de aplicaciones) en Linux, incluso los sistemas operativos BSD (FreeBSD, OpenBSD, etc...) sobre Linux.

QEMU (emulación)

QEMU es otro emulador, como Bochs, pero tiene algunas diferencias interesantes. QEMU soporta dos modos de operación:
1.- Modo de emulación de sistema completo. Este modo es similar a Bochs, ya que emula todo un ordenador personal (PC) con su procesador y periféricos. Este modo emula varias arquitecturas, como x86, x86_64, ARM, SPARC, PowerPC y MIPS, con velocidad razonable utilizando traducción dinámica. Utilizando este modo, es posible emular los sistemas operativos Windows (incluyendo XP) y Linux sobre Linux, Solaris y FreeBSD. Tambien soporta otras combinaciones de sistemas operativos (para obtener más información consultar aquí).

2.- Modo User Mode Emulation. En este modo, que sólo puede ser alojado en Linux, puede lanzarse un binario para una arquitectura diferente. Esto permite, por ejemplo, que se ejecute en Linux sobre x86 un binario compilado para la arquitectura MIPS. Entre las arquitecturas soportadas por este modo se encuentran ARM, SPARC, PowerPC y otras que están en desarrollo.
En esta web tienes una guía detallada de cómo realizar la instalación en Linux.
Virtualización completa

VMware (virtualización completa)

VMware es una solución comercial para la virtualización completa. Tal y como expliqué en el artículo anterior (Historia de la virtualización), se trata de un sistema basado en hypervisor, que funciona como capa de abstracción entre los sistemas operativos alojados y el hardware.
Esta capa de abstracción permite que cualquier sistema operativo se ejecute directamente sobre el hardware, desapareciendo la necesidad de que deba existir otro sistema operativo alojado con un software de virtualización instalado sobre el cual se ejecuten las máquinas virtuales (como ocurre con Microsoft Virtual Server 2005 R2, por citar un ejemplo).

VMware también virtualiza el hardware de entrada/salida disponible, y para dispositivos de alto rendimiento, usa los drivers que se encuentran en el hypervisor.

El entorno virtualizado completo se respalda en un fichero, lo que significa que un sistema completo (incluyendo el sistema operativo alojado, la máquina virtual y el hardware virtual) puede migrarse con facilidad y rapidez a una nueva máquina anfitrión para balancear la carga.
Además, VmWare permite realizar todas estas opciones en caliente estando el sistema arrancado, sin necesidad de interrumpir el servicio, y lo hace de forma totalmente transparente y automatizada (aunque todo esto es completamente configurable).

z/VM (virtualización completa)

Aunque el IBM System z estrena nombre, realmente tiene una larga historia que se origina en la decada de 1960. El System/360 ya soportaba virtualización utilizando máquinas virtuales en 1965. Es interesante observar que el System z mantiene la retrocompatibilidad hasta la antigua línea System/360 (para más información consultar el artículo anterior, Historia de la virtualización).

En el System z, se utiliza como hypervisor del sistema operativo a z/VM. En su interior está el Programa de Control (CP - Control Program), que proporciona la virtualización de los recursos físicos a los sistemas operativos alojados, incluyendo Linux (ver Imagen 1). Esto permite que varios procesadores y otros recursos sean virtualizados para un número de sistemas operativos alojados.

Imagen 1. Virtualización a nivel de SO utilizando z/VM



z/VM también puede emular una LAN virtual, para aquellos sistemas operativos hospedados que quieren comunicarse entre sí. La emulación se realiza por completo en el hypervisor, con lo que se obtiene una gran seguridad.

Paravirtualización

Xen (paravirtualización)

Xen es la solución de código abierto proporcionada por XenSource para obtener paravirtualización a nivel de sistema operativo. Es importante recordar, que en la paravirtualización el hypervisor y el sistema operativo colaboran en la virtualización, lo que implica que se requieran cambios en el sistema operativo, pero como resultado se obtiene un rendimiento próximo a la ejecución nativa. Una vez más, puede consultarse el artículo anterior para más información detallada en concreto sobre paravirtualización.

Debido a que Xen precisa colaboración (modificaciones en el sistema operativo alojado), solo pueden virtualizarse en Xen sistemas operativos parcheados.
Desde el punto de vista de Linux, que es de código abierto, se trata de un compromiso razonable porque se consigue un mejor rendimiento que con la virtualización completa.
Pero desde el punto de vista de un soporte amplio (que incluya otros sistemas operativos que no sean de código abierto), se trata de un claro inconveniente.

No obstante, es posible ejecutar Windows como SO alojado en Xen, pero solo en sistemas hardware que soporten la tecnología Vanderpool de Intel o Pacifica de AMD. Otros sistemas operativos soportados por Xen son: Minix, Plan 9, NetBSD, FreeBSD y OpenSolaris.

User-mode Linux (paravirtualización)

User-mode Linux (UML) -que no el lenguaje UML, cuidaó, que no tié en absoluto ná que ver, ya se sabe que dos tazas de té no son ni mucho menos lo mismo que dos te..ta..z..zz..zzzz... PUES ESO- permite que un sistema operativo Linux ejecute otros sistemas operativos Linux en el espacio del usuario.
Cada sistema operativo Linux alojado, existe como un proceso en el sistema operativo Linux anfitrión (ver Figura 6), lo cual permite a varios núcleos Linux (con sus propios espacios de usuario asociados), ejecutarse en el contexto de un solo núcleo Linux.



Imagen 2. Alojamiento de Linux en User-mode Linux


Desde el núcleo Linux 2.6, UML se encuentra en la rama principal del núcleo, pero debe ser activado y recompilado antes de utilizarse. Estos cambios proporcionan, entre otras cosas, virtualización de dispositivos. Esto permite a los sistemas operativos alojados compartir los dispositivos físicos disponibles, como los dispositivos de bloques (floppy, CD-ROM, y sistemas de ficheros), consolas, dispositivos NIC, hardware de sonido y otros.


Dado que los núcleos alojados se ejecutan en el espacio del usuario, deben estar compilados para este uso (aunque puede tratarse de diferentes versiones del núcleo). Existirá un núcleo anfitrión (que se ejecutará sobre el hardware) y uno o varios núcleos alojados (que se ejecutarán en el espacio de usuario del núcleo anfitrión). Es posible anidar estos núcleos, de manera que un núcleo alojado actúe como anfitrión de otro.

Virtualización a nivel de sistema operativo

Linux-VServer (virtualización a nivel de sistema operativo)

Linux-VServer es una solución de virtualización a nivel de sistema operativo. Su misión virtualizar el núcleo Linux, de modo que varios entornos de espacio de usuario, también llamados Virtual Private Servers (VPS), se ejecuten de foma independiente sin tener conocimiento del resto. El aislamiento del espacio de usuario se consigue gracias a diferentes modificaciones del núcleo Linux.


Para aislar cada uno de los espacios de usuario del resto, es necesario entender el concepto de qué es un contexto. Un contexto es un contenedor para los procesos de un VPS, de forma que herramientas como ps solo muestran información sobre los procesos del VPS. Para el arranque inicial, el núcleo define un contexto por defecto. Tambien existe un contexto espectador para la administración (esto puede saberse viendo todos los procesos en ejecución). Como puede suponerse, tanto el núcleo como las estructuras internas de datos se han modificado para dar soporte a esta técnica de virtualización.


Con Linux-VServer, también se utiliza un tipo de chroot para aislar el directorio raíz de cada VPS. No debe olvidarse que una chroot permite que se especifique un nuevo directorio raíz, además de que se utilizan otras funciones (llamadas Chroot-Barrier) para que un VPS no pueda escapar de su "aislamiento" en el directorio raíz. Cada VPS cuenta con su propia raíz y lista de usuarios y contraseñas.


Linux-VServer está soportado en los núcleos Linux v2.4 y v2.6, pudiendo funcionar sobre diferentes plataformas: x86, x86-64, SPARC, MIPS, ARM y PowerPC.


OpenVZ (virtualización a nivel de sistema operativo)

OpenVZ es otra solución de virtualización a nivel de sistema operativo, como Linux-VServer, pero tiene algunas diferencias importantes.

OpenVZ es un núcleo modificado para la virtualización, que soporta espacios de usuario aislados, VPS, con un conjunto de herramientas de usuario para la administración. Por ejemplo, es fácil crear un nuevo VPS desde la línea de comandos:

$ vzctl create 42 --ostemplate fedora-core-4
Creating VPS private area
VPS private area was created
$ vzctl start
42
Starting VPS ...
VPS is mounted


También pueden listarse los VPSs creados con vzlist, que funciona de manera similar al comando ps.


Para planificar los procesos, OpenVZ utiliza un planificador de dos niveles. En primer lugar, se determina qué VPS debe obtener la CPU. Después, el segundo nivel del planificador escoge el proceso a ejecutar basándose en las prioridades estándar de Linux.

OpenVZ también incluye los llamados beancounters. Un beancounter, consiste en un número de parámetros que definen la distribución de recursos para un VPS. Esto proporciona cierto nivel de control sobre un VPS, definiendo la cantidad de memoria y el número de objetos para la comunicación entre procesos (IPC -Inter Process Communication-) disponibles.


Una característica única de OpenVZ, es la habilidad de establecer un punto de control y migrar un VPS desde un servidor físico a otro. Establecer un punto de control significa que el estado de un VPS en ejecución se congela y se guarda en un fichero. Este fichero puede llevarse a un nuevo servidor para restaurar la ejecución del VPS.


Entre las arquitecturas soportadas por OpenVZ se encuentran: x86, x86-64 y PowerPC.


Linux KVM (Kernel Virtual Machine)

Las notícias más recientes que provienen de Linux son la incorporación de KVM en el núcleo (2.6.20). KVM es una completa solución de virtualización única, al convertir al núcleo Linux en un hypervisor utilizando un módulo del núcleo.

Este módulo permite a otros sistemas operativos alojados ejecutarse en el espacio de usuario del núcleo Linux anfitrión (ver Imagen 3). El módulo KVM en el núcleo, expone el hardware virtualizado a través del dispositivo de caracteres /dev/kvm. El sistema operativo alojado, se comunica con el módulo KVM utilizando un proceso que ejecuta un QEMU modificado para obtener la emulación de hardware.

Imagen 3. Virtualización con Kernel Virtual Machine (KVM)


El módulo KVM introduce un nuevo modo de ejecución en el núcleo. Así como el kernel vanilla (standard) aporta el modo kernel y el modo user, KVM aporta el modo guest. Este modo es utilizado para ejecutar todo el código del huésped en el que no se utiliza entrada/salida, y el modo normal de usuario proporciona la entrada/salida para los huéspedes.


La tecnología KVM, supone una interesante evolución de Linux, ya que es la primera tecnología de virtualización que pasa a formar parte del propio núcleo Linux. Existe en la rama 2.6.20, pero puede utilizarse como un módulo del núcleo en la versión 2.6.19. Cuando se ejecuta en hardware que soporta la virtualización es posible hospedar a Linux (32 y 64 bits) y Windows (32 bits).


Entonces, ¿cuál es el mejor?

Decidir cuál de todas estas tecnologías es mejor depende totalmente de cuales sean tus objetivos. Para un administrador de Linux (¡¡¡hola Linus!!!) resulta mucho más sencillo si el software es ligero, simple y está integrado enteramente dentro del núcleo. Los interfaces a un hypervisor externo implican una interdependencia extra con otro proyecto.


Para usuarios finales, la funcionalidad será probablemente mucho más importante que la tecnología subyacente. Será útil en la medida que la tecnología de virtualización sea más eficiente, fácil de manejar y su inclusión e integración por defecto en el sistema (Windows Longhorn, por ejemplo, está previsto que integre nativamente la nueva solución de virtualización de Microsoft basada en hypervisor, pero esto es algo que veremos en los artículos posteriores) . Los usuarios finales probablemente estén muy interesados en conocer la tabla comparativa de virtualización de Linux.

En resumen, cabe destacar que cualquier tecnología que entre dentro del núcleo principal (kernel.org) y satisfaga todas las necesidades técnicas del usuario, será definitivamente la que consiga ser masivamente utilizada. Por suerte o por desgracia, la disponibilidad práctica triunfa siempre sobre las ventajas teóricas.


Una vez hemos visto en detalle la gran mayoría de las tecnologías más importantes de virtualización bajo Linux, finalmente voy a hablaros del último software de virtualización en el mundo de Linux.


El invento en cuestión se hace llamar "VirtualBox", y es de la empresa Innotek, una empresa con sede en Alemania, la que lo está desarrollando.

Una vez más, VirtualBox es un software de virtualización de sistemas operativos para Windows y Linux, que permitirá realizar de la misma forma que consiguen otros proyectos comerciales, la virtualización de sistemas operativos desde la persepectiva del código abierto… o al menos en parte, pues parece ser que se lanzarán dos versiones una, personal, que será completamente Open Source, y otra más orientada al mundo corporativo, que si bien está previsto que por el momento sea gratuita, no se dispondrá de acceso al código (¿Close Source?). Su tecnología básicamente está basada en el uso de un hypervisor, con lo que su rendimiento es realmente rápido.

El paquete VirtualBox soporta Windows (incluyendo Vista), Linux, OS/2, OpenBSD, y FreeBSD como sistemas operativos virtualizados.
No obstante, existe también una versión para Windows, además de poder instalarse sobre Linux.

Para calmar el ansia de saber como será el tan "bien-sonante" VirtualBox, os dejo una pequeña captura con Windows Vista, extraída de la sección de capturas de la web oficial, que es bastante extensa. También os dejo los links de descarga y más información sobre el programa.

Sitio oficial VirtualBox

Descarga VirtualBox

Imagen 4. Windows Vista ejecutándose sobre Virtual Box bajo Linux.

En conclusión, y para terminar ya con este segundo artículo (II de IV), parece que los sistemas de virtualización de sistemas operativos cada vez se hacen más populares.

Después de la aparición de Parallels y con el mercado copado por VMWare, vemos alternativas en el terreno Open Source bastante prometedoras para este tipo de programas, que cada vez son mejores y más útiles.

Según dicen en TUAW, una versión para Mac OS también está en desarrollo, pero en fase pre-alfa, así que por el momento nos tocará esperar. :((((

De todas formas, como ya sabéis, tanto de los productos más extendidos de virtualización en el mercado, como de la virtualización bajo Mac OS, hablaré en los sucesivos artículos. Así que paciencia, que en breve los publicaré.


Links


Aprendizaje


- http://www.kriptopolis.org/virtualbox-virtualizacion-gpl --> Tutorial muy bueno en que se explica el uso de VirtualBox sobre Linux, desde la instalación hasta la puesta en funcionamiento.

En concreto, en el tutorial se explica la instalación de una máquina virtual con "Windows Fundamentals", una versión "capada" de XP.


http://www.kriptopolis.org/virtualbox-ii-windows-fundamentals-bajo-linux --> Parte II del mismo tutorial anterior.


- En la zona developerWorks Linux pueden encontrarse más recursos para desarrolladores Linux.

- Para estar al día --> developerWorks technical events and webcasts.

Productos y tecnologias

- Bochs y QEMU son emuladores de PC que permiten que sistemas operativos como Windows o Linux se ejecuten en el espacio de usuario de un sistema operativo Linux.

- VMware es una solución comercial popular que proporciona virtualización completa y puede virtualizar sistemas operativos sin modificar.

- z/VM es el sistema operativo VM más nuevo para la arquitectura z/Architecture de 64 bits. z/VM proporciona virtualización completa con asistencia de hardware y soporta un amplio abanico de sistemas operativos, incluido Linux.

- Xen es una solución de código abierto para la paravirtualización, que requiere modificaciones a los sistemas operativos hospedados pero, al colaborar con el hypervisor, alcanza rendimientos próximos a la ejecución nativa.

- User-mode Linux es otra solución de código abierto para la paravirtualización. Cada sistema operativo huésped se ejecuta como un proceso del sistema operativo anfitrión.

- coLinux, o Cooperative Linux, es una solución de virtualización que permite a dos sistemas operativos compartir de forma cooperativa el hardware subyacente.

- Linux-Vserver es una solución de virtualización a nivel de sistema operativo para los sistemas GNU/Linux que aisla de forma segura a los servidores hospedados.

- OpenVZ es una solución de virtualización a nivel de sistema operativo que soporta puntos de control y migración de VPSs en caliente.

- Linux KVM es la primera tecnología de virtualización que ha sido capaz de integrarse en la línea principal de producción del núcleo Linux. Con solo un módulo del núcleo, un núcleo Linux que se ejecute sobre hardware con soporte para la virtualización es capaz de actuar como hypervisor y soportar sistemas operativos Linux y Windows sin modificar como huéspedes.

- Con IBM trial software, disponible para descarga directa desde developerWorks, se puede construir un proyecto sobre Linux


Espero no haber sido muy coñazo, y que os haya resultado de vuestro interés.

Nos vemos en el capítulo 3, en el que atacaremos a todo Cristo: VmWare, Virtual PC/Virtual Server, Virtuozzo (jajaja... má que cosa, andiamo andiamo, italianini él), Qemu,....

To be continued....

Hasta pronto!!

(LE AGRADECEMOS ENCARECIDAMENTE QUE HAYA ACCEDIDO A MATRIX BAJO LINUX, LA VERSIÓN DE MATRIX DE CÓDIGO ABIERTO)

1 comment:

Paco said...

muy buenas explicaciones, necesito saber algo, hay algun software en linux que permita virtualizar y compartir recursos fisicamente a otros sistemas operativos virtualizados?? ejemplo, tengo un RHEL5 base y tengo 2 sistemas virtualizados, tengo 2 tarjetas de red y una de telefonia, y quiero saber si se puede asignar a un sistema virtualizado una tarjeta de red y una de telefonia?