Differenza tra KVM e QEMU


138

Ho letto KVMe Qemuper qualche tempo. A partire da ora ho una chiara comprensione di ciò che fanno.

KVM supporta la virtualizzazione hardware per fornire prestazioni quasi native ai sistemi operativi guest. D'altra parte, QEmu emula il sistema operativo di destinazione.

Ciò che mi confonde è a quale livello queste due coordinate. Piace

  1. Chi gestisce la condivisione di RAM e / o memoria?
  2. Chi pianifica le operazioni di I / O?

Risposte:


194

Qemu :

QEmu è un software completo e autonomo. Lo usi per emulare macchine, è molto flessibile e portatile. Funziona principalmente con uno speciale 'ricompilatore' che trasforma il codice binario scritto per un determinato processore in un altro (diciamo, per eseguire il codice MIPS su un Mac PPC o ARM in un PC x86).

Per emulare più di un semplice processore, Qemu include un lungo elenco di emulatori periferici: disco, rete, VGA, PCI, USB, porte seriali / parallele, ecc.

KQemu :

Nel caso specifico in cui sia l'origine che la destinazione hanno la stessa architettura (come nel caso comune di x86 su x86), deve ancora analizzare il codice per rimuovere eventuali "istruzioni privilegiate" e sostituirle con interruttori di contesto. Per renderlo il più efficiente possibile su Linux x86, c'è un modulo del kernel chiamato KQemu che lo gestisce.

Essendo un modulo del kernel, KQemu è in grado di eseguire la maggior parte del codice invariato, sostituendo solo le istruzioni ring0 di livello più basso. In tal caso, userspace Qemu alloca ancora tutta la RAM per la macchina emulata e carica il codice. La differenza è che invece di ricompilare il codice, chiama KQemu per scansionarlo / patch / eseguirlo. Tutta l'emulazione dell'hardware periferico viene eseguita in Qemu.

Questo è molto più veloce del semplice Qemu perché la maggior parte del codice è invariata, ma deve ancora trasformare il codice ring0 (la maggior parte del codice nel kernel della VM), quindi le prestazioni ne risentono ancora.

KVM :

KVM è un paio di cose: in primo luogo è un modulo del kernel Linux, ora incluso nella linea principale, che trasforma il processore in un nuovo stato "guest". Lo stato guest ha il proprio set di stati ring, ma le istruzioni ring0 privilegiate ricadono nel codice hypervisor. Poiché si tratta di una nuova modalità di esecuzione del processore, il codice non deve essere modificato in alcun modo.

Oltre alla commutazione dello stato del processore, il modulo del kernel gestisce anche alcune parti di basso livello dell'emulazione come i registri MMU (usati per gestire la VM) e alcune parti dell'hardware emulato PCI.

Secondo, KVM è un fork dell'eseguibile Qemu. Entrambe le squadre lavorano attivamente per ridurre al minimo le differenze e ci sono progressi nella riduzione. Alla fine, l'obiettivo è che Qemu dovrebbe funzionare ovunque, e se un modulo del kernel KVM è disponibile, potrebbe essere usato automaticamente. Ma per il prossimo futuro, il team di Qemu si concentra sull'emulazione e sulla portabilità dell'hardware, mentre le persone di KVM si concentrano sul modulo del kernel (a volte spostando lì piccole parti dell'emulazione, se migliora le prestazioni) e interfacciarsi con il resto del codice dello spazio utente.

L'eseguibile kvm-qemu funziona come il normale Qemu: alloca la RAM, carica il codice e invece di ricompilarlo, o chiamare KQemu, genera un thread (questo è importante). Il thread chiama il modulo del kernel KVM per passare alla modalità guest e procede all'esecuzione del codice VM. Su un'istruzione privilegiata, ritorna al modulo del kernel KVM, che, se necessario, segnala al thread Qemu di gestire la maggior parte dell'emulazione hardware.

Una delle cose belle di questa architettura è che il codice guest è emulato in un thread posix che puoi gestire con i normali strumenti Linux. Se vuoi una VM con 2 o 4 core, kvm-qemu crea 2 o 4 thread, ognuno di essi chiama il modulo del kernel KVM per iniziare l'esecuzione. La concorrenza, se si dispone di un numero sufficiente di core reali o di pianificazione, in caso contrario, è gestita dal normale programmatore Linux, mantenendo il codice piccolo e le sorprese limitate.


3
E per il coniuge che come me non ha CPU con supporto VT, cattive notizie (beh, se così si potesse chiamare «notizie») - il KQEMU non è più supportato in Ubuntu . KVM non funziona con la CPU senza quel supporto.
Hi-Angel,

100

Quando si lavora insieme, KVM arbitra l'accesso alla CPU e alla memoria e QEMU emula le risorse hardware (disco rigido, video, USB, ecc.). Quando si lavora da soli, QEMU emula sia la CPU che l'hardware.


9
La risposta di @Javier è dettagliata e dovrebbe essere quella accettata ovviamente, ma la tua risposta è riuscita a darmi in poche frasi esattamente quello che dovevo sapere, quindi +1 e grazie.
Bill The Ape

-2

QEMU è più lento e KVM è lì per aiutare QEMU a raggiungere una velocità hardware molto elevata per fornire le migliori prestazioni al sistema. QEMU è hypervisor / emulatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.