Wikiwand AI

Kernel-based Virtual Machine

Infrastruktur des Linux-Kernels zur Virtualisierung From Wikipedia, the free encyclopedia

Die Kernel-based Virtual Machine (KVM) ist eine Komponente des Linux-Kernels zur Virtualisierung von Computersystemen. Sie ermöglicht es dem Kernel, als Hypervisor mehrere virtuelle Maschinen auszuführen. Dabei nutzt KVM die Virtualisierungsfunktionen der Prozessorhardware. Die 2006 vorgestellte Software ist seit Version 2.6.20 Bestandteil des Linux-Kernels.[1]

Schnelle Fakten Basisdaten ...
Kernel-based Virtual Machine
Logo der Kernel-based Virtual Machine

Mehrere Gastsysteme auf einem Linux-Rechner
Basisdaten
Hauptentwickler KVM-Entwicklergemeinschaft
Entwickler ursprünglich Qumranet
Erscheinungsjahr 2006
Betriebssystem Linux
Programmier­sprache C
Kategorie Hypervisor
Lizenz GNU GPL, Version 2
www.linux-kvm.org
Schließen

KVM stellt eine Schnittstelle für Programme im Userspace bereit, die virtuelle Maschinen anlegen und steuern. Häufig wird es mit QEMU kombiniert: KVM übernimmt insbesondere die hardwaregestützte Ausführung des Gastcodes, während QEMU das Modell des virtuellen Rechners einschließlich vieler Geräte bereitstellt.[2] Weitere Programme nutzen die KVM-Schnittstelle beispielsweise für kleine, auf einzelne Arbeitslasten zugeschnittene virtuelle Maschinen, sogenannte MicroVMs.[3]

Geschichte und Entwicklung

KVM entstand bei dem israelischen Unternehmen Qumranet unter Federführung von Avi Kivity. Dieser stellte das Projekt am 19. Oktober 2006 auf der Linux Kernel Mailing List vor.[4] Im Februar 2007 erschien Linux 2.6.20 mit integrierter KVM-Unterstützung.[5][1] Am 4. September 2008 gab Red Hat die Übernahme von Qumranet bekannt.[6]

Im Mai 2011 gründeten BMC Software, Eucalyptus Systems, HP, IBM, Intel, Red Hat und SUSE die Open Virtualization Alliance. Der Verband sollte die Verbreitung offener Virtualisierungstechniken, insbesondere KVM, fördern und Unternehmen über deren Einsatz informieren. Seine Aufgaben ergänzten die Arbeit der bestehenden Entwicklergemeinschaften.[7]

Die Weiterentwicklung von KVM erfolgt im Rahmen des Linux-Kernel-Projekts. Dessen Maintainer-Verzeichnis weist sowohl Zuständigkeiten für das gemeinsame KVM-Subsystem als auch für einzelne Prozessorarchitekturen aus.[8] KVM wird mit dem Linux-Kernel veröffentlicht; der früher gesondert entwickelte QEMU-KVM-Zweig ging in QEMU auf. Seit QEMU 1.3 ist dessen Userspace-Komponente Bestandteil des QEMU-Hauptprojekts.[1] Der KVM-Kernelcode steht unter der GNU General Public License, Version 2.[9]

Außerhalb von Linux entstanden ebenfalls Portierungen. Das FreeBSD-Projekt berichtete 2007 über eine Portierung als ladbares Kernelmodul mit angepasstem QEMU.[10] Joyent stellte 2011 eine KVM-Portierung für das auf illumos beruhende SmartOS vor.[11]

Architektur

Zusammenwirken von KVM im Linux-Kernel und Programmen im Userspace

Kernel und Userspace

Auf x86-Systemen besteht KVM aus dem gemeinsamen Kernelmodul kvm.ko und einer prozessorspezifischen Komponente: kvm-intel.ko für Intel VT-x beziehungsweise kvm-amd.ko für AMD-V.[1] Die Schnittstelle zum Userspace ist über die Gerätedatei /dev/kvm zugänglich. Mit ioctl-Aufrufen kann ein Programm eine virtuelle Maschine und deren virtuelle Prozessoren anlegen, Speicherbereiche zuordnen und Gastcode ausführen. Die Schnittstelle unterscheidet Operationen für das gesamte Subsystem, einzelne virtuelle Maschinen, virtuelle Prozessoren und Geräte.[12]

