La anatomía de un hipervisor Linux

Introducción a KVM y Lguest

Una de las innovaciones más importantes de Linux®es su transformación a hipervisor (o sistema operativo de otros sistemas operativos). Han aparecido una serie de soluciones de hipervisor que usan Linux como núcleo. Este artículo analiza las ideas en las que se basa el hipervisor ydos hipervisores en particular que usan Linux como plataforma (KVM y Lguest).

M. Tim Jones, Senior Principal Software Engineer, Emulex Corp.

M. Tim Jones es arquitecto de firmware incrustado y autor deArtificial Intelligence: A Systems Approach, GNU/Linux Application Programming(segunda edición),AI Application Programming (segunda edición) yBSD Sockets Programming from a Multilanguage Perspective.Su experiencia en el campo de la ingeniería abarca desde el desarrollo de núcleos para naves espaciales geosincrónicas, hasta la arquitectura de sistemas incrustados y el desarrollo de protocolos de redes. Tim es Consultant Engineer en la Emulex Corp. de Longmont,Colorado.


Nivel de autor contribuyente en developerWorks

31-05-2009

Los hipervisores son a los sistemas operativos lo que los sistemas operativos, en cierta medida, son a los procesos, es decir, proveen plataformas de hardware virtual aisladas para ejecución, que, a su vez, dan la ilusión de tener acceso total a la máquina subyacente. Sin embargo, no todos los hipervisores son iguales y esto no representa una dificultad, ya que las características esenciales de Linux son la flexibilidad y la posibilidad de elección. Este artículo comienza con una breve introducción a la virtualización y los hipervisores, y luego analiza un par de hipervisores basados en Linux.

Virtualización e hipervisores

Primero dediquemos un minuto a comprender por qué es importante la virtualización y el papel que cumplen los hipervisores (si desea más información sobre ambos temas, consulte la sección de Recursos)

Virtualización, En el contexto de este artículo se explica el proceso mediante el cual se oculta el hardware físico subyacente de manera tal que pueda ser usado y compartido entre múltiples sistemas operativos de manera transparente. Este tipo de arquitectura se conoce popularmente como virtualización de plataformas. En una típica arquitectura de niveles, el nivel que provee la virtualización de la plataforma se denomina hipervisor (también puede denominarse monitor de máquina virtual (virtual machine monitor, VMM)). Cada instancia del sistema operativo huésped (guest) recibe el nombre de máquina virtual (virtual machine, VM). El hardware se virtualiza para que parezca dedicado a cada una de estas VM. La Figura 1 es una ilustración simple de una arquitectura en niveles.

Figura 1. Arquitectura en niveles simple que muestra la virtualización de hardware común
Simple Layered Architecture showing the virtualization of common hardware.

Los beneficios de la virtualización de platformas son numerosos. Podemos destacar los hallazgos de una interesante estadística realizada por la Agencia de Protección Ambiental de los Estados Unidos (EPA por sus siglas en inglés). El estudio de la EPA sobre de la eficiencia de la energía de los servidores y centros de datos reveló que sólo cerca de 5% de la capacidad del servidor se utiliza realmente. El resto del tiempo, el servidor se mantiene inactivo. La virtualización de plataformas en un único servidor mejora la utilización del servidor y los beneficios que brinda la reducción de la cantidad de servidores son un multiplicador de ventajas. La menor cantidad de servidores conlleva a la reducción de costos inmobiliarios, de consumo de energía, de enfriamiento (que reduce a su vez los costos de energía) y de gestión. Menos hardware también se traduce en mayor confiabilidad. En conclusión, la virtualización de plataformas no sólo ofrece ventajas técnicas, sino que también proporciona ventajas de costos y energía.

Como se observa en la Figura 1, el hipervisor es el nivel de software que provee la virtualización de la máquina subyacente (en algunos casos, con soporte del procesador). No todas las soluciones de virtualización son iguales. Puede interiorizarse acerca de los distintos estilos de virtualización consultando la sección de Recursos. Continuando con el tema de los procesos, los sistemas operativos virtualizan el acceso a los recursos subyacentes de la máquina para los procesos. Los hipervisores realizan esta misma tarea, pero, en lugar de hacerlo para los procesos, lo hacen para sistemas operativos huésped completos.

Clasificación de los hipervisores

