Diferența dintre KVM și QEMU (Administrarea sistemului, Virtualizare, Virtualizare Kvm, Qemu)

Abhishek Gupta a intrebat.

Am citit despre KVM și Qemu de ceva timp. Începând de acum am o înțelegere clară a ceea ce fac ele.

KVM suportă virtualizarea hardware pentru a oferi o performanță aproape nativă sistemelor de operare invitate. Pe de altă parte, QEmu emulează sistemul de operare țintă.

Ceea ce mă încurcă este la ce nivel se coordonează aceste două sisteme. Cum ar fi

  1. Cine gestionează partajarea memoriei RAM și/sau a memoriei?
  2. Cine programează operațiunile de I/O?

3 răspunsuri
Javier

Qemu:

QEmu este un software complet și independent de sine stătător. Îl folosești pentru a emula mașini, este foarte flexibil și portabil. În principal, funcționează printr-un „recompilator” special care transformă codul binar scris pentru un anumit procesor în altul (de exemplu, pentru a rula cod MIPS pe un mac PPC sau ARM într-un PC x86).

Pentru a emula mai mult decât procesorul, Qemu include o listă lungă de emulatori de periferice: disc, rețea, VGA, PCI, USB, porturi seriale/paralele etc.

KQemu:

În cazul specific în care atât sursa, cât și ținta sunt de aceeași arhitectură (cum ar fi cazul comun al x86 pe x86), trebuie totuși să analizeze codul pentru a elimina orice „instrucțiuni privilegiate” și să le înlocuiască cu comutări de context. Pentru a face acest lucru cât mai eficient posibil pe Linux x86, există un modul de kernel numit KQemu care se ocupă de acest lucru.

Fiind un modul de kernel, KQemu este capabil să execute majoritatea codului fără modificări, înlocuind doar instrucțiunile de nivel cel mai scăzut de tip ring0-only. În acest caz, Qemu din spațiul utilizatorului alocă în continuare toată memoria RAM pentru mașina emulată și încarcă codul. Diferența constă în faptul că, în loc să recompileze codul, acesta apelează KQemu pentru a-l scana/parametriza/executa. Toată emulația hardware a perifericelor se face în Qemu.

Acest lucru este mult mai rapid decât Qemu simplu, deoarece majoritatea codului este neschimbat, dar tot trebuie să transforme codul ring0 (majoritatea codului din nucleul mașinii virtuale), astfel încât performanța suferă în continuare.

KVM:

KVM reprezintă câteva lucruri: în primul rând, este un modul al kernelului Linux – inclus acum în mainline – care comută procesorul într-o nouă stare „guest”. Starea de oaspete are propriul set de stări de inel, dar instrucțiunile privilegiate de inel0 revin la codul hipervizorului. Deoarece este un nou mod de execuție al procesorului, codul nu trebuie modificat în niciun fel.

În afară de comutarea stării procesorului, modulul kernel gestionează și câteva părți de nivel scăzut ale emulației, cum ar fi registrele MMU (utilizate pentru a gestiona VM) și unele părți ale hardware-ului PCI emulat.

În al doilea rând, KVM este o bifurcație a executabilului Qemu. Ambele echipe lucrează activ pentru a menține diferențele la un nivel minim și există progrese în reducerea acestora. În cele din urmă, obiectivul este ca Qemu să funcționeze oriunde, iar dacă este disponibil un modul de kernel KVM, acesta ar putea fi utilizat automat. Dar, în viitorul apropiat, echipa Qemu se concentrează pe emulația hardware și portabilitate, în timp ce cei de la KVM se concentrează pe modulul kernel (uneori mutând acolo mici părți ale emulației, dacă acest lucru îmbunătățește performanța) și pe interfațarea cu restul codului din spațiul utilizatorului.

Executabilul kvm-qemu funcționează ca Qemu normal: alocă RAM, încarcă codul și, în loc să îl recompileze sau să apeleze KQemu, generează un fir de execuție (acest lucru este important). Firul de execuție apelează modulul de kernel KVM pentru a trece în modul invitat și continuă să execute codul VM. La o instrucțiune privilegiată, acesta revine la modulul kernel KVM, care, dacă este necesar, semnalează firului Qemu să se ocupe de cea mai mare parte a emulației hardware.