Virtuelle Maschinen werden auf dem Host durch Linux-Prozesse und ihre Ausführungseinheiten repräsentiert. Für die Zuteilung von Rechenzeit verwendet KVM den Linux-Scheduler. Auch Speicherverwaltung und weitere Betriebssystemfunktionen des Hosts werden für die Virtualisierung genutzt.[13] Abhängig von Architektur und Konfiguration stellt KVM außerdem Gerätemodelle im Kernel bereit, etwa für Interrupt-Controller.[12]

QEMU ergänzt diese Infrastruktur um virtuelle Rechnerplattformen, Speichergeräte, Netzwerkschnittstellen und weitere Peripherie. Es kann Geräte emulieren, paravirtualisierte Geräte bereitstellen oder geeignete physische Geräte an einen Gast durchreichen. KVM ist einer von mehreren Beschleunigern, die QEMU unterstützt. Mit dem Tiny Code Generator (TCG) kann QEMU Prozessoren auch vollständig in Software emulieren.[2] QEMU ergänzt diese Infrastruktur um virtuelle Rechnerplattformen und Geräte. KVM ist einer von mehreren Beschleunigern, die QEMU unterstützt. Mit dem Tiny Code Generator (TCG) kann QEMU Prozessoren auch vollständig in Software emulieren.[2]

Prozessor- und Speichervirtualisierung

Bei hardwaregestützter Virtualisierung läuft Gastcode unmittelbar auf dem Prozessor des Hosts. KVM setzt daher eine zum Host kompatible Gastarchitektur voraus; die Emulation einer fremden Prozessorarchitektur ist eine andere Betriebsart, die QEMU beispielsweise mit TCG bereitstellt.[14][15]

Zur Speichervirtualisierung bildet KVM die aus Sicht des Gasts physischen Speicheradressen auf den Speicher des Hosts ab. Auf x86 unterstützt es dafür unter anderem Intels Extended Page Tables (EPT) und AMDs Nested Page Tables (NPT). Der KVM-Code zur Speicherverwaltung arbeitet mit der Linux-Speicherverwaltung zusammen, sodass beispielsweise große Speicherseiten und das Verschieben von Speicherseiten unterstützt werden. Das Erfassen veränderter Speicherseiten ermöglicht die Übertragung des Gastzustands bei einer Live-Migration.[16]

Unterstützte Plattformen und Gastsysteme

KVM wurde zunächst für x86 entwickelt. Die Kernel-Schnittstelle unterstützt auch weitere Architekturen, darunter Arm64, PowerPC, IBM Z, RISC-V und LoongArch. Welche Funktionen verfügbar sind, unterscheidet sich nach Architektur und Hardware; Programme können Erweiterungen der KVM-Schnittstelle zur Laufzeit abfragen.[12]

Mit einer passenden virtuellen Rechnerplattform können unter anderem unveränderte Linux- und Windows-Systeme als Gäste betrieben werden.[1] Die Auswahl des Gastsystems hängt außer von der Prozessorarchitektur auch von den bereitgestellten Geräten und deren Treiberunterstützung ab. QEMU bietet hierfür verschiedene Maschinenmodelle; andere KVM-nutzende Programme beschränken sich teilweise auf bestimmte Gasttypen und wenige virtuelle Geräte.[2][3]

Funktionen

Paravirtualisierte Ein- und Ausgabe

Für die Ein- und Ausgabe kommen häufig Virtio-Geräte zum Einsatz. Virtio ist ein offener Standard für die Kommunikation zwischen Gerät und Treiber. Bei virtualisierten Geräten arbeitet ein Treiber im Gast mit einer Geräteimplementierung auf dem Host zusammen. Der Datenaustausch erfolgt wesentlich über gemeinsame Speicherbereiche und Warteschlangen, die Virtqueues. Dadurch muss nicht das Verhalten eines bestimmten physischen Geräts vollständig nachgebildet werden.[17]

QEMU stellt zahlreiche Virtio-Geräte bereit. Teile der Geräteverarbeitung können auch außerhalb des QEMU-Prozesses ausgeführt werden; für Virtio-Geräte dient hierzu unter anderem die Schnittstelle vhost-user.[2] Diese Paravirtualisierung der Ein- und Ausgabe lässt sich mit der hardwaregestützten Virtualisierung der Prozessoren kombinieren.

Durchreichen physischer Geräte

Physische Geräte können einer virtuellen Maschine direkt zugewiesen werden, etwa um deren native Gerätetreiber zu nutzen oder den Aufwand der Geräteemulation zu vermeiden. Unter Linux stellt dafür insbesondere VFIO eine Schnittstelle bereit. Eine IOMMU begrenzt die Speicherbereiche, auf die ein zugewiesenes Gerät zugreifen darf. Welche Geräte sich getrennt zuweisen lassen, hängt unter anderem von der Isolation durch die Hardware und der Zuordnung zu IOMMU-Gruppen ab.[18]

Live-Migration und Zustandsverwaltung

In Verbindung mit QEMU und geeigneten Verwaltungswerkzeugen lassen sich laufende virtuelle Maschinen zwischen Hosts verschieben. Bei einer Live-Migration wird ein großer Teil des Zustands übertragen, während der Gast weiterläuft. Für die Übergabe des restlichen Zustands wird seine Ausführung kurz angehalten. Die dafür benötigte Zeit hängt von der Konfiguration und der zu übertragenden Datenmenge ab. QEMU stellt auch Funktionen zum Speichern und Wiederherstellen eines Gastzustands bereit; dabei müssen die virtuellen Geräte auf Quell- und Zielseite kompatibel sein.[19] In Verbindung mit QEMU und geeigneten Verwaltungswerkzeugen lassen sich laufende virtuelle Maschinen zwischen Hosts verschieben. Bei einer Live-Migration nach dem Precopy-Verfahren wird ein großer Teil des Zustands übertragen, während der Gast weiterläuft. Für die Übergabe des restlichen Zustands wird seine Ausführung kurz angehalten. Die dafür benötigte Zeit hängt von der Konfiguration und der zu übertragenden Datenmenge ab. QEMU stellt auch Funktionen zum Speichern und Wiederherstellen eines Gastzustands bereit; dabei müssen die virtuellen Geräte auf Quell- und Zielseite kompatibel sein.[19]

Verschachtelte Virtualisierung

KVM unterstützt Nested Virtualization, also den Betrieb eines Hypervisors innerhalb einer virtuellen Maschine. Ein Gast kann dadurch selbst weitere Gäste ausführen. Einsatzgebiete sind beispielsweise Testumgebungen und Werkzeuge, die zum Erstellen von Systemabbildern eigene virtuelle Maschinen starten. Bei x86 ist die entsprechende KVM-Option seit Linux 4.20 für Intel- und AMD-Prozessoren standardmäßig aktiviert; Distributionen können andere Voreinstellungen wählen. Die tatsächliche Nutzbarkeit hängt außerdem von der Hardware und den dem Gast bereitgestellten Prozessorfunktionen ab.[20]

Programme zur Ausführung und Verwaltung

Virtual Machine Monitors

Neben QEMU verwenden mehrere eigenständige Virtual Machine Monitors (VMMs) die KVM-Schnittstelle. Sie unterscheiden sich insbesondere darin, welche virtuellen Geräte, Gastsysteme und Verwaltungsfunktionen sie bereitstellen:

  • Firecracker ist auf MicroVMs für Serverless Computing und Containeranwendungen ausgerichtet. Sein Gerätemodell ist auf wenige Komponenten beschränkt. Das Projekt wurde bei Amazon Web Services unter anderem für AWS Lambda und AWS Fargate entwickelt.[3][21]
  • Cloud Hypervisor ist ein in Rust entwickelter VMM mit Schwerpunkt auf Cloud-Arbeitslasten und paravirtualisierten Geräten. Er unterstützt neben KVM auch den Microsoft Hypervisor über MSHV.[22]
  • crosvm nutzt die KVM-Schnittstelle unter anderem im Android Virtualization Framework. Der ebenfalls in Rust geschriebene VMM verwendet Sandbox-Verfahren zur Begrenzung der Rechte seiner Geräteimplementierungen.[23]
  • kvmtool ist ein schlankes Werkzeug zum Ausführen von KVM-Gästen und dient auch als überschaubare Referenzimplementierung.[15]
  • kvmtool ist ein schlankes Werkzeug zum Ausführen von KVM-Gästen.[15]

Verwaltungswerkzeuge und Plattformen

Einordnung von KVM in die von libvirt unterstützten Virtualisierungstechniken

libvirt bietet eine Programmierschnittstelle und Dienste zur Verwaltung verschiedener Virtualisierungstechniken. Sein QEMU-Treiber unterstützt den Betrieb von QEMU mit KVM.[24] Darauf bauen unter anderem das Kommandozeilenprogramm virsh, die Desktopoberfläche virt-manager und die Weboberfläche Cockpit Machines auf.[25][26][27]

Proxmox VE verbindet die Verwaltung von KVM-basierten virtuellen Maschinen und LXC-Containern in einer Plattform mit Weboberfläche. Sie umfasst außerdem Funktionen für Cluster, Speicher, Netzwerke und Hochverfügbarkeit.[28] Im Compute-Dienst Nova von OpenStack ist KVM als Standardhypervisor vorgesehen; die Anbindung erfolgt über den libvirt-Treiber.[29]

KubeVirt ergänzt Kubernetes um die Verwaltung virtueller Maschinen. Es integriert deren Bereitstellung und Lebenszyklus in die Kubernetes-Schnittstellen und ermöglicht den gemeinsamen Betrieb virtueller Maschinen und containerisierter Anwendungen. Für die Virtualisierung wird dabei KVM verwendet.[30]

Einsatzgebiete

KVM-basierte Virtualisierung wird für Server- und Desktopvirtualisierung sowie für Cloud- und Virtual-Private-Server-Angebote eingesetzt.[31] Google Compute Engine verwendet einen von Google angepassten und sicherheitsgehärteten KVM-basierten Hypervisor.[32] Bei Amazon Web Services basiert der Nitro Hypervisor auf Kerntechnologie von Linux/KVM. Seine Aufgaben konzentrieren sich auf die Isolation von Prozessor- und Speicherressourcen; Netzwerk- und Speicherfunktionen übernehmen separate Nitro-Karten.[33]

Ein weiteres Einsatzgebiet ist die Isolation von Code auf mobilen Geräten. Das Android Virtualization Framework kombiniert hierfür unter anderem protected KVM (pKVM) und crosvm.[34]

Sicherheit und geschützte virtuelle Maschinen

Zur Absicherung einer QEMU/KVM-Umgebung gehören neben der Isolation im Hypervisor auch Beschränkungen der Userspace-Prozesse. Fehler in emulierten Geräten können es einem Gast ermöglichen, Code im Kontext des QEMU-Prozesses auszuführen. Als zusätzliche Schutzmechanismen dienen unter anderem unprivilegierte Benutzerkonten, SELinux oder AppArmor, Cgroups, Linux-Namespaces und Seccomp. Diese begrenzen den Zugriff auf Hostressourcen und werden teilweise durch Verwaltungssoftware wie libvirt eingerichtet.[31]

Für Confidential Computing stellt KVM Schnittstellen zu hardwaregestützten Schutzmechanismen bereit. Auf geeigneten AMD-Prozessoren unterstützt es Secure Encrypted Virtualization (SEV) einschließlich SEV-SNP. SEV verschlüsselt den Speicher virtueller Maschinen mit jeweils eigenen Schlüsseln.[35] Für Intel Trust Domain Extensions (TDX) bietet KVM ebenfalls eine Schnittstelle zur Einrichtung und Ausführung geschützter Gäste. TDX soll deren Zustand auch gegenüber dem Host abschirmen.[36]

Auf Arm64 verfolgt protected KVM einen entsprechenden Isolationsansatz. Im Android Virtualization Framework schränkt pKVM den Zugriff des Hostkernels auf geschützte Gäste ein; eine privilegierte Hypervisorkomponente kontrolliert dazu insbesondere die Speicherzuordnung.[23] Der Entwicklungsstand im allgemeinen Linux-Kernel ist davon zu unterscheiden: Dessen Dokumentation kennzeichnet pKVM als experimentell und nennt noch nicht implementierte Isolationsfunktionen, darunter den Schutz des Prozessorzustands und die DMA-Isolation.[37]

Siehe auch

Literatur

  • Christoph Arnold, Michel Rode, Jan Sperling, Andreas Steil: KVM Best Practices. Virtualisierungslösungen für den Enterprise-Bereich. dpunkt-Verlag, Heidelberg 2012, ISBN 978-3-89864-737-3.

Einzelnachweise

Related Articles

Timelines

Top Qs

Fact Checks