Friday, February 2, 2007

¿QUIÉN ES QUIÉN EN VIRTUALIZACIÓN? PARTE I. HISTORIA DE LA VIRTUALIZACIÓN

El término “Virtualización” genéricamente hablando, puede tener diversos significados. Un aspecto candente en la virtualización es la virtualización de servidores, o como alojar múltiples sistemas operativos independientes (GUESTS) en un único ordenador anfitrión (HOST).
En este primer artículo, os explicaré qué se esconde detrás de la virtualización, y expondré algunas de las múltiples maneras de implementarla.

Dicho “grosso modo”, la palabra “virtualizar” significa aparentar que algo con una forma tiene otra. Como nuestro amigo Terminator (bueno amigo no, más bien enemigo, que era el malo de Terminator II, el que jugaba con la virtualización) aparentaba ser humano, cuando realmente era un Terminator (uuuu, que mal rollito…).

Ahora bien, en términos informáticos, virtualizar un ordenador significa aparentar que se tienen múltiples ordenadores o un ordenador completamente diferente.

Adicionalmente, también puede significar conseguir que varios ordenadores parezcan uno solo. A este concepto se le suele denominar agregación de servidores (server aggregation) o grid computing.

Dicho esto, comencemos pues con un poco de historia. Conozcamos los orígenes de la virtualización.

Historia de la virtualización
En primer lugar, es muy importante destacar que la virtualización no es ni mucho menos un tema nuevo. Sus orígenes más antiguos se remontan a 1960.

Los primeros usos de la virtualización incluyen el IBM 7044, el Sistema de Tiempo Compartido Compatible (CTSS - Compatible Time Sharing System) desarrollado en el Instituto Tecnológico de Massachusetts (MIT - Massachussets Institute of Technology) en el IBM 704. Cabe mencionar también el proyecto Atlas de la Universidad de Manchester (uno de los primeros superordenadores del mundo), que fue pionero en el uso de memoria virtual con paginación y llamadas de supervisor.

Virtualización de hardware
IBM reconoció la importancia de la virtualización en la década de 1960 con el desarrollo del mainframe System/360 Model 67. El Model 67 virtualizó todas las interfaces hardware a través del Monitor de Máquina Virtual (VMM - Virtual Machine Monitor). En los albores de la computación, el sistema operativo se llamó supervisor.
Cuando apareció la habilidad de ejecutar sistemas operativos sobre otro sistema operativo, se designó el termino hypervisor (termino acuñado en la década de 1970).

El VMM se ejecutaba directamente sobre el hardware subyacente, permitiendo múltiples máquinas virtuales (VMs). Cada VM podía ejecutar una instancia de su propio sistema operativo privado -que antiguamente era el CMS, o Conversational Monitor System-.

Con el paso de los años, las máquinas virtuales han continuado avanzando, y actualmente se pueden encontrar ejecutándose en el mainframe System z9. Además, todo esto proporciona compatibilidad con sistemas más antiguos, incluso hasta la línea System/360.

Virtualización del procesador

Java Virtual Machine (JVM)
El lenguaje Java ha seguido el modelo P-code en su máquina virtual. Esto ha dado la posibilidad de lograr una amplia distribución de programas Java sobre incontables arquitecturas, simplemente portando la JVM.

Otro de los usos iniciales de la virtualización, en este caso de un procesador simulado, es la máquina de pseudo-código (P-code machine). P-code es un lenguaje máquina que se ejecuta en una máquina virtual en lugar de en hardware real. P-code alcanzó la fama en la década de 1970 en el sistema Pascal de la Universidad de California, San Diego (UCSD), que compilaba programas Pascal en P-code (o pseudo-código), y luego los ejecutaba en una máquina virtual P-code. Esto permitió que los programas P-code fuesen muy portables y pudiesen ejecutarse en cualquier lugar donde estuviese disponible una máquina virtual P-code.

El mismo concepto se utilizó en la década de 1960 para el Basic Combined Programming Language (BCPL), un antepasado del lenguaje C. En este caso, un compilador compilaba código BCPL en un código máquina intermedio llamado O-code. En un segundo paso, el O-code era compilado en el lenguaje nativo de la máquina de destino. Este modelo se utiliza en los compiladores modernos, para proporcionar flexibilidad al portar los compiladores hacia nuevas arquitecturas destino (separando el front-end y el back-end por un lenguaje intermedio).

