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
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)
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)
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).
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.
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.
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.
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.
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.
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