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 su2 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/cpuinfoetwas 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-ipxeAnschließ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` kvmSie 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 listEs 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/interfacesVor 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
ifconfigEs 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:
rebootWenn 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 --helpum 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=br0Die 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#Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.