Virtualización del juego de instrucciones
La virtualización del juego de instrucciones, o la traducción binaria, es un aspecto nuevo. En este modelo, un juego de instrucciones virtual se traduce al juego de instrucciones físico del hardware subyacente, normalmente de forma dinámica. Cuando se va a ejecutar el código se realiza la traducción de una porción. Si se produce una ramificación (salto), se obtiene y traduce una nueva porción de código. Este proceso es similar a las operaciones que se realizan con memoria caché, donde bloques de instrucciones se mueven desde la memoria hasta una memoria caché local mucho más rápida antes de su ejecución.

La CPU Crusoe diseñada por Transmeta es un ejemplo reciente de este modelo. Esta arquitectura implementa traducción binaria bajo la marca registrada Code Morphing.

Un ejemplo similar es el análisis de código en tiempo de ejecución, utilizado en las soluciones de virtualización completa, que buscan y redirigen instrucciones privilegiadas (para evitar algunos problemas con ciertos juegos de instrucciones).

Tipos de virtualización

La virtualización y los juegos
Todo artículo sobre virtualización que se precie, no sería realmente bueno (que bien me vendo…) sin una referencia al gran e histórico emulador de emuladores, el MAME (Multiple-Arcade Machine Emulator). MAME, como su propio nombre indica, es un completo emulador de muchos juegos arcade antiguos, que seguro muchos de vosotros ya conocéis más que de sobra. Tetris, Super-Pang, Puzzle Booble, Snow Bross, Metal Slug (brutal), y en definitiva toda una serie de juegos gloriosos que jamás morirán, de los que ya no se hacen hoy en día. Sniff... sigamos...

Además de virtualizar los procesadores utilizados en esos juegos, se virtualiza la máquina completa, incluyendo el hardware de gráficos, sonido y controles. MAME es una gran aplicación (yo diría más que grande), y sería muy interesante revisar su código para entender el alcance de lo que ha logrado (sólo que está hecho por japonacas, y a ver quién es el guapo que entiende eso –sé que el chiste es malo, porque el lenguaje de programación no es japonés, pero bueno, la chorrada es buena y había que decirla-).
Unido a esto, debo confesar que conozco muchos casos perdidos, en los cuales MAME ha logrado conseguir adeptos capaces de tirarse horas y horas seguidas hasta terminarse un nuevo juego del que acaba de salir la ROM hace dos días, y hay que acabárselo, porque es un vicio y no se puede dejar. Se alimentan de bits, ya se sabe... Además, si se acaba la pasta, no pasa nada, se le da a la tecla 5 y echamos más 5 duros pá seguir viciándonos. Vaya tela……

No obstante, no existe una sola manera de realizar la virtualización. De hecho, existen diversas técnicas que alcanzan el mismo resultado a través de diferentes niveles de abstracción. Aquí presentaré tres de las técnicas de virtualización más comunes, identificando sus puntos fuertes y sus debilidades.

Por otra parte, los fabricantes de software y hardware algunas veces utilizan diferentes términos para describir el mismo método de virtualización. Yo emplearé el término más común, con referencias a otras denominaciones.

Emulación Hardware
La virtualización más compleja consiste en la emulación de hardware. Con esta técnica, en el sistema anfitrión fisico (HOST) se utiliza una máquina virtual que emula el hardware, como muestra la Imagen 1.

Imagen 1. La emulación de Hardware utiliza una máquina virtual (VM) para simular el hardware

Emulación y desarrollo

Uno de los usos más interesantes de la emulación hardware es el codesarrollo de firmware y hardware. En lugar de esperar hasta que el hardware real esté disponible, los desarrolladores del firmware pueden utilizar una máquina virtual del hardware para validar muchos detalles de su código en una simulación.


Como puede suponerse, el principal problema con la emulación hardware es que puede resultar terriblemente lenta. Ya que cada instrucción debe ser simulada por el hardware subyacente, no es extraño obtener una velocidad 100 veces más lenta. Si se pretende conseguir una emulación muy fiel que incluya precisión en los ciclos, simulación de los pipelines de la CPU, y comportamiento de caché, la diferencia de velocidad real puede ser 1000 veces más lenta.
Aparte de todo esto, la emulación de hardware tiene sus ventajas. Por ejemplo, es posible ejecutar un sistema operativo sin modificar diseñado para un PowerPC sobre una máquina física anfitrión con procesador ARM. Incluso es posible ejecutar múltiples máquinas virtuales, cada una simulando un procesador diferente.


Virtualización completa
La virtualización completa, también llamada virtualización nativa, es otra interesante técnica de virtualización.