Los hipervisores se pueden clasificar en dos tipos distintos. Los de tipo 1 son aquéllos que se ejecutan nativamente sobre hardware de metal base. Los de tipo 2, son hipervisores que se ejecutan en el contexto de otro sistema operativo (el cual se ejecuta sobre el metal base). Un ejemplo de hipervisor de tipo 1 es la máquina virtual basada en un núcleo (Kernel-based Virtual Machine – KVM —, que es en sí misma un hipervisor basado en un sistema operativo. Algunos hipervisores de tipo 2 son QEMU y WINE.


Elementos del hipervisor

Entonces, un hipervisor (independientemente de su tipo) no es más que una aplicación en niveles que abstrae el hardware de la máquina de sus huéspedes. De esta manera, cada huésped ve una VM en lugar del hardware real. Ahora analicemos de manera genérica la composición interna de un hipervisor y también la forma en que se presenta ante las VM (o sistemas operativos huésped).

En un nivel elevado, el hipervisor requiere de una cantidad reducida de elementos para hacer arrancar un sistema operativo huésped: una imagen del núcleo para arrancar, una configuración (como, por ejemplo, direcciones IP y cantidad de memoria a usar), un disco y un dispositivo de red. El disco y el dispositivo de red suelen mapearse hacia el disco físico y el dispositivo de red de la máquina (como se muestra en la Figura 2). Finalmente, se requiere de un conjunto de herramientas del huésped para iniciar un huésped y luego gestionarlo.

Figura 2. Mapeo mínimo de recursos de un hipervisor hipotético
Minimal mapping of resources in a hypothetical hypervisor

Luego, en una arquitectura simplificada, el hipervisor implementa el medio de unión que permite que un sistema operativo huésped (guest) se ejecute simultáneamente con el sistema operativo anfitrión (host). Esta funcionalidad requiere de unos pocos elementos específicos, los cuales se muestran en la Figura 3. En primer lugar, como sucede con las llamadas de sistemas que realizan puentes entre las aplicaciones de espacio de usuario y las funciones de núcleo, existe un nivel de hiperllamada común disponible para todos los huéspedes, el cual permite realizar solicitudes al sistema operativo anfitrión. La entrada y salida se pueden virtualizar en el núcleo o ser asistidas por código en el sistema operativo huésped. Las interrupciones deben ser gestionadas únicamente por el hipervisor, que debe manejar las interrupciones reales o enrutar las interrupciones de dispositivos virtuales hacia el sistema operativo huésped. El hipervisor también debe manejar las capturas o excepciones que ocurren en un huésped (después de todo, la falla en un huésped debe detener la actividad de ese huésped y no interrupir al hipervisor o a los otros huéspedes). Un elemento central del hipervisor es el mapeador de páginas, el cual indica el hardware a las páginas para cada sistema operativo en particular (ya sea huésped o hipervisor). Por último, se requiere de un planificador de alto nivel para transferir el control del hipervisor a los sistemas operativos huéspedes (y nuevamente al hipervisor).

Figura 3. Vista simplificada de un hipervisor basado en Linux
Simplified view of a Linux-based hypervisor

Hipervisores Linux

Este artículo analiza dos soluciones de hipervisor basadas en Linux. La primera, — KVM —, fue el primer módulo de hipervisor que se integró al núcleo Linux e implementó la virtualización total. La segunda, — Lguest —, es un hipervisor experimental que proporciona paravirtualización a partir de una cantidad de cambios sorprendentemente baja.

KVM

KVM es una infraestructura de virtualización residente en un núcleo para Linux en hardware x86. KVM fue el primer hipervisor que se convirtió en parte del núcleo Linux nativo (versión 2.6.20). Fue desarrollado y es mantenido por Avi Kivity a través de la empresa Qumranet, que hoy pertenece a Red Hat.

Este hipervisor ofrece virtualización x86, con puertos al PowerPC® y a IA64 en proceso. Además, KVM recientemente agregó soporte a anfitriones (y huéspedes) de multiprocesamiento simétrico (symmetrical multiprocessing, SMP) y soporta características de nivel empresarial como la migración en vivo (para que los sistemas operativos huésped puedan migrar entre servidores físicos).

KVM se implementa como un módulo núcleo, lo cual permite convertir a Linux en hipervisor simplemente cargando un módulo. KVM provee virtualización total sobre plataformas de hardware que soportan instrucciones de hipervisor (como Intel® Virtualization Technology [Intel VT] o los productos AMD Virtualization [AMD-V]). KVM también soporta huéspedes paravirtualizados, como Linux y Windows® .

Esta tecnología se implementa en forma de dos componentes. El primero es el módulo cargable de KVM, que, al instalarse en el núcleo Linux, gestiona el hardware de virtualización, exponiendo sus capacidades a través del sistema de archivos /proc (ver Figura 4). El segundo componente se dedica a la emulación de la plataforma de PC a través de una versión modificada de QEMU. QEMU se ejecuta como un proceso de espacio de usuario y se coordina con el núcleo para gestionar las solicitudes de los sistemas operativos huéspedes.

Figura 4. Vista de alto nivel del hipervisor KVM
High-level view of the KVM hypervisor

Cuando un nuevo sistema operativo es arrancado en KVM (a través de una utilidad llamada kvm), se convierte en un proceso del sistema operativo anfitrión y, por consiguiente, se vuelve planificable como cualquier otro proceso. Sin embargo, a diferencia de los procesos tradicionales en Linux, el hipervisor identifica al sistema operativo huésped bajo el modo "guest" (huésped) (independientemente de los modos de usuario y núcleo).

Cada sistema operativo huésped se mapea a través del dispositivo /dev/kvm con su propio espacio de dirección virtual, el cual se mapea hacia el espacio de dirección física del núcleo anfitrión. Como se mencionó anteriormente, KVM usa el soporte de virtualización del hardware subyacente para brindar virtualización total (nativa). Las solicitudes entrantes y salientes se mapean a través del núcleo anfitrión hacia el proceso QEMU que se ejecuta en el anfitrión (hipervisor).

KVM opera como anfitrión en el contexto de Linux, pero soporta una gran cantidad de sistemas operativos huéspedes gracias al soporte de virtualización del hardware subyacente. Consulte la lista de los huéspedes soportados en la sección de Recursos.

Lguest (ex lhype)

El hipervisor Lguest, desarrollado por Rusty Russell de IBM Australia, utiliza un enfoque de virtualización completamente distinto. En lugar de brindar soporte de virtualización total para ejecutar sistemas operativos arbitrarios, Lguest provee paravirtualización liviana para huéspedes Linux x86 con habilitación Lguest (también llamada virtualización “Linux-on-Linux”). Esto significa que los sistemas operativos huéspedes saben que se los está virtualizando, lo que proporciona mejoras del rendimiento. A diferencia de KVM, Lguest tiene un buen rendimiento sin requerir de la virtualización de plataformas brindada por QEMU. El enfoque de Lguest además simplifica los requisitos de código generales ya que sólo necesita un delgado nivel en el huésped y en el sistema operativo del anfitrión. Ahora analicemos los cambios y observemos la arquitectura de alto nivel de un ambiente Lguest.

Como se muestra en la Figura 5, el sistema operativo huésped posee un delgado nivel de código Lguest (por definición, la paravirtualización). Este código provee una serie de servicios. En el nivel superior, existe código que determina si el núcleo arrancado se está virtualizando. También existe un nivel de abstracción (que se implementa a través de paravirt_ops) para enrutar las operaciones preferenciales al sistema operativo anfitrión a través de hiperllamadas. Por ejemplo, el huésped no puede deshabilitar las interrupciones, entonces estas solicitudes se realizan en el sistema operativo anfitrión. También existe un bus que implementa la abstracción de dispositivos para huéspedes y un conjunto de drivers simples que implementan una consola, un driver de bloqueo virtual y un driver de red virtual (lo que permite la comunicación con otros huéspedes).

Figura 5. Descomposición del enfoque Lguest de paravirtualización x86
Decomposition of the Lguest approach to x86 paravirtualization

La parte del núcleo se implementa como un módulo cargable llamado lg.ko. Este módulo contiene la interfaz del sistema operativo huésped hacia el núcleo anfitrión. El primer elemento es el conmutador. Este implementa el método por el cual los sistemas operativos huéspedes se ubican en el contexto correspondiente para su ejecución. El código del sistema de archivos /proc (para /dev/lguest) también se implementa en este módulo, que implementa las interfaces de espacios de usuario hacia el núcleo y los drivers, incluyendo las hiperllamadas. El mapeo de la memoria se realiza mediante código usando tablas de páginas sombra y gestión de segmentos x86.

Finalmente, el subdirectorio de documentación del núcleo contiene la utilidad de lanzamiento (lguest) que inicia las nuevas instancias de sistemas operativos huéspedes. Este archivo cumple una doble función: como utilidad y como documentación.

Lguest está incluido en la línea principal del núcleo desde la versión 2.6.23 (octubre de 2007). Fue desarrollado y es mantenido por Rusty Russell. Consta de aproximadamente 5000 líneas fuente de código, incluyendo las utilidades de espacio de usuario. Si bien se lo considera un hipervisor simple, Lguest logra proveer paravirtualización real. Sin embargo, su simplicidad trae aparejadas ciertas limitaciones. Por ejemplo, Lguest sólo virtualiza sistemas operativos huéspedes habilitados para Lguest, y, actualmente, sólo en la arquitectura x86. Pese a estas limitaciones, Lguest ofrece un enfoque interesante de la virtualización que resulta accesible para cualquier persona que esté dispuesta a estudiar el código de Rusty.


Beneficios del hipervisor Linux

El desarrollo de hipervisores usando Linux como núcleo ofrece beneficios reales y tangibles. El más evidente está dado en que, al basar un hipervisor en Linux, se obtendrán los beneficios de la evolución estable de Linux y del importante trabajo que esto implica. Con sus tradicionales optimizaciones y depuraciones de errores, sus innovaciones en planificación y gestión de la memoria y el soporte de diferentes arquitecturas de procesadores, Linux es una plataforma que continúa avanzando y se ubica, como diría John of Salisbury, “sobre los hombros de los gigantes”.

KVM demostró recientemente que, a través de la incorporación de un módulo núcleo, era posible transformar el núcleo Linux en un hipervisor. El hipervisor Lguest fue más allá y, con las limitaciones propias de la paravirtualización, logró minimizar la solución aún más.

Otro interesante beneficio de usar Linux como plataforma es que se puede utilizar la plataforma como sistema operativo y como hipervisor. Por consiguiente, además de ejecutar multiplex sistemas operativos huéspedes en un hipervisor Linux, es posible ejecutar otras aplicaciones tradicionales en el mismo nivel. Entonces, en lugar de tener que instalar una nueva plataforma con nuevas interfaces de programación de aplicaciones (API por sus siglas en inglés), puede usar su plataforma Linux estándar para desarrollar aplicaciones (en el caso que necesite una aplicación de monitoreo o una aplicación de gestión del hipervisor). Los protocolos estándar (TCP/IP) y otras aplicaciones útiles (servidores Web) están disponibles junto a los huéspedes. Recuerde la Figura 4 mostrada durante el desarrollo de KVM: además de los sistemas operativos de los huéspedes, tenemos a QEMU modificado para KVM. Este es un proceso estándar que demuestra la gran capacidad de Linux como hipervisor. KVM emplea QEMU para la virtualización de plataformas, y, con Linux como hipervisor, en seguida se dio soporte a la idea de que los sistemas operativos huéspedes operasen en concierto con otras aplicaciones Linux.


Conclusión

Es indudable que los desarrollos de hipervisores de la actualidad abren un nuevo campo de batalla. Hace treinta años, el sistema operativo era el centro del control y lo dominaban un pequeño grupo de jugadores. Hoy, el campo de batalla se ha trasladado al hipervisor y Linux desempeña un importante papel.

Linux como hipervisor ha recibido muchas críticas, principalmente relacionadas con el argumento de exceso de nuevas características en desmedro del rendimiento general. Este mismo argumento se utilizó no hace mucho tiempo para criticar el dominio incrustado. En la actualidad, Linux como sistema operativo incrustado es una fuerza imparable. Esto no significa que las críticas no tengan algo de razón. Tal vez se requiera de algunos cambios arquitectónicos para que este sistema operativo, que ya es sobresaliente y universal, adquiera aún más flexibilidad.

Recursos

Aprender

Obtener los productos y tecnologías

  • Construya su próximo proyecto sobre Linux con el software de prueba de IBM, disponible para su descarga directa desde developerWorks.

Comentar

  • Participe en Mi comunidad developerWorks. Con su perfil personal y su página principal personalizada, podrá adaptar developerWorks a sus intereses e interactuar con otros usuarios de developerWorks.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Lotus
ArticleID=412471
ArticleTitle=La anatomía de un hipervisor Linux
publish-date=05312009