Tutorials - KVM-Tutorial

Sprachenübersicht/Betriebssysteme/Linux/System

KVM-Tutorial

Diese Seite wurde 24201 mal aufgerufen.

Dieser Artikel wurde in einem Wikiweb System geschrieben, das heißt, Sie können die Artikel jederzeit editieren, wenn Sie einen Fehler gefunden haben, oder etwas hinzufügen wollen.

Editieren Versionen Linkpartnerschaft Bottom Printversion

Keywords: kvm linux virtualization gentoo tutorial howto

Inhaltsverzeichnis



Vorwort Top


Da Sie es vermutlich schon wissen - hier die Vorzüge der Server-Virtualisierung in aller Kürze:

  • weniger Server -> weniger Anschaffungs-, Platz-, Kühlungs- und Stromkosten, weniger Hardware die ausfallen kann


  • einfache Migration von virtuellen Systemen


  • einfaches Kopieren und Löschen von Systemen (z.B. für Tests)



Begriffsdefinition Top


Da vielfach Begriffe mehrdeutig verwendet werden können, hier eine kurze Definition wie sie in diesem Tutorial verwendet werden.

  • Host - Computer-System mit vollem Zugriff auf Hardware


  • Gast - Computer-System mit eingeschränktem Zugriff auf Hardware (virtualisiert)



Warum KVM? Top


Doch wo liegt der Vorteil von KVM wenn Xen bereits von vielen Distributionen unterstützt wird und eine wesentlich größere Feature-Liste aufweisen kann?
Xen benötigt einen Hypervisor, also eine Schicht zwischen Hardware und Betriebssystem. Der eigentliche Host, welcher mit vollen Rechten auf die Hardware zugreifen darf ist somit auch virtualisiert (Dom 0). Im Gegensatz dazu ist bei KVM der Virtualisierer der Kernel des Host selbst.

Bei KVM wird eine virtuelle Maschine in einer modifizierten QEMU-Version gestartet, welches dann mit der KVM-Schnittstelle des Kernels kommuniziert.

Ein entscheidender Vorteil von KVM ist, dass es seit Version 2.6.20 im offiziellen Linux-Kernel aufgenommen ist. Da es sich auf die Virtualisierungsfunktionen von modernen Prozessoren stützt, ist der Code-Umfang wesentlich geringer als bei vergleichbaren Alternativen.

Für die Schnittstellen (Festplatte, Netzwerk) gibt es mitlerweile paravirtualisierte Treiber im Linux-Kernel welche wesentlich performanter sind als die Emulation einer echten Hardware (z.B. virtio statt Intel e1000 als virtuelle Netzwerkkarte).

Installation Top


Aufgrund ständig aktualisierter Pakete und einfacher Integration von externen Repositories hab ich mich für Gentoo als Host-System entschieden. Die Anweisungen beziehen sich daher auf typische Werkzeuge der Distribution. Erfahrene Nutzer anderer Distributionen können vermutlich den hier gezeigten Lösungsweg für sie adaptieren.

Hinweis: inzwischen wurde KVM offiziell in Gentoo aufgenommen

Zunächst sollte der Kernel des Host-System entsprechend angepasst werden.

Code:


cd /usr/src/linux
make menuconfig

Virtualization  --->
  [*]   Kernel-based Virtual Machine (KVM) support
    [ ]     KVM for Intel processors support                                         
    [*]     KVM for AMD processors support
  [*]   PCI driver for virtio devices (EXPERIMENTAL)                                                    
  [*]   Virtio balloon driver (EXPERIMENTAL)

make bzImage && make modules
make install && make modules_install



Anschließend können wir das ebuild auf stable-Systemen freischalten und installieren.

Code:


echo "app-emulation/kvm ~amd64" >> /etc/portage/package.keywords
echo "app-emulation/kvm ncurses" >> /etc/portage/package.use
emerge kvm screen



Die Installation von screen empfiehlt sich, um einfach laufende Gäste in den Hintergrund schicken zu können ohne auf den Konsolen-Zugriff verzichten zu müssen.

Installation aus den Quellen Top


Wer die aktuellsten Versionen von KVM testen möchte oder wessen Distribution keine (aktuellen) KVM-Pakete liefert, dem bleibt die Installation über git.

Unter Debian werden dazu build-essential und git-core benötigt.

Der aktuelle Kernel-Tree ist über git erreichbar. Er kann später mit einem kurzem git pull im Kernel-Verzeichnis aktualisiert werden.

