Virtualisierung · 8 min read · Jan 12, 2026

Virtualisierung mit KVM auf Ubuntu 12.04 LTS

Virtualisierung mit KVM auf Ubuntu 12.04 LTS

Version 1.0
Autor: Falko Timme
Folge mir auf Twitter

Dieser Leitfaden erklärt, wie Sie KVM installieren und verwenden können, um virtuelle Maschinen auf einem Ubuntu 12.04 LTS-Server zu erstellen und auszuführen. Ich werde zeigen, wie man bildbasierte virtuelle Maschinen erstellt und auch virtuelle Maschinen, die ein logisches Volume (LVM) verwenden. KVM steht für Kernel-basierte Virtual Machine und nutzt die Hardware-Virtualisierung, d.h. Sie benötigen eine CPU, die Hardware-Virtualisierung unterstützt, z.B. Intel VT oder AMD-V.

Ich gebe keine Garantie, dass dies bei Ihnen funktioniert!

1 Vorbemerkung

Ich verwende hier eine Maschine mit dem Hostnamen server1.example.com und der IP-Adresse 192.168.0.100 als meinen KVM-Host.

Da wir alle Schritte dieses Tutorials mit Root-Rechten ausführen werden, können wir entweder alle Befehle in diesem Tutorial mit dem String sudo voranstellen oder wir werden jetzt Root, indem wir eingeben

sudo su

2 Installation von KVM und vmbuilder

Überprüfen Sie zuerst, ob Ihre CPU Hardware-Virtualisierung unterstützt - wenn dies der Fall ist, sollte der Befehl

egrep '(vmx|svm)' --color=always /proc/cpuinfo

etwas anzeigen, z.B. so:

root@server1:~# egrep '(vmx|svm)' --color=always /proc/cpuinfo  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush  
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid  
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv  
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush  
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid  
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv  
root@server1:~#

Wenn nichts angezeigt wird, unterstützt Ihr Prozessor keine Hardware-Virtualisierung, und Sie müssen hier aufhören.

Um KVM und vmbuilder (ein Skript zur Erstellung von Ubuntu-basierten virtuellen Maschinen) zu installieren, führen wir aus

apt-get install ubuntu-virt-server python-vm-builder kvm-ipxe

Anschließend müssen wir den Benutzer, mit dem wir derzeit angemeldet sind (root), zur Gruppe libvirtd hinzufügen:

adduser `id -un` libvirtd  
adduser `id -un` kvm

Sie müssen sich abmelden und wieder anmelden, damit die neuen Gruppenmitgliedschaften wirksam werden.

Um zu überprüfen, ob KVM erfolgreich installiert wurde, führen Sie aus

virsh -c qemu:///system list

Es sollte etwas wie folgt anzeigen:

root@server1:~# virsh -c qemu:///system list  
 Id Name                 State  
----------------------------------  
  
root@server1:~#

Wenn stattdessen ein Fehler angezeigt wird, ist etwas schiefgelaufen.

Als nächstes müssen wir auf unserem Server eine Netzwerkbrücke einrichten, damit unsere virtuellen Maschinen von anderen Hosts wie physische Systeme im Netzwerk erreicht werden können.

Um dies zu tun, installieren wir das Paket bridge-utils…

apt-get install bridge-utils

… und konfigurieren eine Brücke. Öffnen Sie /etc/network/interfaces:

vi /etc/network/interfaces

Vor der Änderung sieht meine Datei wie folgt aus:

| # Diese Datei beschreibt die verfügbaren Netzwerkinterfaces auf Ihrem System # und wie man sie aktiviert. Für weitere Informationen siehe interfaces(5). # Das Loopback-Netzwerkinterface auto lo iface lo inet loopback # Das primäre Netzwerkinterface auto eth0 iface eth0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameservers 8.8.8.8 8.8.4.4 |

Ich ändere es so, dass es wie folgt aussieht:

| # Diese Datei beschreibt die verfügbaren Netzwerkinterfaces auf Ihrem System # und wie man sie aktiviert. Für weitere Informationen siehe interfaces(5). # Das Loopback-Netzwerkinterface auto lo iface lo inet loopback # Das primäre Netzwerkinterface auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.0.100 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 dns-nameservers 8.8.8.8 8.8.4.4 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off |

(Stellen Sie sicher, dass Sie die richtigen Einstellungen für Ihr Netzwerk verwenden!)

Starten Sie das Netzwerk neu…

/etc/init.d/networking restart

… und führen Sie aus

ifconfig

Es sollte jetzt die Netzwerkbrücke (br0) anzeigen:

root@server1:~# ifconfig  
br0       Link encap:Ethernet  HWaddr 00:1e:90:f3:f0:02  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0  
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:29 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:1934 (1.9 KB)  TX bytes:2844 (2.8 KB)  
  