Unul dintre lucrurile bune ale acestei arhitecturi este că codul invitat este emulat într-un fir posix pe care îl puteți gestiona cu instrumente Linux obișnuite. Dacă doriți un VM cu 2 sau 4 nuclee, kvm-qemu creează 2 sau 4 fire, fiecare dintre ele apelând modulul kernel KVM pentru a începe execuția. Concurența – dacă aveți destule nuclee reale – sau programarea – dacă nu – este gestionată de programatorul Linux normal, menținând codul mic și surprizele limitate.

Comentarii

  • Iar pentru cei care, ca și mine, nu au un procesor cu suport VT, vești proaste (ei bine, dacă asta se poate numi „veste”)KQEMU nu mai este suportat în Ubuntu. KVM nu funcționează cu procesoare fără acest suport. –  > Por Salut-Angel.
Ignacio Vazquez-Abrams

Atunci când lucrează împreună, KVM arbitrează accesul la CPU și la memorie, iar QEMU emulează resursele hardware (hard disk, video, USB etc.). Atunci când lucrează singur, QEMU emulează atât CPU, cât și hardware.

Comentarii

    15

  • Răspunsul lui @Javier este detaliat și ar trebui să fie cel acceptat, desigur, dar răspunsul tău a reușit să-mi ofere în câteva fraze exact ceea ce aveam nevoie să știu, așa că +1 și mulțumesc. –  > Por Bill The Ape.
Gediz GÜRSU

Qemu este un software de virtualizare a emulării procesorului cu suport pentru multe dispozitive virtuale, cum ar fi hdd, mb, ram, snd, eth, usb, vga… KVM este un modul de kernel care permite trecerea prin nuclee de procesor prin host-passthrough fără a le virtualiza. De asemenea, permite trecerea prin dispozitive PCI prin vfio-pci modul kernel. Toate acestea sunt posibile prin IOMMU (Input output memory mapping unit), care mapează memoria reală DMA adrese la adrese virtualizate, astfel încât accesul direct devine posibil și aduce bare-metal (nativ). IOMMU este un mecanism care este parțial software în kernel și parțial hardware în chipset-uri, caracterizat prin următoarele caracteristici VT-D (vmx) AMD-VI (svm). SR-IOV este o caracteristică a chipset-ului care permite împărțirea unui dispozitiv PCI în mai multe dispozitive virtuale fără scăderea performanțelor prin acces direct paralelizat la IO.

Libvirt este o bibliotecă, care vă permite să utilizați python și alte limbaje de programare pentru a configura mașini virtuale. Virsh este un set de instrumente care funcționează în terminal pentru a monitoriza și configura setările mașinilor virtuale. Virt-manager este un ghid asemănător cu vmware player ca alternativă la virsh și utilizează libvirt.

Qemu-img este o unealtă cli care creează, convertește și face instantanee ale imaginilor de disc. Qemu-nbd este, de asemenea, o unealtă cli care permite accesul I/O brut la discul virtual prin rețea prin intermediul nbd.Virto este driverul de acces iommu și numele metodei de acces la discuri, nics (ethernet) și video. Virgil este opengl care suportă virtio vga. Redhat și Fedora au pe site-urile lor imagini cd rom virtio driver iso pentru windows și linux.

OVMF este un firmware deschis pentru mașini virtuale care oferă imagini de pornire UEFI pentru mașini virtuale qemu. Spice este un client vnc foarte rapid pentru mașini virtuale qemu.

Puteți începe să vă jucați introducând aceste programe în terminalul Ubuntu sau al oricărui Debian:

sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin virt-manager ovmf
virt-manager 

Experiența aduce claritate asupra funcțiilor acestor terminologii semi-conceptuale prin introducerea realizării răspunsului la întrebarea „Ce nu ar fi posibil fără X ?”.