Una máquina virtual (VM) es un término bastante genérico para muchas tecnologías de virtualización.
Existen muchas variaciones en las tecnologías de virtualización, pero las principales son:
- Virtualización a nivel de hardware
- Virtualización a nivel del sistema operativo
qemu-kvm
y VMWare
son ejemplos de lo primero. Emplean un hipervisor para administrar los entornos virtuales en los que se ejecuta un sistema operativo completo. Por ejemplo, en un qemu-kvm
sistema puede tener una VM que ejecute FreeBSD, otra que ejecute Windows y otra que ejecute Linux.
Las máquinas virtuales creadas por estas tecnologías se comportan como computadoras individuales aisladas para el huésped. Estos tienen una CPU virtual, RAM, NIC, gráficos, etc., que el huésped cree que es el artículo genuino. Debido a esto, se pueden instalar muchos sistemas operativos diferentes en las máquinas virtuales y funcionan "listos para usar" sin necesidad de modificaciones.
Si bien esto es muy conveniente, ya que muchos sistemas operativos se instalarán sin mucho esfuerzo, tiene el inconveniente de que el hipervisor tiene que simular todo el hardware, lo que puede ralentizar las cosas. Una alternativa es el hardware para-virtualizado, en el que se desarrolla un nuevo dispositivo virtual y controlador para el huésped que está diseñado para el rendimiento en un entorno virtual. qemu-kvm
proporcione la virtio
gama de dispositivos y controladores para esto. Una desventaja de esto es que el SO huésped debe ser compatible; pero si es compatible, los beneficios de rendimiento son excelentes.
lxc
es un ejemplo de virtualización a nivel de sistema operativo, o contenedores. Bajo este sistema, solo hay un núcleo instalado: el núcleo host. Cada contenedor es simplemente un aislamiento de los procesos de usuario y tierra. Por ejemplo, un servidor web (por ejemplo apache
) está instalado en un contenedor. En lo que respecta a ese servidor web, el único servidor instalado es él mismo. Otro contenedor puede estar ejecutando un servidor FTP. Ese servidor FTP no tiene conocimiento de la instalación del servidor web, solo que es propio. Otro contenedor puede contener la instalación completa del usuario de una distribución de Linux (siempre que esa distribución sea capaz de ejecutarse con el núcleo del sistema host).
Sin embargo, no hay instalaciones separadas del sistema operativo cuando se usan contenedores, solo instancias aisladas de servicios de usuario. Debido a esto, no puede instalar diferentes plataformas en un contenedor, no Windows en Linux.
Los contenedores generalmente se crean usando a chroot
. Esto crea una raíz privada separada ( /
) para que un proceso funcione. Al crear muchas raíces privadas individuales, los procesos (servidores web o una distribución de Linux, etc.) se ejecutan en su propio sistema de archivos aislado. Técnicas más avanzadas, como cgroups
pueden aislar otros recursos como la red y la RAM.
Hay pros y contras en ambos y muchos debates de larga data sobre cuál es el mejor.
- Los contenedores son más livianos, ya que no se instala un sistema operativo completo para cada uno; que es el caso de los hipervisores. Por lo tanto, pueden ejecutarse en hardware con especificaciones más bajas. Sin embargo, solo pueden ejecutar invitados Linux (en hosts Linux). Además, debido a que comparten el núcleo, existe la posibilidad de que un contenedor comprometido pueda afectar a otro.
- Los hipervisores son más seguros y pueden ejecutar diferentes sistemas operativos porque se instala un sistema operativo completo en cada máquina virtual y los invitados no conocen otras máquinas virtuales. Sin embargo, esto utiliza más recursos en el host, que tiene que ser relativamente poderoso.