Vraag Verschil tussen KVM en QEMU


Ik heb over gelezen KVM en Qemu al enige tijd. Vanaf nu heb ik een duidelijk begrip van wat ze doen.

KVM ondersteunt hardwarevirtualisatie om bijna-native prestaties te leveren aan de gastbesturingssystemen. Aan de andere kant emuleert QEmu het doelbesturingssysteem.

Wat ik in de war ben, is op welk niveau deze twee coördineren. Net zoals

  1. Wie beheert het delen van RAM en / of geheugen?
  2. Wie plant I / O-bewerkingen?

111
2017-12-03 08:42


oorsprong




antwoorden:


qemu:

QEmu is een complete en stand-alone software op zich. Je gebruikt het om machines te emuleren, het is zeer flexibel en draagbaar. Hoofdzakelijk werkt het met een speciale 'recompiler' die de geschreven binaire code transformeert voor een bepaalde processor in een andere processor (bijvoorbeeld MIPS-code uitvoeren op een PPC mac of ARM op een x86-pc).

Om meer dan alleen de processor te emuleren, bevat Qemu een lange lijst met rand-emulators: schijf, netwerk, VGA, PCI, USB, seriële / parallelle poorten, etc.

KQEMU:

In het specifieke geval waarin zowel de bron als het doel dezelfde architectuur zijn (zoals het gewone geval van x86 op x86), moet de code nog steeds worden ontleed om eventuele 'geprivilegieerde instructies' te verwijderen en deze te vervangen door contextschakelaars. Om het zo efficiënt mogelijk te maken op x86 Linux, is er een kernelmodule genaamd KQemu die dit afhandelt.

Omdat het een kernelmodule is, kan KQemu de meeste code ongewijzigd uitvoeren en alleen de instructies voor alleen ring0-instructies op het laagste niveau vervangen. In dat geval wijst gebruikersruimte Qemu nog steeds alle RAM voor de geëmuleerde computer toe en laadt de code. Het verschil is dat in plaats van het opnieuw compileren van de code, het KQemu oproept om het te scannen / te patchen / uit te voeren. Alle randapparatuur-hardware-emulatie gebeurt in Qemu.

Dit is een stuk sneller dan gewone Qemu omdat de meeste code ongewijzigd is, maar de ring0-code (het grootste deel van de code in de kernel van de VM) nog moet transformeren, dus de prestaties blijven eronder lijden.

KVM:

KVM is een aantal dingen: ten eerste is het een Linux-kernelmodule - nu opgenomen in de hoofdlijn - die de processor in een nieuwe 'gast'-status omzet. De gaststatus heeft zijn eigen set ringstatussen, maar geprivilegieerde ring0-instructies vallen terug naar de hypervisorcode. Omdat het een nieuwe verwerkingsmodus van de processor is, hoeft de code op geen enkele manier te worden gewijzigd.

Afgezien van de processorstatusschakeling, verwerkt de kernelmodule ook een paar low-level delen van de emulatie zoals de MMU-registers (gebruikt om VM af te handelen) en sommige delen van de PCI geëmuleerde hardware.

Ten tweede is KVM een vork van het uitvoerbare Qemu. Beide teams werken actief om de verschillen tot een minimum te beperken en er zijn vorderingen bij het terugdringen ervan. Uiteindelijk is het doel dat Qemu overal moet werken en als een KVM-kernelmodule beschikbaar is, zou deze automatisch kunnen worden gebruikt. Maar in de nabije toekomst concentreert het Qemu-team zich op hardware-emulatie en draagbaarheid, terwijl KVM-mensen zich concentreren op de kernelmodule (soms bewegende kleine delen van de emulatie daar, als het de prestaties verbetert) en interfacing met de rest van de gebruikersruimtecode.

Het uitvoerbare bestand kvm-qemu werkt als normaal Qemu: wijst RAM toe, laadt de code en in plaats van het opnieuw te compileren, of KQemu aan te roepen, wordt er een thread uitgezet (dit is belangrijk). De thread roept de KVM-kernelmodule op om over te schakelen naar de gastmodus en gaat verder met het uitvoeren van de VM-code. Bij een gepriviligeerde instructie schakelt het terug naar de KVM-kernelmodule, die, indien nodig, de Qemu-thread aangeeft om het grootste deel van de hardware-emulatie te verwerken.

Een van de leuke dingen van deze architectuur is dat de gastcode wordt geëmuleerd in een posix-thread die je kunt beheren met normale Linux-tools. Als je een VM met 2 of 4 kernen wilt, maakt kvm-qemu 2 of 4 threads, elk van hen roept de KVM-kernelmodule op om te beginnen met uitvoeren. De concurrency - als je genoeg echte cores hebt - of planning - als dat niet het geval is - wordt beheerd door de normale Linux-scheduler, waardoor code klein blijft en verrassingen beperkt.


153
2017-12-03 14:40



En voor diegene die als ik geen CPU met VT-ondersteuning heeft, slecht nieuws (nou ja, als dat "nieuws" zou kunnen heten) - de KQEMU wordt niet langer ondersteund in Ubuntu. KVM werkt niet met CPU zonder die ondersteuning. - Hi-Angel


Wanneer u samenwerkt, bemiddelt KVM toegang tot de CPU en het geheugen en QEMU emuleert de hardwarebronnen (harde schijf, video, USB, enz.). Bij alleen werken emuleert QEMU zowel CPU als hardware.


76
2017-12-03 08:46



@ Javier's antwoord is gedetailleerd en zou natuurlijk de geaccepteerde moeten zijn, maar je antwoord slaagde erin me in een paar zinnen precies te geven wat ik moest weten, dus +1 en bedankt. - Bill The Ape


QEMU is langzamer en KVM is er om QEMU te helpen een zeer hoge hardwaresnelheid te bereiken om de beste prestaties voor het systeem te leveren. QEMU is hypervisor / emulator.


-1
2017-11-14 10:58