
En informatique , une machine virtuelle ( VM ) est la virtualisation ou l'émulation d'un système informatique . Les machines virtuelles s'appuient sur des architectures informatiques et offrent les fonctionnalités d'un ordinateur physique. Leur implémentation peut nécessiter du matériel spécialisé, des logiciels, ou une combinaison des deux. Les machines virtuelles diffèrent et sont organisées selon leur fonction, comme illustré ci-dessous :
- Les machines virtuelles système (également appelées machines virtuelles de virtualisation complète ou SysVM ) remplacent une machine physique. Elles offrent les fonctionnalités nécessaires à l'exécution de systèmes d'exploitation complets . Un hyperviseur utilise l'exécution native pour partager et gérer le matériel, permettant ainsi de créer plusieurs environnements isolés les uns des autres sur la même machine physique. Les hyperviseurs modernes utilisent la virtualisation assistée par matériel , les fonctionnalités matérielles spécifiques à la virtualisation des processeurs hôtesapportant une assistance aux hyperviseurs.
- Les machines virtuelles de processus sont conçues pour exécuter des programmes informatiques dans un environnement indépendant de la plateforme.
Certains émulateurs de machines virtuelles, comme QEMU et les émulateurs de consoles de jeux vidéo , sont conçus pour émuler (ou « imiter virtuellement ») différentes architectures système, permettant ainsi l'exécution d'applications et de systèmes d'exploitation écrits pour un autre processeur ou une autre architecture. La virtualisation au niveau du système d'exploitation permet de partitionner les ressources d'un ordinateur via le noyau . Ces termes ne sont pas universellement interchangeables.
Définitions
machines virtuelles système
Une « machine virtuelle » a été initialement définie par Popek et Goldberg comme « une réplique efficace et isolée d'un ordinateur physique » . De nos jours, le terme englobe les machines virtuelles qui n'ont aucun lien direct avec un matériel physique . Le matériel physique exécutant la machine virtuelle est généralement appelé « hôte », et la machine virtuelle émulée sur cet hôte est généralement appelée « invitée ». Un hôte peut émuler plusieurs invités, chacun pouvant émuler différents systèmes d'exploitation et plateformes matérielles.
Le désir d'exécuter plusieurs systèmes d'exploitation a été la motivation initiale des machines virtuelles, afin de permettre le partage du temps entre plusieurs systèmes d'exploitation monotâches. À certains égards, une machine virtuelle système peut être considérée comme une généralisation du concept de mémoire virtuelle qui l'a historiquement précédée. Le CP/CMS d'IBM , premier système à permettre une virtualisation complète , implémentait le partage du temps en fournissant à chaque utilisateur un système d'exploitation monoposte, le Conversational Monitor System (CMS). Contrairement à la mémoire virtuelle, une machine virtuelle système autorisait l'utilisateur à écrire des instructions privilégiées dans son code. Cette approche présentait certains avantages, comme l'ajout de périphériques d'entrée/sortie non autorisés par le système standard.
Avec l'évolution de la technologie de la mémoire virtuelle pour la virtualisation, de nouveaux systèmes de surallocation de mémoire peuvent être appliqués pour gérer le partage de mémoire entre plusieurs machines virtuelles sur un même système d'exploitation. Il est possible de partager des pages mémoire au contenu identique entre plusieurs machines virtuelles s'exécutant sur la même machine physique, ce qui peut permettre de les mapper sur la même page physique grâce à une technique appelée fusion de pages identiques au niveau du noyau (KSM). Ceci est particulièrement utile pour les pages en lecture seule, telles que celles contenant des segments de code, ce qui est le cas pour plusieurs machines virtuelles exécutant le même logiciel ou des logiciels similaires, des bibliothèques logicielles, des serveurs web, des composants intermédiaires , etc. Les systèmes d'exploitation invités n'ont pas besoin d'être compatibles avec le matériel hôte, ce qui permet d'exécuter différents systèmes d'exploitation sur le même ordinateur (par exemple, Windows , Linux ou des versions antérieures d'un système d'exploitation) afin de prendre en charge les futurs logiciels.
L'utilisation de machines virtuelles pour prendre en charge des systèmes d'exploitation invités distincts est courante dans le domaine des systèmes embarqués . Un cas d'utilisation typique consiste à exécuter un système d'exploitation temps réel simultanément avec un système d'exploitation complexe de préférence, tel que Linux ou Windows. Une autre application concerne les logiciels novateurs et non éprouvés, encore en phase de développement, qui s'exécutent alors dans un environnement isolé (sandbox ). Les machines virtuelles présentent d'autres avantages pour le développement de systèmes d'exploitation, notamment un accès amélioré au débogage et des redémarrages plus rapides.
Plusieurs machines virtuelles exécutant leur propre système d'exploitation invité sont fréquemment utilisées pour la consolidation des serveurs.
Machines virtuelles de traitement
Une machine virtuelle de processus , parfois appelée machine virtuelle d'application ou environnement d'exécution géré (MRE), s'exécute comme une application classique au sein d'un système d'exploitation hôte et ne prend en charge qu'un seul processus. Elle est créée au démarrage de ce processus et supprimée à sa fermeture. Son objectif est de fournir un environnement de programmation indépendant de la plateforme , qui masque les détails du matériel ou du système d'exploitation sous-jacent et permet à un programme de s'exécuter de la même manière sur n'importe quelle plateforme.
Une machine virtuelle de processus offre une abstraction de haut niveau, celle d'un langage de programmation de haut niveau (par opposition à l'abstraction ISA de bas niveau de la machine virtuelle système). Les machines virtuelles de processus sont implémentées à l'aide d'un interpréteur ; des performances comparables à celles des langages de programmation compilés peuvent être obtenues grâce à la compilation à la volée .
Ce type de machine virtuelle s'est popularisé avec le langage de programmation Java , implémenté à l'aide de la machine virtuelle Java . Parmi les autres exemples, citons la machine virtuelle Parrot et le framework .NET , qui s'exécute sur une machine virtuelle appelée Common Language Runtime (CLR ). Toutes peuvent servir de couche d'abstraction pour n'importe quel langage informatique.
Les machines virtuelles de processus constituent un cas particulier de systèmes qui masquent les mécanismes de communication d'un cluster d'ordinateurs (potentiellement hétérogène) . Une telle machine virtuelle ne se compose pas d'un processus unique, mais d'un processus par machine physique du cluster. Elles sont conçues pour simplifier la programmation d'applications concurrentes en permettant au programmeur de se concentrer sur les algorithmes plutôt que sur les mécanismes de communication fournis par l'interconnexion et le système d'exploitation. Elles ne dissimulent pas l'existence de la communication et, de ce fait, ne prétendent pas présenter le cluster comme une machine unique.
Contrairement aux autres machines virtuelles de processus, ces systèmes ne fournissent pas de langage de programmation spécifique, mais sont intégrés à un langage existant ; généralement, un tel système propose des interfaces pour plusieurs langages (par exemple, C et Fortran ). On peut citer comme exemples la machine virtuelle parallèle (PVM) et l’interface de passage de messages (MPI).
Histoire
Les machines virtuelles système et les machines virtuelles de processus datent toutes deux des années 1960 et restent des domaines de développement actif.
Les machines virtuelles système sont issues du partage de temps , notamment implémenté dans le système CTSS ( Compatible Time-Sharing System ). Le partage de temps permettait à plusieurs utilisateurs d'utiliser un ordinateur simultanément : chaque programme semblait avoir un accès complet à la machine, mais un seul programme était exécuté à la fois, le système alternant entre les programmes par tranches de temps, en sauvegardant et en restaurant l'état à chaque fois. Ce principe a évolué vers les machines virtuelles, notamment grâce aux systèmes de recherche d'IBM : le M44/44X , qui utilisait une virtualisation partielle , et le CP-40 et SIMMON , qui utilisaient une virtualisation complète et constituaient les premiers exemples d' hyperviseurs . La première architecture de machine virtuelle largement disponible fut le CP-67 /CMS (voir l'historique du CP/CMS pour plus de détails). Une distinction importante résidait dans l'utilisation de plusieurs machines virtuelles sur un système hôte pour le partage de temps, comme dans le M44/44X et le CP-40, et l'utilisation d'une seule machine virtuelle sur un système hôte pour le prototypage, comme dans SIMMON. Les émulateurs , avec émulation matérielle de systèmes antérieurs pour la compatibilité, remontent à l' IBM System/360 en 1963, tandis que l'émulation logicielle (alors appelée « simulation ») est antérieure.
Les machines virtuelles de processus sont apparues initialement comme des plateformes abstraites pour un langage intermédiaire utilisé comme représentation intermédiaire d'un programme par un compilateur ; les premiers exemples remontent à environ 1964 avec le système d'écriture de compilateurs META II, qui l'utilisait à la fois pour la description de la syntaxe et la génération du code cible. Un exemple notable de 1966 est la machine à code objet (O-code ) , une machine virtuelle qui exécute le code objet (O- code) généré par le compilateur BCPL . Cette abstraction permettait de porter facilement le compilateur vers une nouvelle architecture en implémentant un nouveau module qui prenait le code objet existant et le compilait en code machine pour la machine physique sous-jacente. Le langage Euler utilisait une conception similaire, avec le langage intermédiaire nommé P (portable). Cette approche a été popularisée vers 1970 par Pascal , notamment dans le système Pascal-P (1973) et le compilateur Pascal-S (1975), où le langage intermédiaire était appelé « p-code » et la machine résultante, « machine à p-code » . Cette approche a exercé une influence considérable, et les machines virtuelles, dans ce sens, ont souvent été appelées machines à code p. Outre son rôle de langage intermédiaire, le code p de Pascal était également exécuté directement par un interpréteur implémentant la machine virtuelle, notamment dans UCSD Pascal (1978) ; cela a influencé les interpréteurs ultérieurs, en particulier la machine virtuelle Java (JVM). Un autre exemple ancien est SNOBOL4 (1967), écrit en SIL (SNOBOL Implementation Language), un langage assembleur pour machine virtuelle, puis transposé sur des machines physiques via un macro-assembleur . Cependant, les macros étant aujourd'hui moins utilisées, cette approche a eu moins d'influence. Les machines virtuelles de processus ont constitué une approche courante pour l'implémentation des premiers logiciels de micro-ordinateurs, tels que Tiny BASIC et les jeux d'aventure, depuis des implémentations ponctuelles comme Pyramid 2000 jusqu'à un moteur à usage général comme la z-machine d' Infocom , que Graham Nelson considère comme « peut-être la machine virtuelle la plus portable jamais créée ».
Des progrès significatifs ont été réalisés dans l'implémentation de Smalltalk -80 , notamment avec l'implémentation Deutsch/Schiffmann qui a popularisé la compilation à la volée (JIT) comme approche d'implémentation utilisant une machine virtuelle de processus . Parmi les machines virtuelles Smalltalk notables ultérieures, on peut citer VisualWorks , la machine virtuelle Squeak [ Strongtalk [ Un langage apparenté ayant généré de nombreuses innovations en matière de machines virtuelles est le langage de programmation Self , qui a introduit l'optimisation adaptative et le ramasse-miettes générationnel . Ces techniques ont rencontré un succès commercial en 1999 avec la machine virtuelle Java HotSpot . Parmi les autres innovations, on peut citer une machine virtuelle à registres, afin de mieux correspondre au matériel sous-jacent, plutôt qu'une machine virtuelle à pile, plus adaptée au langage de programmation ; cette approche a été initiée en 1995 par la machine virtuelle Dis pour le langage Limbo .
Techniques de virtualisation

Virtualisation complète
En virtualisation complète, la machine virtuelle simule suffisamment de matériel pour permettre l'exécution isolée d'un système d'exploitation invité non modifié (conçu pour le même jeu d'instructions ). Cette approche a été initiée en 1966 avec les IBM CP-40 et CP-67 , prédécesseurs de la famille des machines virtuelles .
En dehors du domaine des mainframes, on peut citer comme exemples Parallels Workstation , Parallels Desktop for Mac , VirtualBox , Virtual Iron , Oracle VM , Virtual PC , Virtual Server , Hyper-V , VMware Fusion , VMware Workstation , VMware Server (abandonné, anciennement appelé GSX Server), VMware ESXi , QEMU , Adeos, Mac-on-Linux, Win4BSD, Win4Lin Pro et la technologie Egenera vBlade.
Virtualisation assistée par matériel
Dans la virtualisation assistée par matériel, le matériel fournit un support architectural qui facilite la création d'un moniteur de machine virtuelle et permet l'exécution isolée des systèmes d'exploitation invités. La virtualisation assistée par matériel a été introduite pour la première fois sur l'IBM System/370 en 1972, pour être utilisée avec VM/370 , le premier système d'exploitation de machine virtuelle proposé par IBM en tant que produit officiel.
En 2005 et 2006, Intel et AMD ont fourni du matériel supplémentaire pour prendre en charge la virtualisation. Sun Microsystems (racheté par Oracle Corporation ) a ajouté des fonctionnalités similaires à ses processeurs UltraSPARC série T en 2005. Parmi les plateformes de virtualisation adaptées à ce matériel, on peut citer KVM , VMware Workstation , VMware Fusion , Hyper-V , Windows Virtual PC , Xen , Parallels Desktop pour Mac , Oracle VM Server pour SPARC , VirtualBox et Parallels Workstation .
En 2006, il a été constaté que la prise en charge matérielle x86 32 et 64 bits de première génération offrait rarement des avantages en termes de performances par rapport à la virtualisation logicielle.
Virtualisation au niveau du système d'exploitation
Dans la virtualisation au niveau du système d'exploitation, un serveur physique est virtualisé au niveau du système d'exploitation, permettant ainsi l'exécution de plusieurs serveurs virtualisés isolés et sécurisés sur un seul serveur physique. Les environnements d'exploitation « invités » partagent la même instance du système d'exploitation que le système hôte. Par conséquent, le même noyau est également utilisé pour implémenter les environnements « invités », et les applications exécutées dans un environnement « invité » donné le perçoivent comme un système autonome. La première implémentation de ce type fut FreeBSD jails ; parmi les autres exemples, citons Docker , Solaris Containers , OpenVZ , Linux-VServer , LXC , les partitions de charge de travail AIX , Parallels Virtuozzo Containers et les comptes virtuels iCore.
Instantanés
Un instantané représente l'état d'une machine virtuelle, et généralement de ses périphériques de stockage, à un moment précis. Un instantané permet de restaurer ultérieurement l'état de la machine virtuelle à ce moment-là, annulant ainsi toute modification intervenue après. Cette fonctionnalité est utile comme technique de sauvegarde , par exemple avant d'effectuer une opération risquée.
Les machines virtuelles utilisent fréquemment des disques virtuels pour leur stockage ; dans un exemple très simple, un disque dur de 10 gigaoctets est simulé par un fichier plat de 10 gigaoctets . Toute requête de la machine virtuelle pour un emplacement sur son disque physique est traduite de manière transparente en une opération sur le fichier correspondant. Grâce à cette couche de traduction, il est possible d'intercepter les opérations et de les rediriger vers différents fichiers, selon divers critères. À chaque prise d'instantané, un nouveau fichier est créé et sert de superposition aux fichiers précédents. Les nouvelles données sont écrites dans la superposition supérieure ; la lecture des données existantes, en revanche, nécessite l'analyse de la hiérarchie des superpositions, ce qui permet d'accéder à la version la plus récente. Ainsi, l'ensemble des instantanés constitue virtuellement un seul disque cohérent ; en ce sens, la création d'instantanés fonctionne de manière similaire à la technique de sauvegarde incrémentale .
D'autres composants d'une machine virtuelle peuvent également être inclus dans un instantané, tels que le contenu de sa mémoire vive (RAM), les paramètres du BIOS ou ses paramètres de configuration. La fonction « Sauvegarde de l'état » des émulateurs de consoles de jeux vidéo en est un exemple.
La restauration d'un instantané consiste à supprimer ou à ignorer toutes les couches superposées ajoutées après cet instantané, et à diriger toutes les nouvelles modifications vers une nouvelle couche superposée.
Migration
Les instantanés décrits ci-dessus peuvent être déplacés vers une autre machine hôte dotée de son propre hyperviseur. Lorsqu'une machine virtuelle est temporairement arrêtée, qu'un instantané est créé, déplacé, puis redémarrée sur le nouvel hôte, on parle de migration. Si les anciens instantanés sont régulièrement synchronisés, cette opération peut être très rapide et permettre à la machine virtuelle de continuer à fonctionner sans interruption pendant que son hôte physique d'origine est, par exemple, mis hors service pour maintenance.
Basculement
À l'instar du mécanisme de migration décrit précédemment, le basculement permet à la machine virtuelle de poursuivre son fonctionnement en cas de défaillance de l'hôte. Ce basculement se produit généralement lorsque la migration a échoué. Toutefois, dans ce cas, la machine virtuelle reprend son fonctionnement à partir du dernier état cohérent connu, et non de l' état actuel , en se basant sur les dernières données fournies au serveur de sauvegarde.
Virtualisation imbriquée
La virtualisation imbriquée désigne la possibilité d'exécuter une machine virtuelle au sein d'une autre, ce concept général pouvant être étendu à une profondeur arbitraire. Autrement dit, la virtualisation imbriquée consiste à exécuter un ou plusieurs hyperviseurs à l'intérieur d'un autre hyperviseur. La nature d'une machine virtuelle invitée imbriquée n'a pas besoin d'être homogène avec celle de sa machine virtuelle hôte ; par exemple, la virtualisation d'applications peut être déployée au sein d'une machine virtuelle créée à l'aide de la virtualisation matérielle .
La virtualisation imbriquée devient de plus en plus nécessaire à mesure que les systèmes d'exploitation généralisés intègrent des fonctionnalités d'hyperviseur. Dans un environnement virtualisé, ces fonctionnalités ne sont utilisables que si l'hyperviseur hôte prend en charge la virtualisation imbriquée ; par exemple, Windows 7 est capable d'exécuter des applications Windows XP au sein d'une machine virtuelle intégrée. De plus, la migration d'environnements virtualisés existants vers le cloud, selon l' approche Infrastructure as a Service (IaaS), est beaucoup plus complexe si la plateforme IaaS de destination ne prend pas en charge la virtualisation imbriquée.
La mise en œuvre de la virtualisation imbriquée sur une architecture informatique donnée dépend des capacités de virtualisation matérielle prises en charge . Si une architecture ne dispose pas du matériel nécessaire, diverses techniques logicielles permettent de la rendre possible. Au fil du temps, de plus en plus d'architectures acquièrent le matériel requis ; par exemple, depuis la microarchitecture Haswell (annoncée en 2013), Intel a intégré le VMCS shadowing comme technologie d'accélération de la virtualisation imbriquée.
Sécurité

Les machines virtuelles sont fréquemment utilisées pour isoler les applications les unes des autres à des fins de sécurité.
Cette conception architecturale (utilisée par Qubes OS , Whonix , KickSecure et Dangerzone) peut empêcher la propagation de logiciels malveillants d'un système compromis (par exemple, un client de messagerie ouvrant un document infecté ) à un autre système (par exemple, un gestionnaire de mots de passe ).