En informática , una máquina virtual ( VM ) es la virtualización o emulación de un sistema informático . Las máquinas virtuales se basan en arquitecturas informáticas y proporcionan la funcionalidad de una computadora física. Sus implementaciones pueden implicar hardware especializado, software o una combinación de ambos. Las máquinas virtuales se diferencian y están organizadas por su función, que se muestra aquí:
Algunos emuladores de máquinas virtuales, como QEMU y los emuladores de consolas de videojuegos , están diseñados para emular (o "imitar virtualmente") diferentes arquitecturas de sistemas, lo que permite la ejecución de aplicaciones de software y sistemas operativos escritos para otra CPU o arquitectura. La virtualización a nivel de SO permite que los recursos de una computadora se particionen a través del núcleo . Los términos no son universalmente intercambiables.
Popek y Goldberg definieron originalmente una "máquina virtual" como "un duplicado eficiente y aislado de una máquina informática real". [1] El uso actual incluye máquinas virtuales que no tienen una correspondencia directa con ningún hardware real. [2] El hardware físico, "del mundo real" que ejecuta la máquina virtual se conoce generalmente como "host", y la máquina virtual emulada en esa máquina se conoce generalmente como "guest". Un host puede emular varios invitados, cada uno de los cuales puede emular diferentes sistemas operativos y plataformas de hardware.
El deseo de ejecutar múltiples sistemas operativos fue el motivo inicial de las máquinas virtuales, para permitir el uso compartido del tiempo entre varios sistemas operativos monotarea. En algunos aspectos, una máquina virtual de sistema puede considerarse una generalización del concepto de memoria virtual que la precedió históricamente. CP/CMS de IBM , los primeros sistemas que permitieron la virtualización completa , implementaron el uso compartido del tiempo al proporcionar a cada usuario un sistema operativo monousuario, el Conversational Monitor System (CMS). A diferencia de la memoria virtual, una máquina virtual de sistema permitía al usuario escribir instrucciones privilegiadas en su código. Este enfoque tenía ciertas ventajas, como la adición de dispositivos de entrada/salida no permitidos por el sistema estándar. [2]
A medida que la tecnología evoluciona la memoria virtual con fines de virtualización, se pueden aplicar nuevos sistemas de sobreasignación de memoria para gestionar el uso compartido de memoria entre varias máquinas virtuales en un sistema operativo de computadora. Puede ser posible compartir páginas de memoria que tengan contenidos idénticos entre varias máquinas virtuales que se ejecutan en la misma máquina física, lo que puede dar como resultado el mapeo de las mismas páginas físicas mediante una técnica denominada fusión de la misma página del núcleo (KSM). Esto es especialmente útil para páginas de solo lectura, como las que contienen segmentos de código, que es el caso de varias máquinas virtuales que ejecutan el mismo software o uno similar, bibliotecas de software, servidores web, componentes de middleware , etc. Los sistemas operativos invitados no necesitan ser compatibles con el hardware del host, lo que hace posible ejecutar diferentes sistemas operativos en la misma computadora (por ejemplo, Windows , Linux o versiones anteriores de un sistema operativo) para admitir software futuro. [3]
El uso de máquinas virtuales para soportar sistemas operativos invitados independientes es popular en lo que respecta a los sistemas integrados . Un uso típico sería ejecutar un sistema operativo en tiempo real simultáneamente con un sistema operativo complejo preferido, como Linux o Windows. Otro uso sería para software nuevo y no probado que aún se encuentra en la etapa de desarrollo, de modo que se ejecute dentro de un entorno aislado . Las máquinas virtuales tienen otras ventajas para el desarrollo de sistemas operativos y pueden incluir un acceso de depuración mejorado y reinicios más rápidos. [4]
Con frecuencia se utilizan varias máquinas virtuales que ejecutan su propio sistema operativo invitado para la consolidación de servidores. [5]
Una máquina virtual de proceso, a veces llamada máquina virtual de aplicación o entorno de ejecución administrado (MRE), se ejecuta como una aplicación normal dentro de un sistema operativo host y admite un solo proceso. Se crea cuando se inicia ese proceso y se destruye cuando finaliza. Su propósito es proporcionar un entorno de programación independiente de la plataforma que abstraiga los detalles del hardware o sistema operativo subyacente y permita que un programa se ejecute de la misma manera en cualquier plataforma. [ cita requerida ]
Una máquina virtual de proceso proporciona una abstracción de alto nivel: la de un lenguaje de programación de alto nivel (en comparación con la abstracción ISA de bajo nivel de la máquina virtual de sistema). Las máquinas virtuales de proceso se implementan utilizando un intérprete ; se puede lograr un rendimiento comparable al de los lenguajes de programación compilados mediante el uso de la compilación en tiempo real . [ cita requerida ]
Este tipo de VM se ha vuelto popular con el lenguaje de programación Java , que se implementa utilizando la máquina virtual Java . Otros ejemplos incluyen la máquina virtual Parrot y .NET Framework , que se ejecuta en una VM llamada Common Language Runtime . Todos ellos pueden servir como una capa de abstracción para cualquier lenguaje de computadora. [ cita requerida ]
Un caso especial de máquinas virtuales de proceso son los sistemas que abstraen los mecanismos de comunicación de un clúster de computadoras (potencialmente heterogéneo) . Una máquina virtual de este tipo no consiste en un solo proceso, sino en un proceso por cada máquina física del clúster. Están diseñadas para facilitar la tarea de programar aplicaciones concurrentes al permitir que el programador se concentre en los algoritmos en lugar de en los mecanismos de comunicación proporcionados por la interconexión y el sistema operativo. No ocultan el hecho de que se produce la comunicación y, como tal, no intentan presentar el clúster como una sola máquina. [ cita requerida ]
A diferencia de otras máquinas virtuales de proceso, estos sistemas no proporcionan un lenguaje de programación específico, sino que están integrados en un lenguaje existente; normalmente, un sistema de este tipo proporciona enlaces para varios lenguajes (por ejemplo, C y Fortran ). [ cita requerida ] Algunos ejemplos son la máquina virtual paralela (PVM) y la interfaz de paso de mensajes (MPI).
Tanto las máquinas virtuales de sistema como las máquinas virtuales de proceso datan de la década de 1960 y siguen siendo áreas de desarrollo activo.
Las máquinas virtuales de sistema surgieron a partir del tiempo compartido , como se implementó notablemente en el Sistema de tiempo compartido compatible (CTSS). El tiempo compartido permitía que varios usuarios usaran una computadora simultáneamente : cada programa parecía tener acceso completo a la máquina, pero solo se ejecutaba un programa a la vez, y el sistema cambiaba entre programas en porciones de tiempo, guardando y restaurando el estado cada vez. Esto evolucionó hacia las máquinas virtuales, en particular a través de los sistemas de investigación de IBM: el M44/44X , que usaba virtualización parcial , y el CP-40 y SIMMON , que usaban virtualización completa , y fueron los primeros ejemplos de hipervisores . La primera arquitectura de máquina virtual ampliamente disponible fue el CP-67 /CMS (consulte Historia de CP/CMS para obtener más detalles). Una distinción importante era entre usar múltiples máquinas virtuales en un sistema host para compartir el tiempo, como en M44/44X y CP-40, y usar una máquina virtual en un sistema host para crear prototipos, como en SIMMON. Los emuladores , con emulación de hardware de sistemas anteriores para compatibilidad, se remontan al IBM System/360 en 1963, [6] [7] mientras que la emulación de software (entonces llamada "simulación") es anterior.
Las máquinas virtuales de proceso surgieron originalmente como plataformas abstractas para un lenguaje intermedio utilizado como representación intermedia de un programa por un compilador ; los primeros ejemplos datan de alrededor de 1964 con el sistema de escritura de compiladores META II que lo utilizó tanto para la descripción de la sintaxis como para la generación de código de destino. Un ejemplo notable de 1966 fue la máquina de código O , una máquina virtual que ejecuta código O (código objeto) emitido por el front-end del compilador BCPL . Esta abstracción permitió que el compilador se pudiera trasladar fácilmente a una nueva arquitectura mediante la implementación de un nuevo back-end que tomó el código O existente y lo compiló en código de máquina para la máquina física subyacente. El lenguaje Euler utilizó un diseño similar, con el lenguaje intermedio denominado P (portable). [8] Esto se popularizó alrededor de 1970 por Pascal , especialmente en el sistema Pascal-P (1973) y el compilador Pascal-S (1975), en el que se denominó código p y la máquina resultante como máquina de código p . Esto ha sido influyente, y las máquinas virtuales en este sentido a menudo se han llamado máquinas de código p. Además de ser un lenguaje intermedio, el código p de Pascal también fue ejecutado directamente por un intérprete que implementaba la máquina virtual, en particular en UCSD Pascal (1978); esto influyó en los intérpretes posteriores, en particular la máquina virtual Java (JVM). Otro ejemplo temprano fue SNOBOL4 (1967), que fue escrito en el lenguaje de implementación SNOBOL (SIL), un lenguaje ensamblador para una máquina virtual, que luego se orientó a las máquinas físicas mediante la transpilación a su ensamblador nativo a través de un ensamblador de macros . [9] Sin embargo, desde entonces las macros han caído en desgracia, por lo que este enfoque ha sido menos influyente. Las máquinas virtuales de proceso fueron un enfoque popular para implementar el software de microcomputadoras temprano, incluido Tiny BASIC y los juegos de aventura, desde implementaciones únicas como Pyramid 2000 hasta un motor de propósito general como z-machine de Infocom , que Graham Nelson sostiene que es "posiblemente la máquina virtual más portátil jamás creada". [10]
Se produjeron avances significativos en la implementación de Smalltalk -80, [11] particularmente la implementación de Deutsch/Schiffmann [12] que impulsó la compilación justo a tiempo (JIT) como un enfoque de implementación que utiliza la máquina virtual de procesos. [13] Las máquinas virtuales Smalltalk notables posteriores fueron VisualWorks , Squeak Virtual Machine , [14] y Strongtalk . [15] Un lenguaje relacionado que produjo mucha innovación en máquinas virtuales fue el lenguaje de programación Self , [16] que fue pionero en la optimización adaptativa [17] y la recolección de basura generacional . Estas técnicas demostraron ser comercialmente exitosas en 1999 en la máquina virtual Java HotSpot . [18] Otras innovaciones incluyen una máquina virtual basada en registros, para adaptarse mejor al hardware subyacente, en lugar de una máquina virtual basada en pilas, que es más parecida al lenguaje de programación; en 1995, esto fue iniciado por la máquina virtual Dis para el lenguaje Limbo .
En la virtualización completa, la máquina virtual simula suficiente hardware para permitir que un sistema operativo "invitado" no modificado (diseñado para el mismo conjunto de instrucciones ) se ejecute de forma aislada. Este enfoque se inició en 1966 con los IBM CP-40 y CP-67 , predecesores de la familia VM .
Algunos ejemplos fuera del campo de mainframe incluyen Parallels Workstation , Parallels Desktop para Mac , VirtualBox , Virtual Iron , Oracle VM , Virtual PC , Virtual Server , Hyper-V , VMware Fusion , VMware Workstation , VMware Server (descontinuado, anteriormente llamado GSX Server), VMware ESXi , QEMU , Adeos , Mac-on-Linux, Win4BSD, Win4Lin Pro y la tecnología Egenera vBlade.
En la virtualización asistida por hardware, el hardware proporciona soporte arquitectónico que facilita la creación de un monitor de máquina virtual y permite que los sistemas operativos invitados se ejecuten de forma aislada. [19] La virtualización asistida por hardware se introdujo por primera vez en IBM System/370 en 1972, para su uso con VM/370 , el primer sistema operativo de máquina virtual ofrecido por IBM como producto oficial. [20]
En 2005 y 2006, Intel y AMD proporcionaron hardware adicional para soportar la virtualización. Sun Microsystems (ahora Oracle Corporation ) agregó características similares en sus procesadores UltraSPARC T-Series en 2005. Entre los ejemplos de plataformas de virtualización adaptadas a dicho hardware se incluyen KVM , VMware Workstation , VMware Fusion , Hyper-V , Windows Virtual PC , Xen , Parallels Desktop para Mac , Oracle VM Server para SPARC , VirtualBox y Parallels Workstation .
En 2006, se descubrió que el soporte de hardware x86 de 32 y 64 bits de primera generación rara vez ofrecía ventajas de rendimiento sobre la virtualización de software. [21]
En la virtualización a nivel de SO, un servidor físico se virtualiza a nivel de sistema operativo, lo que permite que varios servidores virtualizados aislados y seguros se ejecuten en un único servidor físico. Los entornos de sistema operativo "invitado" comparten la misma instancia de ejecución del sistema operativo que el sistema host. Por lo tanto, también se utiliza el mismo núcleo del sistema operativo para implementar los entornos "invitados", y las aplicaciones que se ejecutan en un entorno "invitado" determinado lo ven como un sistema independiente. La implementación pionera fueron las cárceles de FreeBSD ; otros ejemplos incluyen Docker , Solaris Containers , OpenVZ , Linux-VServer , LXC , AIX Workload Partitions , Parallels Virtuozzo Containers y iCore Virtual Accounts.
Una instantánea es un estado de una máquina virtual, y generalmente de sus dispositivos de almacenamiento, en un momento exacto. Una instantánea permite restaurar más tarde el estado de la máquina virtual en el momento de la instantánea, deshaciendo de manera efectiva cualquier cambio que se haya producido posteriormente. Esta capacidad es útil como técnica de copia de seguridad , por ejemplo, antes de realizar una operación riesgosa. [ cita requerida ]
Las máquinas virtuales utilizan frecuentemente discos virtuales para su almacenamiento; en un ejemplo muy simple, se simula una unidad de disco duro de 10 gigabytes con un archivo plano de 10 gigabytes . Cualquier solicitud de la máquina virtual para una ubicación en su disco físico se traduce de forma transparente en una operación en el archivo correspondiente. Sin embargo, una vez que existe dicha capa de traducción, es posible interceptar las operaciones y enviarlas a diferentes archivos, según varios criterios. Cada vez que se toma una instantánea, se crea un nuevo archivo y se utiliza como superposición para sus predecesores. Los datos nuevos se escriben en la superposición superior; sin embargo, para leer los datos existentes es necesario escanear la jerarquía de superposiciones, lo que da como resultado el acceso a la versión más reciente. Por lo tanto, toda la pila de instantáneas es virtualmente un solo disco coherente; en ese sentido, la creación de instantáneas funciona de manera similar a la técnica de copia de seguridad incremental . [ cita requerida ]
Otros componentes de una máquina virtual también pueden incluirse en una instantánea, como el contenido de su memoria de acceso aleatorio (RAM), la configuración del BIOS o sus parámetros de configuración. La función " Guardar estado " de los emuladores de consolas de videojuegos es un ejemplo de dichas instantáneas. [ cita requerida ]
Restaurar una instantánea consiste en descartar o ignorar todas las capas superpuestas que se agregan después de esa instantánea y dirigir todos los cambios nuevos a una nueva superposición. [ cita requerida ]
Las instantáneas descritas anteriormente se pueden mover a otra máquina host con su propio hipervisor; cuando la VM se detiene temporalmente, se toman instantáneas, se mueve y luego se reanuda en el nuevo host, esto se conoce como migración. Si las instantáneas anteriores se mantienen sincronizadas regularmente, esta operación puede ser bastante rápida y permitir que la VM brinde un servicio ininterrumpido mientras su host físico anterior se desconecta, por ejemplo, para realizar tareas de mantenimiento físico. [ cita requerida ]
De manera similar al mecanismo de migración descrito anteriormente, la conmutación por error permite que la máquina virtual continúe con sus operaciones si el host falla. Generalmente, esto ocurre si la migración ha dejado de funcionar. Sin embargo, en este caso, la máquina virtual continúa con sus operaciones desde el último estado coherente conocido, en lugar del estado actual , en función de los materiales que se le proporcionaron al servidor de respaldo por última vez. [ cita requerida ]
La virtualización anidada se refiere a la capacidad de ejecutar una máquina virtual dentro de otra, siendo este concepto general extensible a una profundidad arbitraria. En otras palabras, la virtualización anidada se refiere a ejecutar uno o más hipervisores dentro de otro hipervisor. La naturaleza de una máquina virtual invitada anidada no necesita ser homogénea con su máquina virtual anfitriona; por ejemplo, la virtualización de aplicaciones se puede implementar dentro de una máquina virtual creada mediante el uso de virtualización de hardware . [22]
La virtualización anidada se hace más necesaria a medida que los sistemas operativos más extendidos obtienen funcionalidad de hipervisor incorporada, que en un entorno virtualizado se puede utilizar solo si el hipervisor circundante admite la virtualización anidada; por ejemplo, Windows 7 es capaz de ejecutar aplicaciones de Windows XP dentro de una máquina virtual incorporada. Además, trasladar entornos virtualizados ya existentes a una nube, siguiendo el enfoque de Infraestructura como Servicio (IaaS), es mucho más complicado si la plataforma IaaS de destino no admite la virtualización anidada. [23] [24]
La forma en que se puede implementar la virtualización anidada en una arquitectura informática particular depende de las capacidades de virtualización asistida por hardware que se admitan . Si una arquitectura particular no proporciona el soporte de hardware necesario para la virtualización anidada, se emplean diversas técnicas de software para habilitarla. [23] Con el tiempo, más arquitecturas obtienen el soporte de hardware necesario; por ejemplo, desde la microarquitectura Haswell (anunciada en 2013), Intel comenzó a incluir el shadowing VMCS como una tecnología que acelera la virtualización anidada. [25]
personas utilizan esa capacidad para configurar una máquina virtual independiente que ejecute Windows en una Mac, lo que les da acceso a la gama completa de aplicaciones disponibles para ambas plataformas.
Sorprendentemente, descubrimos que el soporte de hardware de primera generación rara vez ofrece ventajas de rendimiento sobre las técnicas de software existentes. Atribuimos esta situación a los altos costos de transición de VMM/guest y a un modelo de programación rígido que deja poco espacio para la flexibilidad del software a la hora de gestionar la frecuencia o el costo de estas transiciones.