Este modelo utiliza una máquina virtual que media entre el sistema operativo invitado y el hardware nativo (ver Imagen 2). "Mediar" es la palabra clave aquí, ya que la VMM está entre el sistema el sistema operativo invitado y el hardware real. Algunas instrucciones protegidas deben capturarse y manejarse dentro del hypervisor ya que el hardware subyacente no es propiedad de un sistema operativo sino que es compartido a través del hypervisor.

Imagen 2. La virtualización completa utiliza un hypervisor para compartir el hardware subyacente



“Hypervisores” en hardware antiguo

Parte del hardware antiguo, como el x86, crea problemas para la técnica de la virtualización completa. Por ejemplo, no se capturan ciertas instrucciones que deben ser manejadas por la VMM. Por lo tanto, los hypervisores deben revisar y capturar de forma dinámica el código en modo privilegiado para lidiar con este problema.


La virtualización completa es más rápida que la emulación hardware, pero el rendimiento es menor que cuando se utiliza hardware directamente, debido a la mediación del hypervisor. La gran ventaja de la virtualización completa es que un sistema operativo invitado puede ejecutarse sin modificaciones. La única restricción es que el sistema operativo invitado debe soportar el hardware subyacente (por ejemplo, PowerPC).


Paravirtualización
La paravirtualización es otra técnica muy popular que posee algunas similitudes con la virtualización completa. Este método utiliza un hypervisor para compartir el acceso al hardware subyacente, pero integra código que está al tanto de la virtualización en el propio sistema operativo (ver Imagen 3). Esta aproximación evita la necesidad de recompilar y capturar, ya que los propios sistemas operativos cooperan en el proceso de virtualización.




Imagen 3. La paravirtualización comparte el proceso con el SO invitado (Guest OS)


Como ya he mencionado, la paravirtualización precisa que los sistemas operativos alojados sean modificados por el hypervisor, lo cual supone una gran desventaja.


Pero lo realmente bueno de la paravirtualización, es que ofrece un rendimiento muy próximo al de un sistema no virtualizado.


Al igual que ocurre con la virtualización completa, es posible soportar varios sistemas operativos diferentes de manera concurrente.


Virtualización en el nivel del sistema operativo
La última técnica que exploraremos, será la virtualización en el nivel del sistema operativo. Este tipo de virtualización, implementa una técnica diferente a las que hemos visto hasta ahora. Básicamente, se encarga de virtualizar los servidores encima del propio sistema operativo. Este método soporta un solo sistema operativo y simplemente aísla los servidores independientes (ver Imagen 4).



Imagen 4. La virtualización en el nivel del sistema operativo aísla a los servidores

La virtualización en el nivel del sistema operativo requiere cambios en el núcleo del sistema operativo, pero como contraprestación, cuenta con la ventaja de que el rendimiento es igual a la ejecución nativa.

Virtualización a nivel de biblioteca

Aunque sólo sea a modo de mención, decir también que existe además otro método de virtualización, que emula porciones de un sistema operativo a través de una biblioteca.

Como ejemplos representativos cabría destacar a Wine (parte de la API Win32 para Linux), y a LxRun (parte de la API Linux para Solaris)

Soporte hardware para la virtualización completa y la paravirtualización
Es muy importante no dejar de recordar que la arquitectura IA-32 (x86) crea ciertos problemas cuando se intenta virtualizar. Algunas instrucciones del modo privilegiado no se pueden capturar y pueden devolver diferentes resultados en función del modo. Por ejemplo, la instrucción STR recupera el estado de seguridad, pero el valor que retorna depende del nivel de privilegios de quien realizó la ejecución.

Esto, por poner un ejemplo, puede ser problemático cuando se intente virtualizar diferentes sistemas operativos en diferentes niveles. Por ejemplo, la arquitectura x86 soporta cuatro anillos de protección, el nivel 0 (mayor privilegio) normalmente ejecuta el sistema operativo, los niveles 1 y 2 dan soporte a los servicios del sistema operativo, y el nivel 3 (el menor de los privilegios) soporta las aplicaciones. Los fabricantes de hardware han detectado este defecto (y otros), y han producido nuevos diseños que soportan y aceleran la virtualización.


Intel está produciendo una nueva tecnología de virtualización que soportará “hypervisores” en dos de sus arquitecturas, tanto en x86 (VT-x) como en Itanium (VT-i). VT-x soporta dos nuevos modos de operación, uno para la VMM (root) y otro para los sistemas operativos invitados (no root). En el modo root se cuentan con todos los privilegios, mientras que en el modo no root no se tienen privilegios (incluso para el nivel 0). La arquitectura también permite cierta flexibilidad, al definir las instrucciones que provocan que una VM (sistema operativo invitado) retorne al VMM y almacene el estado del procesador. También se han añadido otras capacidades.