Code:


cd /usr/src
git clone git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm.git linux-kvm
cd linux-kvm
cp /boot/config .config

make menuconfig



Danach den Kernel wie oben beschrieben konfigurieren.

Nach der Installation des Kernels müssen die Userspace-Tools installiert werden.

Code:


cd /usr/local/src
git clone git://git.kernel.org/pub/scm/virt/kvm/kvm-userspace.git
cd kvm-userspace
./configure --disable-gcc-check --with-patched-kernel --kerneldir=/usr/src/linux-kvm/ --prefix=/usr/local/kvm/ --disable-sdl --disable-gfx-check
make && make install



Erklärung

  • --disable-gcc-check lässt den Code auch mit GCC-4 (hier 4.2.2) kompilieren


  • --with-patched-kernel verhindert das Erstellen der Module, da diese bereits im Kernel enthalten sind


  • --kerneldir selbsterklärend


  • --prefix Installationsverzeichnis


  • --disable-sdl --disable-gfx-check auf einem Server ist meist keine grafische Oberfläche vorhanden



Diese befinden sich nun in /usr/local/kvm/bin - die Namen der einzelnen Befehle können sich dabei leicht unterscheiden (z.B. qemu-system-x86_64 statt kvm).

Um nicht ständig den ganzen Pfad zu den Werkzeugen angeben zu müssen, erstellen wir im /root-Verzeichnis folgende Datei.

/root/.profile:


PATH="/usr/local/kvm/bin:$PATH"



Durch erneutes Anmelden werden die Änderungen übernommen.

Ein Gast Top


Nun suchen wir uns einen Ort auf der Festplatte um dort dann die Image-Files der Gästs abzulegen. KVM/QEMU unterstützt mehrere Formate, welche verschiedene Vorteile bieten. raw scheint ein guter Kompromiss zu sein, da es mit dem Platzbedarf wachsen und über Loop ins Dateisystem eingebunden werden kann.

Code:


mkdir /srv
mkdir /srv/vguests
cd /srv/vguests
kvm-img create -f raw template.img 15G



Der letzte Befehl erstellt ein raw-Image, welches derzeit keinen Speicherplatz belegt sondern bis zu 15G wachsen kann. Die aktuelle Größe zeigt sich beim Aufruf von du -h template.img im Vergleich zu ls -lh template.img.

Bei Versuchen mit bestehenden Images konvertiert in qcow, qcow2 und raw zeigten sich keine Unterschiede beim belegten Speicherplatz.

Um jetzt eine Gentoo-Installation im Gast zu starten, brauchen wir zunächst die Installations-CD.

Code:


wget http://bouncer.gentoo.org/fetch/gentoo-2008.0-minimal/amd64/
screen kvm -curses -hda template.img -cdrom install-amd64-minimal-2008.0.iso -boot d



Nun sollte die QEMU von CD (iso) starten und man kann die gewohnte Gentoo-Installation durchführen.

Wer paravirtualisierte Schnittstellen verwenden möchte (empfohlen) muss im Kernel folgende Optionen aktivieren.

Code:


[*] Virtualization  --->
  [*]   PCI driver for virtio devices (EXPERIMENTAL)
  [*]   Virtio balloon driver (EXPERIMENTAL)

Device Drivers  --->
  [*] Block devices  --->
    [*]   Virtio block driver (EXPERIMENTAL)
  [*] Network device support  --->
    [*]   Virtio network driver (EXPERIMENTAL)



Zuerst müssen die Optionen im Virtualization-Menü aktiviert sein, damit die Device-Treiber aufscheinen.

Der balloon-Treiber dient dazu, den RAM während dem Betrieb zu vergrößern und verkleinern.

Mit der Verwendung des Virtio-Blockdevice-Treibers können alle anderen ATA-, SCSI- und SATA-Optionen und Netzwerk-Treiber deaktiviert werden.

Als letzte Änderung müssen in der fstab-Datei die Laufwerksbezeichnungen geändert werden.

Beispiel /etc/fstab:


/dev/vda2               /               xfs             noatime         0 1
/dev/vda1               none            swap            sw              0 0



Das gleiche gilt für die Grub-Konfiguration:

Beispiel /boot/grub/menu.lst:


default 0
timeout 10

title Gentoo Linux
root (hd0,1)
kernel /boot/vmlinuz root=/dev/vda2



