Las distintas caras de la virtualización

Kirill Kolyshkin, director de proyecto de OpenVZ, analiza las diferencias entre emulación, paravirtualización y virtualización a nivel de sistema operativo.

Cuando piensas en virtualización, probablemente pienses en VMware, a lo mejor en Xen o como mucho en OpenVZ. Como ahora se habla mucho de este tema, creo que es un buen momento para hablar de tres de los cuatro tipos de virtualización existentes: emulación, paravirtualización y la virtualización multi servidor (clúster). Este último está fuera del ámbito de este artículo. Cada uno de estos tipos de virtualización tiene sus propios pros y contras.

La emulación permite ejecutar cualquier sistema operativo no modificado que soporte la plataforma emulada. Las implementaciones en esta categoría van desde los emuladores puros (como los Bochs) hasta soluciones que permiten la ejecución de varios códigos en una CPU real de manera nativa o parchear el código durante el tiempo de ejecucion para así aumentar el rendimiento. La principal desventaja de la emulación es el bajo rendimiento y la baja densidad. Como ejemplos destacamos: los productos de VMware, QEmu, Bochs o Parallels.

La paravirtualización es una técnica utilizada para ejecutar míltiples sistemas operativos modificados en una capa llamada hipervisor o monitor de máquina virtual. Como ventaja de la paravirtualización destacamos un mejor rendimiento frente a la emulación, pero su desventaja principal es que el SO “invitado” tiene que modificarse. Como ejemplos tenemos: Xen, UML.

La virtualización a nivel de SO permite la ejecución de múltiples entornos aislados en un único kernel de sistema operativo. Tiene el mejor rendimiento y densidad posible (casi como si fuera nativo) y dispone de fuentes de gestión dinámicas. Por otra parte, uno de los mayores inconvenientes de esta tecnología es que no permite ejecutar distintos kernels desde diferentes sistemas operativos al mismo tiempo. Como ejemplos destacamos: FreeBSD, Jail, Solaris Zones/Containers, Linux-VServer, OpenVZ y Virtuozzo.

Centrémonos en el concepto de Entornos Virtuales, (VE, también conocidos como VPS, contenedores, particiones, etc.) entornos aislados de ejecución de programas que (desde el punto de vista de su propietario) tienen la apariencia y actúan como si se tratara de un servidor físico separado. Un VE dispone de su propio juego de procesos, desde initis, sistemas de archivos, usuarios (incluyendo el root), interfaces de red con direcciones IP, tablas de enrutamiento, reglas del cortafuegos (netfilter/iptables), etc.

En un servidor físico pueden coexistir múltiples VEs. Mientras en varias distribuciones Linux pueden ejecutar numerosos VEs, todos los VEs operan debajo del mismo kernel.

Ahora examinemos el kernel de OpenVZ, un kernel de Linux modificado que añade virtualización y aislamiento a varios subsistemas, administración de recursos y checkpointing.

La virtualización y el aislamiento permiten disponer de muchos entornos virtuales dentro de un único kernel. El subsistema de administración de recursos limita (y en algunos casos también garantiza) recursos como la CPU, RAM y el espacio de disco de cada uno de los VEs. El checkpointing es el proceso de “congelación” de un VE, que guarda su estado en un archivo de disco, pudiendo “restaurarlo” más adelante.

La administración de recursos es sumamente importante en lo que se refiere a la tecnología de virtualización a nivel de sistema operativo, ya que dentro de un único kernel hay un juego finito de recursos, siendo este compartido por múltiples Entornos Virtuales. Todos estos recursos deben controlarse de manera que un único sistema pueda disponer de múltiples VEs sin que estos impacten los unos contra los otros.