Różnica między KVM a QEMU

138

Czytałem o czymś KVMi Qemuod jakiegoś czasu. W tej chwili doskonale rozumiem, co robią.

KVM obsługuje wirtualizację sprzętu, aby zapewnić niemal natywną wydajność systemom operacyjnym gościa. Z drugiej strony QEmu emuluje docelowy system operacyjny.

Jestem zdezorientowany co do tego, na jakim poziomie te dwie współrzędne są koordynowane. Lubić

  1. Kto zarządza współużytkowaniem pamięci RAM i / lub pamięci?
  2. Kto planuje operacje we / wy?
Abhishek Gupta
źródło

Odpowiedzi:

194

Qemu :

QEmu to kompletne i samodzielne oprogramowanie. Używasz go do emulacji maszyn, jest bardzo elastyczny i przenośny. Działa głównie przez specjalny „rekompilator”, który przekształca kod binarny napisany dla danego procesora na inny (powiedzmy, aby uruchomić kod MIPS na komputerze PPC mac lub ARM na komputerze z procesorem x86).

Aby emulować więcej niż tylko procesor, Qemu zawiera długą listę emulatorów peryferyjnych: dysk, sieć, VGA, PCI, USB, porty szeregowe / równoległe itp.

KQemu :

W konkretnym przypadku, w którym zarówno źródło, jak i cel mają tę samą architekturę (jak zwykły przypadek x86 na x86), nadal musi przeanalizować kod, aby usunąć wszelkie „uprzywilejowane instrukcje” i zastąpić je przełącznikami kontekstu. Aby uczynić go maksymalnie wydajnym w systemie Linux x86, istnieje moduł jądra o nazwie KQemu, który to obsługuje.

Będąc modułem jądra, KQemu jest w stanie wykonać większość kodu w niezmienionej formie, zastępując tylko instrukcje tylko dla najniższego poziomu pierścienia. W takim przypadku przestrzeń użytkownika Qemu nadal przydziela całą pamięć RAM dla emulowanej maszyny i ładuje kod. Różnica polega na tym, że zamiast ponownej kompilacji kodu wywołuje KQemu, aby go przeskanować / załatać / wykonać. Cała emulacja urządzeń peryferyjnych odbywa się w Qemu.

Jest to o wiele szybsze niż zwykłe Qemu, ponieważ większość kodu pozostaje niezmieniona, ale nadal musi przekształcić kod ring0 (większość kodu w jądrze maszyny wirtualnej), więc wydajność nadal spada.

KVM :

KVM to kilka rzeczy: po pierwsze jest to moduł jądra Linuksa - teraz zawarty w linii głównej - który przełącza procesor w nowy stan „gościa”. Stan gościa ma własny zestaw stanów dzwonienia, ale uprzywilejowane instrukcje ring0 wracają do kodu hiperwizora. Ponieważ jest to nowy tryb wykonywania procesora, kodu nie trzeba w żaden sposób modyfikować.

Oprócz przełączania stanu procesora moduł jądra obsługuje również kilka niskopoziomowych części emulacji, takich jak rejestry MMU (używane do obsługi VM) i niektóre części emulowanego sprzętu PCI.

Po drugie, KVM jest rozwidleniem pliku wykonywalnego Qemu. Oba zespoły aktywnie pracują nad utrzymaniem różnic na minimalnym poziomie, a postęp w ich zmniejszaniu. Ostatecznie celem jest to, aby Qemu działał w dowolnym miejscu, a jeśli moduł jądra KVM jest dostępny, można go użyć automatycznie. Ale w dającej się przewidzieć przyszłości zespół Qemu koncentruje się na emulacji sprzętu i przenośności, podczas gdy ludzie KVM skupiają się na module jądra (czasami przenosząc tam małe części emulacji, jeśli poprawia to wydajność) i łączą się z resztą kodu przestrzeni użytkownika.

Plik wykonywalny kvm-qemu działa jak normalny Qemu: przydziela pamięć RAM, ładuje kod i zamiast go ponownie skompilować lub wywołać KQemu, spawnuje wątek (jest to ważne). Wątek wywołuje moduł jądra KVM w celu przejścia do trybu gościa i kontynuuje wykonywanie kodu VM. Zgodnie z uprzywilejowaną instrukcją przełącza się z powrotem na moduł jądra KVM, który w razie potrzeby sygnalizuje wątkowi Qemu, aby obsłużył większość emulacji sprzętowej.

Jedną z fajnych cech tej architektury jest to, że kod gościa jest emulowany w wątku posix, którym można zarządzać za pomocą zwykłych narzędzi systemu Linux. Jeśli chcesz maszyny wirtualnej z 2 lub 4 rdzeniami, kvm-qemu tworzy 2 lub 4 wątki, z których każdy wywołuje moduł jądra KVM, aby rozpocząć wykonywanie. Współbieżność - jeśli masz wystarczającą liczbę rdzeni - lub planowanie - jeśli nie - zarządzane jest przez zwykły program do planowania Linuksa, utrzymując niewielki kod i niespodzianki ograniczone.

Javier
źródło
3
A dla tych, którzy jak ja nie mają procesora z obsługą VT, złe wieści (cóż, jeśli można by to nazwać «newsami») - KQEMU nie jest już obsługiwane w Ubuntu . KVM nie działa z procesorem bez tego wsparcia.
Cześć Anioł
100

Podczas współpracy KVM arbitrażuje dostęp do procesora i pamięci, a QEMU emuluje zasoby sprzętowe (dysk twardy, wideo, USB itp.). Podczas pracy w pojedynkę QEMU emuluje zarówno procesor, jak i sprzęt.

Ignacio Vazquez-Abrams
źródło
9
Odpowiedź @ Javiera jest szczegółowa i oczywiście powinna być zaakceptowana, ale twoja odpowiedź dała mi w kilku zdaniach dokładnie to, co musiałem wiedzieć, więc +1 i dzięki.
Bill The Ape,
-2

QEMU działa wolniej, a KVM pomaga QEMU w osiągnięciu bardzo szybkiej szybkości sprzętowej w celu zapewnienia najlepszej wydajności systemu. QEMU to hypervisor / Emulator.

meisam
źródło