Frage Unterschied zwischen KVM und QEMU


Ich habe gelesen KVM und Qemu für einige Zeit. Ab jetzt habe ich ein klares Verständnis von dem, was sie tun.

KVM unterstützt die Hardwarevirtualisierung, um den Gastbetriebssystemen eine nahezu native Leistung zu bieten. Auf der anderen Seite emuliert QEmu das Zielbetriebssystem.

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

  1. Wer verwaltet die gemeinsame Nutzung von RAM und / oder Arbeitsspeicher?
  2. Wer plant E / A-Vorgänge?

111
2017-12-03 08:42


Ursprung




Antworten:


Qemu:

QEmu ist eine vollständige und eigenständige Software. Sie verwenden es, um Maschinen zu emulieren, es ist sehr flexibel und tragbar. Hauptsächlich arbeitet es mit einem speziellen 'Recompiler', der Binärcode, der für einen bestimmten Prozessor geschrieben wurde, in einen anderen umwandelt (zB 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: Disk, Netzwerk, VGA, PCI, USB, serielle / parallele Ports usw.

KQemu:

In dem speziellen Fall, in dem sowohl Quelle als auch Ziel die gleiche Architektur haben (wie der übliche Fall von x86 auf x86), muss der Code noch analysiert werden, um "privilegierte Anweisungen" zu entfernen und sie durch Kontextwechsel zu ersetzen. Um es auf x86-Linux so effizient wie möglich zu machen, gibt es ein Kernel-Modul namens KQemu, das dies erledigt.

Als Kernel-Modul kann KQemu den meisten Code unverändert ausführen und ersetzt nur die ring0-only-Befehle der untersten Ebene. In diesem Fall reserviert Userspace Qemu weiterhin den gesamten RAM für den emulierten Rechner und lädt den Code. Der Unterschied besteht darin, dass KQemu aufgerufen wird, um den Code neu zu kompilieren, um ihn zu scannen / zu patchen / auszuführen. Die gesamte periphere Hardware-Emulation wird in Qemu durchgeführt.

Dies ist viel schneller als einfaches Qemu, da der meiste Code unverändert ist, aber immer noch Ring0-Code (der meiste Code im Kernel der VM) transformiert werden muss, so dass die Performance immer noch leidet.

KVM:

KVM ist ein paar Dinge: Erstens ist es ein Linux-Kernel-Modul - jetzt in Mainline enthalten - das den Prozessor in einen neuen "Gast" -Zustand versetzt. Der Gast-Status hat seine eigenen Ring-Zustände, aber privilegierte ring0-Anweisungen greifen 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 Umschaltung des Prozessorstatus behandelt das Kernelmodul auch einige untergeordnete Teile der Emulation wie die MMU-Register (die zur Handhabung von VM verwendet werden) und einige Teile der PCI-emulierten Hardware.

Zweitens ist KVM eine Verzweigung der ausführbaren Datei Qemu. 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 funktionieren sollte und wenn ein KVM-Kernelmodul verfügbar ist, könnte es automatisch verwendet werden. Aber auf absehbare Zeit konzentriert sich das Qemu-Team auf Hardware-Emulation und Portabilität, während KVM-Leute sich auf das Kernel-Modul konzentrieren (manchmal werden kleine Teile der Emulation dort verschoben, wenn es die Leistung verbessert) und mit dem restlichen Userspace-Code interagieren.

Die ausführbare Datei kvm-qemu funktioniert wie normales Qemu: weist RAM zu, lädt den Code, und anstatt es neu zu kompilieren oder KQemu aufzurufen, erzeugt es einen Thread (das ist wichtig). Der Thread ruft das KVM-Kernelmodul auf, um in den Gastmodus zu wechseln, und führt den VM-Code aus. Bei einer privilegierten Anweisung wird auf das KVM-Kernelmodul zurückgeschaltet, das bei Bedarf den Qemu-Thread anweist, den größten Teil der Hardwareemulation zu verarbeiten.

Eines der schönen Dinge 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 Gleichzeitigkeit - wenn Sie genug echte Kerne haben - oder die Planung - wenn nicht - wird vom normalen Linux-Scheduler verwaltet, so dass der Code klein bleibt und Überraschungen begrenzt sind.


153
2017-12-03 14:40



Und für diejenigen, die wie ich keine CPU mit VT-Unterstützung haben, schlechte Nachrichten (Nun, wenn das "Nachrichten" genannt werden könnte) - Der KQEMU wird in Ubuntu nicht mehr unterstützt. KVM funktioniert nicht mit der CPU ohne diese Unterstützung. - Hi-Angel


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


76
2017-12-03 08:46



@ Javier's Antwort ist detailliert und sollte natürlich akzeptiert werden, 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


QEMU ist langsamer und KVM ist da, um QEMU zu helfen, eine sehr schnelle Hardware-Geschwindigkeit zu erreichen, um die beste Leistung für das System zu liefern. QEMU ist Hypervisor / Emulator.


-1
2017-11-14 10:58