Aufgrund der Darstellung der Konsole des virtuellen Gasts muss auf Splashscreens verzichtet werden.

Der Gast kann nach erledigter Arbeit mit einem gewohnten halt heruntergefahren werden.

Vorbereiten des Netzwerks Top


Damit die Gäste auf das Netzwerk genauso zugreifen können als wären sie direkt angeschlossen, muss eine Netzwerk-Bridge eingerichtet werden.

Im Kernel werden dazu zunächst das Bridge-, sowie das Tun/Tap-Modul benötigt.

Code:


cd /usr/src/linux
make menuconfig

Networking  --->
  Networking options  --->
    [*] 802.1d Ethernet Bridging
Device Drivers  --->
  [*] Network device support  --->
    [*]   Universal TUN/TAP device driver support

make bzImage && make modules
make install && make modules_install

emerge bridge-utils



Danach muss die Netzwerk-Konfiguration geändert werden. Alle Einstellungen für das aktive Netzwerkinterface (typischerweise eth0) werden zu virbr0. Für eth0 wird ein neuer Eintrag hinzugefügt.

Beispiel /etc/conf.d/net:


config_eth0=("null")
bridge_virbr0="eth0"

config_virbr0=("192.168.0.9 netmask 255.255.255.0")
routes_virbr0=("default via 192.168.0.1")
dns_domain_eth0="intern.example.net"
dns_servers_eth0="192.168.0.1"
dns_search_eth0="intern.example.net"



Damit nun nach einem Neustart die Bridge auch geladen wird, muss sie in den entsprechenden Runlevel eingetragen werden.

Code:


cd /etc/init.d
ln net.lo net.virbr0 -s
rc-update add net.virbr0 default



Im Ordner /etc/kvm sollte sich folgendes Startskript für die Netzwerkkonfiguration der Gäste befinden.

/etc/kvm/qemu-ifup:


#!/bin/sh

if [ -x /sbin/brctl ]; then
  BRCTL="/sbin/brctl"
elif [ -x /usr/sbin/brctl ]; then
  BRCTL="/usr/sbin/brctl"
else
  echo "no bridge utils installed"
  exit 1
fi

if [ -x /sbin/ip ]; then
  switch=$(/sbin/ip route list | awk '/^default / { print $NF }')
else
  switch=$(/bin/netstat -rn | awk '/^0\.0\.0\.0/ { print $NF }')
fi
/sbin/ifconfig $1 0.0.0.0 up
${BRCTL} addif ${switch} $1



Es empfiehlt sich nun einen Neustart durchzuführen um den neuen Kernel mit Bridge-Support zu laden und das automatische Hochfahren der Bridge zu testen.

Starten des Gasts Top


Um den Gast nach Abschluss der Installation zu starten dient folgender Befehl.

Code:


screen /usr/bin/kvm -drive file=/srv/vguests/template.img,if=virtio,boot=on -m 512 -smp 2 -k en-us -curses -net nic,model=virtio,macaddr=DE:AD:BE:EF:2D:AD -net tap



Die Zeile startet den Gast mit 512 MB RAM, 2 Prozessoren und englischem Keyboard (muss so sein, auch im Gast muss die englische ausgewählt werden, es wird dann ohnehin die des Gasts verwendet). Die MAC-Adresse muss sich bei jedem Gast unterschieden, es können die letzten 4 Hexadezimalziffern variiert werden.

Mit einem Strg + a + d wird der Screen in den Hintergrund geschickt und mit screen -r zurück in den Vordergrund geholt.

Schlusswort Top


Um die Gäste nicht ständig über lange kryptische Befehlszeilen starten zu müssen hat der Autor sich ein kleines Python-Script hierfür gebastelt. Sobald es einen stabilen Entwicklungsstand erreicht hat, wird er hier veröffentlicht.

Zum Verfassen dieses Howto's waren Informationen von gentoo-wiki.com/KVM und de.gentoo-wiki.com/KVM
sehr hilfreich. Sie bieten beide wiederum weitere lesenswerte Hinweise.

Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren?

Editieren Versionen Linkpartnerschaft Top Printversion

Haben Sie einen Fehler gefunden? Dann klicken Sie doch auf Editieren, und beheben den Fehler, keine Angst, Sie können nichts zerstören, das Tutorial kann wiederhergestellt werden

Sprachenübersicht/Betriebssysteme/Linux/System/KVM-Tutorial