Por su parte, AMD está produciendo la tecnología “Pacifica”, en la que el hardware asiste a la virtualización. Entre otras muchas cosas, Pacifica mantiene un bloque de control para los sistemas operativos invitados, que se guarda con la ejecución de instrucciones especiales. La instrucción VMRUN permite a una máquina virtual (y su sistema operativo invitado asociado) ejecutarse hasta que el VMM recupere el control (lo que también es configurable). Las opciones de configuración permiten que el VMM adapte los privilegios de cada uno de los invitados. Pacifica también compensa la traducción de direcciones con unidades de gestión de memoria (MMU -Memory Management Units-) para el host (SO físico) y los invitados (SOs invitados).

Todas estas nuevas tecnologías, pueden utilizarse en la mayoría del software de virtualización más utilizado hoy en día, como Xen, VMware, User-mode Linux, y otras.

¿Qué importancia tiene la virtualización?
Una vez hemos visto las distintas tecnologías existentes en virtualización, vamos a pasar a examinar finalmente las ventajas de la virtualización.


Desde una perspectiva de negocio, hay muchas razones para utilizar virtualización. La mayoría están relacionadas con la consolidación de servidores. La idea es muy sencilla: si puedes virtualizar un número de sistemas infrautilizados en un solo servidor, ahorrarás energía, espacio, capacidad de refrigeración y administración, debido a que tienes menos servidores. Dado que puede ser difícil determinar el grado de utilización de un servidor, las tecnologías de virtualización soportan la migración en caliente. La migración en caliente, permite que un sistema operativo y sus aplicaciones se muevan a un nuevo servidor para balancear la carga sobre el hardware disponible.


La virtualización también es importante para los desarrolladores. El núcleo de Linux ocupa un solo espacio de direcciones, lo que significa que un fallo en el núcleo o en cualquier driver provoca la caída del sistema operativo completo. La virtualización supone que puedes ejecutar varios sistemas operativos, y si uno cae debido a un fallo, el hypervisor y el resto de sistemas operativos continuarán funcionando. Esto puede hacer que depurar el núcleo sea una tarea más parecida a depurar aplicaciones en el espacio del usuario.


Pero sobre los proyectos OpenSource, el software comercial existente, y las tecnologías de virtualización en Linux y el resto de plataformas (Windows y MAC), hablaremos en próximos artículos.

Resumen
La virtualización es la nueva estrella, si se puede llamar "nuevo" a algo con unos 40 años de antiguedad. Históricamente se ha utilizado en diferentes situaciones, pero en la actualidad su principal interés es la virtualización de servidores y sistemas operativos. La virtualización proporciona muchas opciones de rendimiento, portabilidad y flexibilidad. Lo que significa que puede escogerse la solución que mejor se ajusta a las necesidades y a la aplicación.

En este primer artículo, hemos visto la evolución que ha seguido la virtualización a lo largo del tiempo, y en que estado se encuentran actualmente las diferentes tecnologías existentes.

En artículos sucesivos, iremos estudiando todas esas tecnologías, viendo qué tecnología aplica qué software, que ventajas ofrecen unos respecto a otros, y en definitiva, como se comportan todos a la hora de trabajar con ellos.

Para terminar, os dejo unos vínculos que os pueden resultar de interés.

Saludos, y hasta pronto!!

Links
- La página New to IBM Systems es útil si no se está muy familiarizado con los sistemas IBM. La página detalla entre otros los sistemas i, p, x y z.


- En developerWorks Grid computing zone es posible aprender sobre grid computing, un conjunto abierto de estándares y protocolos que virtualizan un ordenador distribuido y permiten crear un sistema muy robusto y potente.


http://es.wikipedia.org/wiki/Virtualización_x86 --> Con información sobre virtualización


http://www.agalisa.es/article386.html --> Información específica sobre la tecnología hardware de Intel para virtualización, Vanderpool Intel VT-x.

http://neutron.ing.ucv.ve/revista-e/No7/Julio%20Enriquez%5CCRUSOE.html --> Con información sobre Transmeta y Crusoe. -que no Robinson, cuidaó ;)-

2 comments:

Anonymous said...

excelente informacion, gracias...

saludos

Anonymous said...

Hola me podrías decir de donde sacaste las imagenes de los tipos de virtualización?
Muchas gracias.