eth0      Link encap:Ethernet  HWaddr 00:1e:90:f3:f0:02  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:44613 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:23445 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000  
          RX bytes:63663064 (63.6 MB)  TX bytes:1792940 (1.7 MB)  
          Interrupt:41 Base address:0xa000  
  
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0  
          inet6 addr: ::1/128 Scope:Host  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  
  
virbr0    Link encap:Ethernet  HWaddr 2a:4a:49:13:de:8f  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1  
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0  
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  
  
root@server1:~#

Bevor wir unsere erste virtuelle Maschine starten, empfehle ich, das System neu zu starten:

reboot

Wenn Sie dies nicht tun, erhalten Sie möglicherweise einen Fehler wie open /dev/kvm: Permission denied in den Protokollen der virtuellen Maschine im Verzeichnis /var/log/libvirt/qemu/.

3 Erstellen einer bildbasierten VM

Wir können jetzt unsere erste VM erstellen - eine bildbasierte VM (wenn Sie mit viel Verkehr und vielen Lese- und Schreibvorgängen für diese VM rechnen, verwenden Sie stattdessen eine LVM-basierte VM, wie in Kapitel 6 gezeigt - bildbasierte VMs sind stark auf die Festplatten-I/O angewiesen).

Ich möchte meine virtuellen Maschinen im Verzeichnis /var/lib/libvirt/images/ erstellen (sie können nicht im /root-Verzeichnis erstellt werden, da der libvirt-qemu-Benutzer keine Leseberechtigungen in diesem Verzeichnis hat).

Wir werden ein neues Verzeichnis für jede VM erstellen, die wir erstellen möchten, z.B. /var/lib/libvirt/images/vm1, /var/lib/libvirt/images/vm2, /var/lib/libvirt/images/vm3 usw., da jede VM ein Unterverzeichnis namens ubuntu-kvm haben wird, und offensichtlich kann es nur ein solches Verzeichnis in /var/lib/libvirt/images/vm1 geben, zum Beispiel. Wenn Sie versuchen, eine zweite VM in /var/lib/libvirt/images/vm1 zu erstellen, erhalten Sie eine Fehlermeldung, dass ubuntu-kvm bereits existiert (es sei denn, Sie führen vmbuilder mit dem Argument –dest=DESTDIR aus):

root@server1:/var/lib/libvirt/images/vm1# vmbuilder kvm ubuntu -c vm2.cfg  
2009-05-07 16:32:44,185 INFO     Cleaning up  
ubuntu-kvm bereits vorhanden  
root@server1:/var/lib/libvirt/images/vm1#

Wir werden das vmbuilder-Tool verwenden, um VMs zu erstellen. (Sie können hier mehr über vmbuilder erfahren.) vmbuilder verwendet eine Vorlage zur Erstellung virtueller Maschinen - diese Vorlage befindet sich im Verzeichnis /etc/vmbuilder/libvirt/. Zuerst erstellen wir eine Kopie:

