Unterschied zwischen KVM und QEMU

138

Ich habe über KVMund Qemufür eine Weile gelesen . Ab sofort habe ich ein klares Verständnis dafür, was sie tun.

KVM unterstützt die Hardware-Virtualisierung, um den Gastbetriebssystemen eine nahezu native Leistung zu bieten. Andererseits emuliert QEmu das Zielbetriebssystem.

Was mich verwirrt, ist, auf welcher Ebene diese beiden koordinieren. Mögen

  1. Wer verwaltet die Freigabe von RAM und / oder Speicher?
  2. Wer plant E / A-Vorgänge?
Abhishek Gupta
quelle

Antworten:

194

Qemu :

QEmu ist eine vollständige und eigenständige Software. Sie verwenden es, um Maschinen zu emulieren, es ist sehr flexibel und portabel. Hauptsächlich funktioniert es mit einem speziellen "Recompiler", der den für einen bestimmten Prozessor geschriebenen Binärcode in einen anderen umwandelt (z. B. um MIPS-Code auf einem PPC-Mac oder ARM auf einem x86-PC auszuführen).

Um mehr als nur den Prozessor zu emulieren, enthält Qemu eine lange Liste von Peripherie-Emulatoren: Festplatten-, Netzwerk-, VGA-, PCI-, USB-, serielle / parallele Ports usw.

KQemu :

In dem speziellen Fall, in dem sowohl Quelle als auch Ziel dieselbe Architektur aufweisen (wie im allgemeinen Fall von x86 unter x86), muss der Code noch analysiert werden, um alle "privilegierten Anweisungen" zu entfernen und durch Kontextwechsel zu ersetzen. Um es unter x86 Linux so effizient wie möglich zu gestalten, gibt es ein Kernelmodul namens KQemu, das dies erledigt.

Als Kernelmodul kann KQemu den meisten Code unverändert ausführen und ersetzt nur die ring0-only-Anweisungen der untersten Ebene. In diesem Fall reserviert der Userspace Qemu weiterhin den gesamten RAM für den emulierten Computer und lädt den Code. Der Unterschied besteht darin, dass KQemu den Code nicht neu kompiliert, sondern scannt, patcht und ausführt. Die gesamte Peripherie-Hardware-Emulation erfolgt in Qemu.

Dies ist viel schneller als normales Qemu, da der Großteil des Codes unverändert bleibt, aber noch ring0-Code transformiert werden muss (der Großteil des Codes im Kernel der VM), sodass die Leistung immer noch darunter leidet.

KVM :

KVM ist ein paar Dinge: Erstens ist es ein Linux-Kernel-Modul, das jetzt in der Hauptlinie enthalten ist und den Prozessor in einen neuen "Gast" -Zustand versetzt. Der Gaststatus verfügt über einen eigenen Satz von Ringstatus, privilegierte ring0-Anweisungen greifen jedoch auf den Hypervisor-Code zurück. Da es sich um einen neuen Prozessormodus handelt, muss der Code in keiner Weise geändert werden.

Abgesehen von der Prozessorzustandsumschaltung verarbeitet das Kernelmodul auch einige Teile der Emulation auf niedriger Ebene, wie z. B. die MMU-Register (die zur Verarbeitung von VMs verwendet werden) und einige Teile der PCI-emulierten Hardware.

Zweitens ist KVM eine Abzweigung der ausführbaren Qemu-Datei. Beide Teams arbeiten aktiv daran, die Unterschiede so gering wie möglich zu halten, und es gibt Fortschritte bei der Reduzierung. Letztendlich ist das Ziel, dass Qemu überall funktioniert, und wenn ein KVM-Kernelmodul verfügbar ist, kann es automatisch verwendet werden. Auf absehbare Zeit konzentriert sich das Qemu-Team jedoch auf Hardware-Emulation und Portabilität, während sich KVM-Mitarbeiter auf das Kernel-Modul (das manchmal kleine Teile der Emulation verschiebt, wenn es die Leistung verbessert) und auf den Rest des Userspace-Codes konzentriert.

Die ausführbare Datei kvm-qemu funktioniert wie normale Qemu-Dateien: Sie weist RAM zu, lädt den Code und erzeugt, anstatt ihn neu zu kompilieren oder KQemu aufzurufen, einen Thread (dies ist wichtig). Der Thread ruft das KVM-Kernelmodul auf, um in den Gastmodus zu wechseln, und fährt mit der Ausführung des VM-Codes fort. Bei einem privilegierten Befehl wird zurück zum KVM-Kernelmodul gewechselt, das dem Qemu-Thread bei Bedarf signalisiert, dass er den größten Teil der Hardware-Emulation abwickelt.

Das Schöne an dieser Architektur ist, dass der Gastcode in einem Posix-Thread emuliert wird, den Sie mit normalen Linux-Tools verwalten können. Wenn Sie eine VM mit 2 oder 4 Kernen möchten, erstellt kvm-qemu 2 oder 4 Threads, von denen jeder das KVM-Kernelmodul aufruft, um die Ausführung zu starten. Die Parallelität - wenn Sie über genügend reale Kerne verfügen - oder die Planung - wenn nicht - wird vom normalen Linux-Scheduler verwaltet, wodurch der Code klein und die Überraschungen begrenzt bleiben.

Javier
quelle
3
Und für diejenigen, die wie ich keine CPU mit VT-Unterstützung haben, schlechte Nachrichten ( naja , wenn man das als «Nachrichten» bezeichnen könnte) - die KQEMU wird in Ubuntu nicht mehr unterstützt . KVM funktioniert ohne diese Unterstützung nicht mit CPU.
Hi-Angel
100

Bei der Zusammenarbeit vermittelt KVM den Zugriff auf die CPU und den Arbeitsspeicher, und QEMU emuliert die Hardwareressourcen (Festplatte, Video, USB usw.). Wenn Sie alleine arbeiten, emuliert QEMU sowohl die CPU als auch die Hardware.

Ignacio Vazquez-Abrams
quelle
9
@ Javiers Antwort ist detailliert und sollte natürlich die akzeptierte sein, aber deine Antwort hat es geschafft, mir in ein paar Sätzen genau das zu geben, was ich wissen musste, also +1 und danke.
Bill The Ape
-2

QEMU ist langsamer und KVM hilft QEMU dabei, eine sehr schnelle Hardwaregeschwindigkeit zu erreichen, um die beste Leistung für das System zu erzielen. QEMU ist Hypervisor / Emulator.

Meisam
quelle