9.2.1. Introducción

Dado nuestro propósito, centraremos el resto del epígrafe en la virtualización de plataforma cuyos tipos pueden resumirse en el siguiente esquema:

../../_images/virtualizacion.png

Antes de empezar, no obstante, hay que introducir cuatro conceptos:

  • Máquina virtual, que es el sistema informático virtualizado, esto es, el conjunto de un hardware virtual, un sistema operativo y las aplicaciones que corren sobre ellos.

  • Hipervisor, que es la plataforma software que controla la virtualización de las distintas máquinas virtuales.

  • Sistema anfitrión, que es aquel sobre el que se realiza la virtualización.

  • Sistema huésped, que es aquel que se ejecuta dentro de la máquina virtual.

Virtualización completa

Es aquella en la que se virtualiza por completo para el huesped una plataforma hardware funcional, por lo que el huésped debe ser tan sólo capaz de utilizar los componentes de esa plataforma, esto es, tener los drivers adecuandos para todos ellos. Normalmente el hardware que se virtualiza con componentes reales comúnmente utilizados por lo que es bastante probable que el sistema huésped disponga de los drivers apropiados.

Dentro de la virtualización completa, podemos hacer dos distinciones. La primera hace referencia al tipo de hipervisor:

  1. Virtualización nativa o hipervisor de tipo 1: es aquella en que el hipervisor se ejecuta directamente sobre el hardware.

    ../../_images/tipo1.png
  2. Virtualización alojada o Hipervisor de tipo 2: es aquella en que el hipervisor se ejecuta sobre un sistema operativo.

    ../../_images/tipo2.png

La nativa es más eficiente que la alojada, ya que el proceso de virtualización se ahorra la intermediación del sistema operativo.

Por otro lado, a partir del año 2005 las plataformas x86_64[1] empezaron a incluir en sus procesadores instrucciones que ayudan en la virtualización de hardware de la misma plataforma (VT-x en procesadores Intel y AMD-V en procesadores AMD), a fin de que los sistemas huéspedes pudieran ejecutar instrucciones directamente sobre el procesador sin afectar al anfitrión. Esto da lugar a otra clasificación:

  1. Virtualización acelerada por hardware, que es aquella que permite a los sistemas huéspedes ejecutar instrucciones privilegiadas sobre el hardware real, siempre que este lo soporte. Obviamente, se debe virtualizar un hardware del mismo tipo.

  2. Emulación, que es aquella en que la virtualización del hardware se realiza toda mediante software. Esto es mucho menos eficiente que la aceleración por hardware.

Paravirtualización

Es aquella en la que no se construye para el huésped un hardware virtual, ya que este tiene los controladores adecuados para hacer las peticiones directamente al anfitrión. Ello requiere modificar el sistema operativo cliente para incorporar estos controladores. Evitando la virtualización del hardware se mejora el rendimiento, pero a costa de no poder usar cualquier sistema operativo, sino sólo aquellos previamente preparados para su paravirtualización.

../../_images/paravirtualizacion.png
Paravirtualización híbrida

Es una solución a caballo entre las dos anteriores en que se usa paravirtualización exclusivamente para algunos aspectos del hardware que sea especialmente costoso virtualizarlos como operaciones de E/S y uso intensivo de memoria, y para el resto se usa virtualización completa del hardware.

Un ejemplo de hardware paravirtualizado es el driver virtIO para las tarjetas de red, que puede ser usado en sistemas de virtualización completas como Virtualbox o QEmu.

Contenedores

La virtualización por sistema operativo la llevan a cabo aquellos sistemas operativos capaces de crear varios espacios de usuario completamente aislados unos de otros. Cada uno de estos espacios de usuario constituye un contenedor y es capaz de ver y manejar aquellos recursos hardware que se le han asignado.

En consecuencia, en este tipo de virtualización no existe ni hardware virtual, ni sistema operativo huésped, sino sólo aplicaciones (de base o de usuario) que corren dentro del contenedor.

Dentro de esta virtualización, podemos distinguir dos clases:

  1. Contenedores de sistema que son aquellos contenedores dentro de los cuales se proporciona un espacio de usuario completo y aislado[2] del anfitrión. En ellos la gestión del sistema huésped es muy próxima a la de la virtualización completa (usuarios, red, procesos, etc.)

  2. Contenedores de aplicación que con son aquellos contenedores destinados a ejecutar un única aplicación aislada. Es una virtualización muy en boga en los últimos tiempos, sobre todo a partir de la irrupción de Docker.

Ver también

Para un explicación más exahustiva de estas dos clases, puede leer el artículo Operating System Containers vs. Application Containers.

Las ventajas fundamentales de este sistema son su rendimiento y su pequeño consumo de recurso frente a las soluciones anteriores. Por contra, tiene la desventaja de que al no existir un sistema operativo huésped, las aplicaciones huéspedes deben ser aplicaciones hechas para el sistema operativo anfitrión, o lo que es lo mismo, en un contenedor de Linux sólo podremos correr aplicaciones hechas para Linux.

../../_images/contenedor.png

Ver también

Sobre esta estrategia de virtualización hay explicaciones adicionales centradas en Linux dentro del epígrafe introductorio al software de contenedores.

Software de virtualización

Software

Tipo

Aceleración

Anfitrión

Huésped

Licencia

CPU

SO

CPU

SO

VMware Workstation

Completa tipo 2

x86
x86_64
Windows
Linux

Anfitrión

*

Propietaria (freeware)

Virtualbox

Windows
Linux
MacOs
FreeBSD

GPL

Parallel

MacOs

Propietaria

VMware ESXi

Completa tipo 1

-

Propietaria

KVM[3]

x86
x86_64
IA-64
ARM
PowerPC
Linux
FreeBSD

GPL

Hyper-V

x86_64

Windows

Propietaria

QEmu

Completa tipo 2

No[4]

x86
x86_64
IA-64
ARM
PowerPC
MIPS
SPARC
Linux
FreeBSD
Windows
MacOs
FreeBSD
OpenBSD
Solaris

*

*

GPL

Xen Project[5]

Completa
Paravirt.
Paravirt. híb.
Contenedor

x86
x86_64
PowerPC
ARM

Linux

Anfitrión

*

GPL

OpenVZ

Contenedores de sistema

-

x86
x86_64
IA-64
PowerPC
SPARC

Linux

Anfitrión

-

GPL

Docker

Contenedores de aplicación

-

x86_64
ARM
Linux
Windows
MacOs

Anfitrión

-

Apache (tipo BSD)

LXC

Contenedores de sistema

-

x86_64
ARM

Linux

Anfitrión

-

GPL

Notas al pie