Différence entre KVM et QEMU

138

J'ai lu sur KVMet Qemudepuis un moment. A partir de maintenant, j'ai une compréhension claire de ce qu'ils font.

KVM prend en charge la virtualisation matérielle pour fournir des performances quasi natives aux systèmes d'exploitation invités. D'autre part, QEmu émule le système d'exploitation cible.

Ce que je suis confus, c'est à quel niveau ces deux coordonnées. Comme

  1. Qui gère le partage de RAM et / ou de mémoire?
  2. Qui planifie les opérations d'E / S?
Abhishek Gupta
la source

Réponses:

195

Qemu :

QEmu est un logiciel complet et autonome. Vous l'utilisez pour émuler des machines, il est très flexible et portable. Cela fonctionne principalement avec un "recompilateur" spécial qui transforme le code binaire écrit pour un processeur donné en un autre (par exemple, pour exécuter le code MIPS sur un Mac PPC ou ARM sur un PC x86).

Pour émuler plus que le processeur, Qemu inclut une longue liste d’émulateurs de périphériques: disque, réseau, VGA, PCI, USB, ports série / parallèle, etc.

KQemu :

Dans le cas spécifique où la source et la cible ont la même architecture (comme dans le cas courant de x86 sur x86), il doit toujours analyser le code pour supprimer toutes les "instructions privilégiées" et les remplacer par des commutateurs de contexte. Pour le rendre aussi efficace que possible sous Linux x86, il existe un module de noyau appelé KQemu qui gère cela.

En tant que module de noyau, KQemu est capable d'exécuter la plupart du code sans modification, en remplaçant uniquement les instructions en anneau uniquement de niveau inférieur. Dans ce cas, l'espace utilisateur Qemu alloue toujours toute la mémoire vive de la machine émulée et charge le code. La différence est qu'au lieu de recompiler le code, il appelle KQemu pour le scanner / corriger / exécuter. Toutes les émulations de périphériques sont effectuées dans Qemu.

Ceci est beaucoup plus rapide que Qemu ordinaire, car la plupart du code reste inchangé, mais doit encore transformer le code ring0 (la majeure partie du code du noyau de la machine virtuelle), de sorte que les performances en pâtissent toujours.

KVM :

KVM est un petit nombre de choses: tout d’abord, c’est un module de noyau Linux - maintenant inclus dans mainline - qui fait basculer le processeur dans un nouvel état «invité». L'état invité a son propre ensemble d'états en anneau, mais les instructions ring0 privilégiées retombent dans le code de l'hyperviseur. Comme il s'agit d'un nouveau mode d'exécution du processeur, le code ne doit en aucun cas être modifié.

Outre la commutation d'état du processeur, le module de noyau gère également quelques parties de bas niveau de l'émulation, telles que les registres MMU (utilisés pour gérer la machine virtuelle) et certaines parties du matériel émulé par PCI.

Deuxièmement, KVM est un fork de l'exécutable Qemu. Les deux équipes travaillent activement à réduire au minimum les différences, et des progrès ont été réalisés pour les réduire. À terme, l'objectif est que Qemu fonctionne n'importe où et si un module de noyau KVM est disponible, il pourrait être utilisé automatiquement. Mais dans un avenir prévisible, l’équipe Qemu se concentre sur l’émulation et la portabilité du matériel, tandis que les utilisateurs de KVM se concentrent sur le module du noyau (y déplaçant parfois de petites parties de l’émulation si elle améliore les performances) et s’interface avec le reste du code de l’espace utilisateur.

L'exécutable kvm-qemu fonctionne comme Qemu normal: alloue de la mémoire vive, charge le code et au lieu de le recompiler ou d'appeler KQemu, il génère un thread (c'est important). Le thread appelle le module de noyau KVM pour passer en mode invité et exécute le code de la machine virtuelle. Sur une instruction privilégiée, il retourne au module de noyau KVM qui, si nécessaire, indique au thread Qemu de gérer la plus grande partie de l'émulation matérielle.

L’un des avantages de cette architecture est que le code invité est émulé dans un thread posix que vous pouvez gérer avec les outils Linux normaux. Si vous voulez une machine virtuelle avec 2 ou 4 cœurs, kvm-qemu crée 2 ou 4 threads, chacun d'entre eux appelle le module de noyau KVM pour commencer à s'exécuter. La simultanéité (si vous avez suffisamment de cœurs réels) ou la planification (sinon) est gérée par le planificateur Linux normal, ce qui permet de limiter la taille du code et de limiter le nombre de surprises.

Javier
la source
4
Et pour ceux qui comme moi n’ont pas de processeur avec support VT, mauvaises nouvelles (enfin, si on pourrait appeler ça «nouvelles») - le KQEMU n’est plus supporté par Ubuntu . KVM ne fonctionne pas avec le processeur sans ce support.
Bonjour Angel
100

Lorsque vous travaillez ensemble, KVM arbitre l'accès au processeur et à la mémoire, et QEMU émule les ressources matérielles (disque dur, vidéo, clé USB, etc.). Lorsque vous travaillez seul, QEMU émule à la fois le processeur et le matériel.

Ignacio Vazquez-Abrams
la source
9
La réponse de @ Javier est détaillée et devrait être celle acceptée bien sûr, mais votre réponse a réussi à me donner en quelques phrases exactement ce que j'avais besoin de savoir, donc +1 et merci.
Bill The Ape
-2

QEMU est plus lent et KVM est là pour aider QEMU à atteindre une vitesse matérielle très rapide afin de fournir les meilleures performances pour le système. QEMU est hyperviseur / émulateur.

Meisam
la source