»Nur wer seinen eigenen Weg geht, kann von niemandem überholt werden.« Marlon Brando (1924–2004), amerikanischer Schauspieler
23 Servervirtualisierung mit KVM
Was Sie in diesem Kapitel erwartet
In diesem Kapitel möchte ich Ihnen KVM, die Kernel-based Virtual Machine (kernel-basierte virtuelle Maschine), vorstellen. KVM hat es verdient, etwas ausführlicher behandelt zu werden. Dies liegt nicht nur daran, dass KVM die Standard-Virtualisierungslösung für Ubuntu ist. Ein anderer Grund für die nähere Betrachtung ist, dass KVM schnell Einzug in den offiziellen Linux-Kernel gehalten hat. Außerdem profitiert KVM enorm von der fortgeschrittenen Entwicklung des QEMU-Projekts. Seit Juni 2008 beherrscht KVM sogar die Technik der Paravirtualisierung. Wir werden uns in diesem Kapitel mit allen Besonderheiten dieser Technik beschäftigen.
Benötigtes Vorwissen
Sie sollten den grundlegenden Umgang mit der Shell beherrschen (siehe Abschnitt »Das Terminal«).
23.1 Allgemeines und Funktionsweise 

Die Ankündigung
Am 19. Oktober 2006 wurde ein Patch auf der Mailingliste der Kernel-Entwickler angekündigt. Dieser Patch implementierte die Schnittstelle /dev/kvm in den Kernel und ermöglichte die direkte Nutzung der Intel-Virtualisierungserweiterungen für die x86-Architektur.
Der Original-Wortlaut war folgender:
From: Avi Kivity <avi <at> qumranet.com> Subject: [PATCH 0/7] KVM: Kernel-based Virtual Machine Newsgroups: gmane.linux.kernel Date: 2006-10-19 13:45:49 GMT The following patchset adds a driver for Intel's hardware virtualization extensions to the x86 architecture. The driver adds a character device (/dev/kvm) that exposes the virtualization capabilities to userspace. Using this driver, a process can run a virtual machine (a "guest") in a fully virtualized PC containing its own virtual hard disks, network adapters, and display. Using this driver, one can start multiple virtual machines on a host. Each virtual machine is a process on the host; a virtual cpu is a thread in that process. kill(1), nice(1), top(1) work as expected. In effect, the driver adds a third execution mode to the existing two: we now have kernel mode, user mode, and guest mode. Guest mode has its own address space mapping guest physical memory (which is accessible to user mode by mmap()ing /dev/kvm). Guest mode has no access to any I/O devices; any such access is intercepted and directed to user mode for emulation. The driver supports i386 and x86_64 hosts and guests. All combinations are allowed except x86_64 guest on i386 host. For i386 guests and hosts, both pae and non-pae paging modes are supported. SMP hosts and UP guests are supported. At the moment only Intel hardware is supported, but AMD virtualization support is being worked on. (...)
Funktionsweise
KVM besteht aus zwei Komponenten:
- einem Gerätetreiber mit der Schnittstelle /dev/kvm zur Verwaltung der virtualisierten Hardware
- einem virtuellen PC auf der Basis von QEMU
Jede virtuelle Maschine ist ein regulärer Prozess, der vom Original-Linux-Scheduler verwaltet wird. Wie jeder normale Linux-Prozess hat auch er zwei Ausführungsmodi:
- den Kernel- und
- den User-Modus.
guest-mode
KVM fügt diesen beiden einen dritten Modus hinzu, den guest-mode. Dieser Gast-Modus hat seinen eigenen Kernel- und User-Modus. Ein moderner Prozessor mit Unterstützung von Virtualisierungstechniken ist dabei Grundvoraussetzung. Das Kernel-Modul von KVM ist seit Kernel 2.6.20 fester Bestandteil des Linux-Kernels.
Durch die QEMU-Basis können mit QEMU angelegte Images unter KVM unverändert weiterverwendet werden. Alles bereits zu QEMU Gesagte (siehe Abschnitt »QEMU«) gilt dementsprechend auch für KVM. Einzige Ausnahme: KQEMU (also die Parameter -no-kqemu und -kernel-kqemu) wird nicht unterstützt.
Ersatz für QEMU/KQEMU
KVM ist dabei ein vollständiger Ersatz für das Gespann QEMU/KQEMU. QEMU muss nicht installiert sein, um KVM zu nutzen. QEMU ist ein Prozess-Emulator, der von Fabrice Bellard entwickelt wird. Ich bin bereits in Abschnitt »QEMU« näher auf QEMU eingegangen.
Bestandteile von KVM sind folgende Kernel-Module:
1. | kvm.ko Das allgemeine KVM-Kernel-Modul lässt sich auch in ältere Kernel-Versionen integrieren. Aus eigenen Erfahrungen würde ich aber nicht weiter zurückgehen als bis zum Kernel 2.6.16. |
2. | kvm-intel.ko/kvm-amd.ko Dies sind die hardwarespezifischen Module, die abhängig von Ihrem Prozessor eingesetzt werden. |
Keine Emulation
KVM selbst nimmt keine Emulation vor, sondern stellt nur die Infrastruktur dazu bereit; ein modifiziertes QEMU ist derzeit die einzige Möglichkeit, diese zu nutzen. Nach dem Laden des Moduls arbeitet der Linux-Kernel selbst als Hypervisor für virtuelle Maschinen.
Als Gastsysteme unterstützt KVM diverse Systeme wie beispielsweise Linux (32 und 64 Bit), Windows (32 Bit), ReactOS, FreeDOS, Solaris und diverse BSD-Derivate. KVM läuft auch auf SMP-Hostsystemen – SMP-Gastsysteme sind ebenfalls möglich. Die Bestandteile von KVM sind Open-Source-Software und stehen unter verschiedenen Varianten der GPL.
Abbildung 23.1 Die Architektur von »KVM«