Kernel-based Virtual Machine (KVM)#
KVM ist eine Virtualisierungs-Lösung, die vor etwa drei Jahren (Oktober 2006) in den Linux-Kernel (Version 2.6.20) integriert wurde.
Ich habe heute meine ersten Versuche damit gemacht: Es sieht sehr vielversprechend und unkompliziert aus.
Voraussetzung ist allerdings ein Prozessor, der die Virtualisierung durch Hardware unterstützt.
Installation unter Debian Squeeze#
Die erste Installation habe ich mit Debian Lenny nach einem Artikel auf Howto-Forge vorgenommen.
Die Schritte im Einzelnen:
Installation #
Host-System#
Installation eines minimalen Debian-System auf dem Server. Ich nutze den Logical Volume Manager, um später Volumes als Festplatten für die virtuellen Server anlegen zu können.
Hardware-Unterstützung#
Dann prüfe, ob der Prozessor wirklich KVM unterstützt:
# egrep '(vmx|svm)' --color=always /proc/cpuinfo
Wenn die Ausgabe leer bleibt, unterstützt der Prozessor die Virtualisierung nicht. Dann hilft nur eine andere Virtualisierungs-Lösung.
KVM Pakete installieren#
# aptitude install kvm-qemu libvirt-bin virtinst bridge-utils
Einen ersten Test kann man durchführen mit:
# virsh list Id Name State ----------------------------------
Wenn nicht die leere Liste mit virtuellen System angezeigt wird, stimmt irgendetwas nicht.
Bridge einrichten#
Damit die virtuellen Server später ans Netzwerk kommen, wird an dieser Stelle eine (Netzwerk-) Bridge eingerichtet.
Dazu die Konfiguration in /etc/network/interfaces:
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet manual # bridge auto br0 iface br0 inet static address 192.168.1.10 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off
Die Netzwerkadressen müssen natürlich den Gegebenheiten des lokalen Netzwerks angepasst werden.
Nach einem Neustart des Netzwerks (/etc/init.d/networking restart) sollte die Ausgabe von ifconfig etwa so aussehen:
# ifconfig br0 Link encap:Ethernet Hardware Adresse 00:1d:92:70:66:20 inet Adresse:192.168.1.10 Bcast:192.168.1.255 Maske:255.255.255.0 inet6-Adresse: fe80::21d:92ff:fe70:6620/64 Gültigkeitsbereich:Verbindung UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1 RX packets:475 errors:0 dropped:0 overruns:0 frame:0 TX packets:266 errors:0 dropped:0 overruns:0 carrier:0 Kollisionen:0 Sendewarteschlangenlänge:0 RX bytes:35080 (34.2 KiB) TX bytes:36790 (35.9 KiB) eth0 Link encap:Ethernet Hardware Adresse 00:1d:92:70:66:20 inet6-Adresse: fe80::21d:92ff:fe70:6620/64 Gültigkeitsbereich:Verbindung UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1 RX packets:475 errors:0 dropped:0 overruns:0 frame:0 TX packets:272 errors:0 dropped:0 overruns:0 carrier:0 Kollisionen:0 Sendewarteschlangenlänge:100 RX bytes:41730 (40.7 KiB) TX bytes:37258 (36.3 KiB) Speicher:fdde0000-fde00000 lo Link encap:Lokale Schleife inet Adresse:127.0.0.1 Maske:255.0.0.0 inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine UP LOOPBACK RUNNING MTU:16436 Metrik:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 Kollisionen:0 Sendewarteschlangenlänge:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Virtuellen Server einrichten#
Dateisystem anlegen#
Zuerst lege ich eine Logical Volume an, die meinem virtuellen Server als Festplatte dienen soll.
Das folgende Kommando legt eine Volume vserv01 in der Volume Group vgroup an. Die Größe ist 20 GByte.
# lvcreate -n vserv01 -L 20G vgroup
Debian installieren#
Das Schöne ist, dass man das neue System einfach so von CD installieren kann. Ich lege eine Debian-Netzinstallations-CD in das CD Laufwerk des Servers ein und rufe auf:
virt-install -n vserv01 -r 512 --vcpus=2 \ --disk path=/dev/mapper/vgroup-vserv01 -c /dev/cdrom --vnc --noautoconsole \ --os-type linux --os-variant debianSqueeze --accelerate --network=bridge:br0 \ --hvm
Das Kommando startet einen VNC-Server, über den der grafische Debian-Installer zur Installation des Gastes genutzt werden kann. Der VNC-Server lauscht allerdings nur am localhost-Interface, so dass man z.B. einen ssh-Tunnel braucht, um von einem anderen Rechner heranzukommen:
# ssh -L 192.168.1.10:5900:localhost:5900 localhost