mkdir -p /var/lib/libvirt/images/vm1/mytemplates/libvirt  
cp /etc/vmbuilder/libvirt/* /var/lib/libvirt/images/vm1/mytemplates/libvirt/

Jetzt kommen wir zur Partitionierung unserer VM. Wir erstellen eine Datei namens vmbuilder.partition…

vi /var/lib/libvirt/images/vm1/vmbuilder.partition

… und definieren die gewünschten Partitionen wie folgt:

| root 8000 swap 4000 --- /var 20000 |

Dies definiert eine Root-Partition (/) mit einer Größe von 8000MB, eine Swap-Partition von 4000MB und eine /var-Partition von 20000MB. Die —-Zeile sorgt dafür, dass die folgende Partition (/var in diesem Beispiel) auf einem separaten Festplattenimage liegt (d.h. dies würde zwei Festplattenimages erstellen, eines für root und swap und eines für /var). Natürlich können Sie beliebige Partitionen definieren (solange Sie auch root und swap definieren), und natürlich können sie in nur einem Festplattenimage liegen - dies ist nur ein Beispiel.

Ich möchte openssh-server in der VM installieren. Um sicherzustellen, dass jede VM einen einzigartigen OpenSSH-Schlüssel erhält, können wir openssh-server nicht installieren, wenn wir die VM erstellen. Daher erstellen wir ein Skript namens boot.sh, das ausgeführt wird, wenn die VM zum ersten Mal gestartet wird. Es wird openssh-server (mit einem einzigartigen Schlüssel) installieren und auch den Benutzer (ich werde den Standardbenutzernamen administrator für meine VMs zusammen mit dem Standardpasswort howtoforge verwenden) zwingen, das Passwort beim ersten Anmelden zu ändern:

vi /var/lib/libvirt/images/vm1/boot.sh

| # Dieses Skript wird beim ersten Start der virtuellen Maschine ausgeführt # Es wird als root ausgeführt. # Benutzerkonto ablaufen lassen passwd -e administrator # openssh-server installieren apt-get update apt-get install -qqy --force-yes openssh-server |

Stellen Sie sicher, dass Sie den Benutzernamen administrator durch Ihren Standard-Anmeldenamen ersetzen.

(Sie können hier mehr darüber erfahren: https://help.ubuntu.com/community/JeOSVMBuilder#First%20boot)

(Sie können auch ein “Erstanmeldeskript” wie hier beschrieben definieren: https://help.ubuntu.com/community/JeOSVMBuilder#First%20login)

Jetzt schauen Sie sich an

vmbuilder kvm ubuntu --help

um mehr über die verfügbaren Optionen zu erfahren.

Um unsere erste VM, vm1, zu erstellen, gehen wir in das VM-Verzeichnis…

cd /var/lib/libvirt/images/vm1/

… und führen vmbuilder aus, z.B. wie folgt:

vmbuilder kvm ubuntu --suite=precise --flavour=virtual --arch=amd64 --mirror=http://de.archive.ubuntu.com/ubuntu -o --libvirt=qemu:///system --ip=192.168.0.101 --gw=192.168.0.1 --part=vmbuilder.partition --templates=mytemplates --user=administrator --name=Administrator --pass=howtoforge --addpkg=vim-nox --addpkg=unattended-upgrades --addpkg=acpid --firstboot=/var/lib/libvirt/images/vm1/boot.sh --mem=256 --hostname=vm1 --bridge=br0

Die meisten Optionen sind selbsterklärend. –part gibt die Datei mit den Partitionierungsdetails an, relativ zu unserem Arbeitsverzeichnis (deshalb mussten wir in unser VM-Verzeichnis gehen, bevor wir vmbuilder ausführen), –templates gibt das Verzeichnis an, das die Vorlagendatei enthält (wieder relativ zu unserem Arbeitsverzeichnis), und –firstboot gibt das Erstanmeldeskript an. –libvirt=qemu:///system sagt KVM, dass diese VM zur Liste der verfügbaren virtuellen Maschinen hinzugefügt werden soll. –addpkg ermöglicht es Ihnen, Ubuntu-Pakete anzugeben, die Sie während der VM-Erstellung installiert haben möchten (siehe oben, warum Sie openssh-server nicht zu dieser Liste hinzufügen sollten und stattdessen das Erstanmeldeskript verwenden sollten). –bridge richtet ein gebrücktes Netzwerk ein; da wir die Brücke br0 in Kapitel 2 erstellt haben, geben wir diese Brücke hier an.

In der –mirror-Zeile können Sie ein offizielles Ubuntu-Repository in –mirror angeben, z.B. http://de.archive.ubuntu.com/ubuntu. Wenn Sie –mirror weglassen, wird das Standard-Ubuntu-Repository (http://archive.ubuntu.com/ubuntu) verwendet.

Wenn Sie eine IP-Adresse im –ip-Schalter angeben, stellen Sie sicher, dass Sie auch die richtige Gateway-IP mit dem –gw-Schalter angeben (ansonsten geht vmbuilder davon aus, dass es die erste gültige Adresse im Netzwerk ist, was möglicherweise nicht korrekt ist). In der Regel ist die Gateway-IP dieselbe, die Sie in /etc/network/interfaces verwenden (siehe Kapitel 2).

Der Build-Prozess kann einige Minuten dauern.

Danach finden Sie eine XML-Konfigurationsdatei für die VM in /etc/libvirt/qemu/ (=> /etc/libvirt/qemu/vm1.xml):

ls -l /etc/libvirt/qemu/
root@server1:/var/lib/libvirt/images/vm1# ls -l /etc/libvirt/qemu/  
total 8  
drwxr-xr-x 3 root root 4096 May 21 13:00 networks  
-rw------- 1 root root 2082 May 21 13:15 vm1.xml  
root@server1:/var/lib/libvirt/images/vm1#

Die Festplattenimages befinden sich im ubuntu-kvm/ Unterverzeichnis unseres VM-Verzeichnisses:

ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/
root@server1:/var/lib/libvirt/images/vm1# ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/  
total 604312  
-rw-r--r-- 1 root root 324337664 May 21 13:14 tmpE4IiRv.qcow2  
-rw-r--r-- 1 root root 294715392 May 21 13:15 tmpxvSVOT.qcow2  
root@server1:/var/lib/libvirt/images/vm1#
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.