Ogólne zasady działania QEMU-KVM

Ogólne zasady działania QEMU-KVM

Moje obecne zrozumienie:

1) KVM

KVM (ang. Kernel-Based Virtual Machine) to hypervisor (VMM – Virtual Machine Manager) działający jako moduł w systemie operacyjnym Linux. Hiperwizor jest potrzebny, aby uruchomić jakieś oprogramowanie w nieistniejącym (wirtualnym) środowisku i jednocześnie ukryć przed tym oprogramowaniem prawdziwy fizyczny sprzęt, na którym to oprogramowanie działa. Hiperwizor działa jako „przekładka” pomiędzy sprzętem fizycznym (hostem) a wirtualnym systemem operacyjnym (gościem).

Ponieważ KVM jest standardowym modułem jądra Linuksa, otrzymuje od jądra wszystkie wymagane funkcje (zarządzanie pamięcią, harmonogram itp.). I odpowiednio, ostatecznie wszystkie te korzyści trafiają do gości (ponieważ goście pracują na hypervisorze działającym w jądrze systemu operacyjnego Linux lub w nim).

KVM jest bardzo szybki, ale sam w sobie nie wystarczy do uruchomienia wirtualnego systemu operacyjnego, bo... Wymaga to emulacji we/wy. W przypadku wejść/wyjść (procesor, dyski, sieć, wideo, PCI, USB, porty szeregowe itp.) KVM wykorzystuje QEMU.

2) QEMU

QEMU (Quick Emulator) to emulator różnych urządzeń, który pozwala na uruchamianie systemów operacyjnych zaprojektowanych dla jednej architektury na innej (na przykład ARM -> x86). Oprócz procesora QEMU emuluje różne urządzenia peryferyjne: karty sieciowe, dyski twarde, karty graficzne, PCI, USB itp.

Działa to tak:

Instrukcje/kod binarny (na przykład ARM) są konwertowane na pośredni kod niezależny od platformy za pomocą konwertera TCG (Tiny Code Generator), a następnie ten niezależny od platformy kod binarny jest konwertowany na instrukcje/kod docelowy (na przykład x86).

ARM –> kod_pośredni –> x86

Zasadniczo możesz uruchamiać maszyny wirtualne na QEMU na dowolnym hoście, nawet ze starszymi modelami procesorów, które nie obsługują Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Jednak w tym przypadku będzie to działać bardzo wolno, ze względu na fakt, że wykonujący się kod binarny wymaga dwukrotnej rekompilacji w locie, przy użyciu TCG (TCG to kompilator Just-in-Time).

Te. QEMU samo w sobie jest mega fajne, ale działa bardzo wolno.

3) Pierścienie ochronne

Ogólne zasady działania QEMU-KVM

Binarny kod programu na procesorach działa nie bez powodu, ale jest umiejscowiony na różnych poziomach (pierścienie/pierścienie ochronne) z różnymi poziomami dostępu do danych, od najbardziej uprzywilejowanego (Pierścień 0), do najbardziej ograniczonego, regulowanego i „z dokręconymi nakrętkami” ” (Pierścień 3).

System operacyjny (jądro systemu operacyjnego) działa na pierścieniu 0 (tryb jądra) i może robić, co chce, z dowolnymi danymi i urządzeniami. Aplikacje użytkownika działają na poziomie Pierścienia 3 (tryb użytkownika) i nie mogą robić, co chcą, zamiast tego muszą za każdym razem żądać dostępu w celu wykonania określonej operacji (a zatem aplikacje użytkownika mają dostęp tylko do własnych danych i nie mogą „uzyskać dostępu” do „czyjej piaskownicy”). Pierścień 1 i 2 są przeznaczone do użytku przez kierowców.

Przed wynalezieniem technologii Intel VT-x / AMD SVM hiperwizory działały w pierścieniu 0, a goście w pierścieniu 1. Ponieważ pierścień 1 nie ma wystarczających uprawnień do normalnego działania systemu operacyjnego, przy każdym uprzywilejowanym wywołaniu z systemu gościa, hypervisor musiał zmodyfikować to wywołanie w locie i wykonać je na pierścieniu 0 (podobnie jak robi to QEMU). Te. plik binarny gościa NIE był wykonywany bezpośrednio na procesorze i za każdym razem przechodził na bieżąco kilka pośrednich modyfikacji.

Narzut był znaczny i był to duży problem, a następnie producenci procesorów niezależnie od siebie wypuścili rozszerzony zestaw instrukcji (Intel VT-x / AMD SVM), który umożliwiał wykonanie kodu systemu gościa BEZPOŚREDNIO na procesorze głównym (z pominięciem kosztownych etapów pośrednich, jak miało to miejsce wcześniej).

Wraz z pojawieniem się Intel VT-x / AMD SVM stworzono specjalny nowy poziom pierścienia -1 (minus jeden). A teraz działa na nim hypervisor, a goście działają na Ring 0 i uzyskują uprzywilejowany dostęp do procesora.

Te. w końcu:

  • host działa na pierścieniu 0
  • goście pracują na Ring 0
  • hypervisor działa na pierścieniu -1

4) QEMU-KVM

KVM zapewnia gościom dostęp do Ring 0 i wykorzystuje QEMU do emulacji wejść/wyjść (procesor, dyski, sieć, wideo, PCI, USB, porty szeregowe itp., które goście „widzą” i z którymi pracują).

Stąd QEMU-KVM (lub KVM-QEMU) :)

KREDYTY
Zdjęcie mające przyciągnąć uwagę
Zdjęcie pierścieni ochronnych

PS Tekst tego artykułu został pierwotnie opublikowany na kanale Telegram @RU_Voip jako odpowiedź na pytanie jednego z uczestników kanału.

Piszcie w komentarzach gdzie nie rozumiem poprawnie tematu lub czy mam coś do dodania.

Dziękuję!

Źródło: www.habr.com

Dodaj komentarz