Esta lección explica los conceptos básicos de la virtualización.
En general, el objetivo de la virtualización es poder utilizar simultáneamente en un mismo ordenador dos o más sistemas operativos.
De acuerdo con esta definición, instalar dos sistemas operativos en un ordenador (Windows y Linux, por ejemplo) y poder elegir uno u otro mediante un arranque dual no se considera virtualización, puesto que mediante un arranque dual no podemos ejecutar a la vez ambos sistemas.
Y tampoco sería virtualización la simulación, que consiste en imitar el aspecto visual del sistema imitado. Por ejemplo, podríamos instalar un tema de escritorio en GNOME o KDE que imitara el escritorio de Windows. El problema de esta simulación sería que realmente no estaríamos utilizando Windows sino simplemente algo que parece Windows. Así que, por ejemplo, no podríamos instalar una aplicación de Windows puesto que el sistema operativo sería Linux, que no acepta instaladores de Windows.
Para poder hablar de virtualización tienen que estar funcionando a la vez varios sistemas operativos. El problema es que los sistemas operativos son los encargados de la gestión del hardware y requieren un control completo del mismo, por lo que dos sistemas operativos no pueden en principio estar funcionando a la vez sobre el mismo hardware. Por ello, la virtualización necesita la existencia de un hipervisor (en inglés, hypervisor). El hipervisor es un programa que hace de intermediario entre cada sistema operativo y el hardware del equipo, de manera que cada sistema operativo crea tener control completo del hardware y los distintos sistemas operativos estén aislados entre sí. A los sistemas operativos guests se les suele llamar también máquinas virtuales.
El hipervisor es así la pieza fundamental de la virtualización. Tradicionalmente, se distinguen dos tipos de hipervisores:
En el caso de los hipervisores de tipo 2, el sistema operativo que tiene el control del hardware recibe el nombre de host (anfitrión). Es el sistema operativo que se instaló primero en el ordenador y el que se pone en marcha al arrancar el ordenador. Los demás sistemas operativos reciben el nombre de guests (huéspedes) y pueden ejecutarse o no a voluntad del usuario.
En el caso de los hipervisores de tipo 1 no hay un sistema operativo host, todos los sistemas operativos son guests del hipervisor.
VMware ESXi o Xen son hipervisores de tipo 1. Hyper-V de Microsoft se puede considerar un hipervisor de tipo 1, porque aunque necesita que esté instalado primero Windows para poder instalar Hyper-V, una vez instalado convierte a Windows en un guest más de Hyper-V (aunque con acceso prioritario con respecto al resto de guests). KVM, al estar integrado en el kernel de Linux, se puede considerar tanto de tipo 1 como de tipo 2. VirtualBox es un hipervisor de tipo 2.
Los sistemas operativos actuales (Windows, Linux, etc.) pueden ser tanto hosts de hipervisores de tipo 2 como guests de hipervisores de tipo 1 o 2. Como los guests son independientes entre sí y son también independientes del host, se puede instalar el mismo sistema operativo en diferentes guests o instalar como guest el mismo sistema operativo que está instalado como host.
La virtualización tiene muchas aplicaciones interesantes:
Las primeras formas de virtualización se conseguían únicamente por software, pero con el tiempo los procesadores han ido incorporando instrucciones específicas para facilitar la virtualización (y sobre todo, acelerarla). En el caso de los procesadores x86, el microprocesador 386 (1985) fue el primero en incorporar el modo de ejecución 8086 virtual para permitir la ejecución de aplicaciones DOS creadas para el microprocesador 8086 y que no podían funcionar en un 386. Se trata de una virtualización específica, no de una solución general. Posteriormente, en 2005, Intel incorporó al Pentium 4 la tecnología VT-x, que permite virtualización en general al incorporar instrucciones que permiten que diferentes sistemas operativas crean tener acceso absoluto al procesador sin interferir unos con otros. AMD incorporó en 2006 al Athlon 64 una tecnología similar llamada AMD-V.
En principio, podríamos rizar el rizo haciendo virtualización anidada, es decir instalando en un sistema guest un sistema operativo capaz de comportarse como host e instalar en él sistemas guests. La virtualización anidada es muy útil en la nube, ya que los sistemas operativos a los que accedemos en la nube suelen estar virtualizados, pero la virtualización anidada acabará siendo imprescindible en el futuro, a medida que dejen de fabricarse los procesadores actuales y los sistemas que ahora virtualizan sistemas antiguos tengan a su vez que virtualizarse para poderse ejecutar. Intel incluyó en la arquitectura Haskell (2013) instrucciones específicas para facilitar la virtualización anidada. AMD también lo hizo (nota: por lo menos en 2011, pero no he encontrado la referencia exacta), aunque actualmente (enero de 2020) Hyper-V, el hipervisor nativo de Windows, no admite la virtualización anidada en procesadores AMD.
La forma más sofisticada de virtualización sería la emulación. Un emulador es un programa que implementa en software un determinado hardware (procesor, tarjeta gráfica, dispositivos de entrada y salida, etc.) y que responde a las órdenes exactamente igual que el hardware original. Sobre ese hardware emulado se puede instalar el sistema operativo guest. Si la emulación es completa, el sistema operativo guest creería estar utilizando un hardware real.
El problema de los emuladores es su velocidad, ya que emular una instrucción del hardware original pueden necesitar muchas instrucciones en el hardware real. Pero ese problema no es importante si el sistema emulado es antiguo, porque esos sistemas eran mucho más lentos que los sistemas actuales por lo que la emulación ejecuta las aplicaciones a una velocidad suficiente. Por eso, la emulación es una solución aceptable para la ejecución de programas de los años 80, especialmente de juegos y programas como M.A.M.E permiten jugar a juegos clásicos de consolas ya desaparecidas (aunque los juegos propiamente dichos deben conseguirse por otras vías, a veces de dudosa legalidad).
Uno de los emuladores más importantes es QEMU [por completar], que publica regularmente 3 nuevas versiones al año.
Otros emuladores:
KVM Forum es la conferencia anual dedicada a KVM
El problema de los hipervisores y las máquinas virtuales es que cada máquina virtual es independiente de las demás. Al no reutilizarse ningún componente, se ocupa mucho espacio tanto en disco como en memoria y el tiempo de ejecución siempre será mayor que si sólo hubiera un sistema operativo (sobre todo en el caso de hipervisores de tipo 2).
Para resolver este problema se crearon los contenedores en los que se utilizan mecanismos existentes en el sistema operativo para aislar las aplicaciones, pero compartiendo el mayor número posible de componentes del sistema operativo o incluso de las aplicaciones.
Docker es el gestor de contenedores más popular. LXC es un gestor de contenedores patrocinado por Canonical. containerd es un motor de ejecución de contenedores creado por la CNCF a partir de la donación de Docker.
La ventaja de los contenedores es su ligereza, puesto que comparten el máximo de componentes con el sistema operativo host, y su rapidez, ya que gracias a que apenas añaden capas adicionales consiguen casi velocidades nativas.
Los contenedores suelen ser elementos efímeros. La facilidad con la que pueden crearse y ponerse en marcha hace más fácil crear un nuevo contenedor que modificar uno ya existente. Por ello, los datos generados por las aplicaciones no se suelen guardar en los contenedores, sino fuera de ellos. Su ligereza hace más fácil tener varios contenedores con una aplicación en cada uno de ellos que tener un único contenedor con varias aplicaciones en él. Por ello, un aspecto importante de los contenedores es su orquestación, es decir, la administración simultánea de muchos contenedores.
Otros sistemas de virtualización: