Kernel-based Virtual Machine
| Kernel-based Virtual Machine | |
|---|---|
Mehrere Gastsysteme auf einem Linux-Rechner | |
| Basisdaten | |
| Hauptentwickler | KVM-Entwicklergemeinschaft |
| Entwickler | ursprünglich Qumranet |
| Erscheinungsjahr | 2006 |
| Betriebssystem | Linux |
| Programmiersprache | C |
| Kategorie | Hypervisor |
| Lizenz | GNU GPL, Version 2 |
| www.linux-kvm.org | |
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]
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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]
Kernel und Userspace
[Bearbeiten | Quelltext bearbeiten]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 Code des Gastes ausführen. Die Schnittstelle unterscheidet Operationen für das gesamte Subsystem, einzelne virtuelle Maschinen, virtuelle Prozessoren und Geräte.[12]
Auf dem realen Rechner (Host) werden virtuelle Maschinen durch Linux-Prozesse und virtuelle Prozessoren durch Threads repräsentiert. Für die Zuteilung von Rechenzeit verwendet KVM den Linux-Scheduler. Auch die 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
[Bearbeiten | Quelltext bearbeiten]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. QEMU unterstützt auch andere Hypervisoren. Mit dem Tiny Code Generator (TCG) kann QEMU außerdem Prozessoren vollständig in Software emulieren, wodurch vom Host abweichende Prozessorarchitekturen im Gast möglich sind.[14][2]
Hardwareunterstützte Virtualisierung
[Bearbeiten | Quelltext bearbeiten]KVM nutzt die Unterstützung der Virtualisierung durch den Prozessor des Hosts. Bei der x86-Virtualisierung ist das Intel VT-x oder AMD-V. Der Prozessor des Hosts führt den Code des Gastes unmittelbar aus. Deshalb setzt KVM eine zum Host kompatible Prozessorarchitektur des Gastes voraus.[15] KVM bildet die aus Sicht des Gastes physischen Speicheradressen auf den Speicher des Hosts ab. Bei der x86-Architektur nutzt KVM dafür die Second Level Address Translation von Intel (Extended Page Tables) und AMD (Rapid Virtualization Indexing).
Speicherverwaltung
[Bearbeiten | Quelltext bearbeiten]Die Speicherverwaltungen von KVM und Linux kooperieren, 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
[Bearbeiten | Quelltext bearbeiten]KVM wurde zunächst für die x86-Architektur 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
[Bearbeiten | Quelltext bearbeiten]Paravirtualisierte Ein- und Ausgabe
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]Virtual Machine Monitors
[Bearbeiten | Quelltext bearbeiten]Neben QEMU verwenden mehrere eigenständige Virtual Machine Monitors (VMMs) d. h. Hypervisoren 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]
Verwaltungswerkzeuge und Plattformen
[Bearbeiten | Quelltext bearbeiten]
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
[Bearbeiten | Quelltext bearbeiten]KVM-basierte Virtualisierung wird für Server- und Desktop-Virtualisierung 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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]Literatur
[Bearbeiten | Quelltext bearbeiten]- 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.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Website und Wiki des KVM-Projekts (englisch)
- KVM-Dokumentation des Linux-Kernels (englisch)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- 1 2 3 4 5 Kernel Virtual Machine. KVM-Projekt, abgerufen am 12. September 2026 (englisch).
- 1 2 3 4 Introduction. In: QEMU documentation. Abgerufen am 12. September 2026 (englisch).
- 1 2 3 Firecracker. Firecracker-Projekt, abgerufen am 12. September 2026 (englisch).
- ↑ Avi Kivity: [PATCH 0/7] KVM: Kernel-based Virtual Machine. In: Linux Kernel Mailing List. 19. Oktober 2006, abgerufen am 12. September 2026 (englisch).
- ↑ Linux 2.6.20. In: Linux-Kernel-Quellarchiv. 4. Februar 2007, abgerufen am 12. September 2026 (englisch).
- ↑ Red Hat Advances Virtualization Leadership with Qumranet, Inc. Acquisition. Red Hat, 4. September 2008, abgerufen am 12. September 2026 (englisch).
- ↑ BMC Software, Eucalyptus, HP, IBM, Intel, Red Hat and SUSE Create Open Virtualization Alliance. In: PR Newswire. Open Virtualization Alliance, 17. Mai 2011, abgerufen am 12. September 2026 (englisch).
- ↑ MAINTAINERS. In: Linux-Kernel-Quelltext. Abgerufen am 12. September 2026 (englisch).
- ↑ virt/kvm/kvm_main.c. In: Linux-Kernel-Quelltext. Abgerufen am 12. September 2026 (englisch).
- ↑ Porting Linux KVM to FreeBSD. In: FreeBSD Quarterly Status Report, July–October 2007. The FreeBSD Project, abgerufen am 12. September 2026 (englisch).
- ↑ Why SmartOS – ZFS, KVM, DTrace, Zones and More. In: SmartOS Documentation. Abgerufen am 12. September 2026 (englisch).
- 1 2 3 The Definitive KVM (Kernel-based Virtual Machine) API Documentation. In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ What is KVM? Red Hat, 16. April 2026, abgerufen am 12. September 2026 (englisch).
- ↑ About QEMU. In: QEMU documentation. Abgerufen am 12. September 2026 (englisch).
- 1 2 Native Linux KVM tool. kvmtool-Projekt, abgerufen am 12. September 2026 (englisch).
- ↑ The x86 kvm shadow mmu. In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Virtio on Linux. In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ VFIO – Virtual Function I/O. In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- 1 2 Migration framework. In: QEMU documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Running nested guests with KVM. In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Firecracker. In: Projekt-Repository. Abgerufen am 12. September 2026 (englisch).
- ↑ Cloud Hypervisor. In: Projekt-Repository. Abgerufen am 12. September 2026 (englisch).
- 1 2 AVF architecture. Android Open Source Project, abgerufen am 12. September 2026 (englisch).
- ↑ QEMU/KVM/HVF hypervisor driver. libvirt-Projekt, abgerufen am 12. September 2026 (englisch).
- ↑ virsh – management user interface. libvirt-Projekt, abgerufen am 12. September 2026 (englisch).
- ↑ Manage virtual machines with virt-manager. virt-manager-Projekt, abgerufen am 12. September 2026 (englisch).
- ↑ Cockpit Machines. In: Projekt-Repository. Abgerufen am 12. September 2026 (englisch).
- ↑ Features – Proxmox Virtual Environment. Proxmox Server Solutions, abgerufen am 12. September 2026 (englisch).
- ↑ KVM. In: Nova documentation. OpenStack, abgerufen am 12. September 2026 (englisch).
- ↑ Architecture. In: KubeVirt user guide. Abgerufen am 12. September 2026 (englisch).
- 1 2 Security. In: QEMU documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ About nested virtualization. In: Google Cloud Documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Amazon EC2 FAQs. Amazon Web Services, abgerufen am 12. September 2026 (englisch).
- ↑ Android Virtualization Framework (AVF) overview. Android Open Source Project, abgerufen am 12. September 2026 (englisch).
- ↑ Secure Encrypted Virtualization (SEV). In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Intel Trust Domain Extensions (TDX). In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).
- ↑ Protected KVM (pKVM). In: The Linux Kernel documentation. Abgerufen am 12. September 2026 (englisch).