Virtualisierung mittels Xen 3.2 unter Debian 5.0 "Lenny" Howto
Einleitung
Geht es um Virtualisierung und Serverkonsolidierung, kommt man immer wieder an den Punkt, an dem man sich zwischen den unterschiedlichen Virtualisierungsparadigmen und konkreten Implementierungen von Virtualisierungslösungen entscheiden muss. In unserem Fall verwenden wir Xen als Virtualisierungslösung auf einem Debian GNU/Linux 5.0 (aka "Lenny") als Basissystem.
Um eine möglichst schlanke und performante Xen-Installation zu erhalten, verwenden wir als Ausgangsbasis die Minimalinstallation von Debian Lenny. Dieses Howto bezieht sich auf die Installation und die Konfiguration des Hypervisors Xen in der in den Debian Repositories enthaltenen Version 3.2.
Einführung in Xen
Prinzipiell besteht die Virtualisierungsstrategie von Xen darin, dass Xen selbt eine priviligierte Instanz eines Linux-Systems samt Hypervisor bereitstellt (dom0 genannt) und damit ein Hostsystem für virtuelle Maschinen (domU genannt) darstellt. Dabei kann als Gastsystem neben Linux, den diversen BSD-Varianten und Solaris auch Microsoft Windows installiert werden.
Durch die Verwendung von Xen können u.a. Serverdienste komplett voneinander isoliert werden. So kann bspw. auf der gleichen physikalischen Hardware jeweils ein Mailserver, ein DNS-Server, ein DHCP-Server, ein FTP-Server und ein Samba-Server in jeweils einer eigenen virtuellen Maschine betrieben werden. Xen bietet eine Menge Vorteile, die im täglichen Umgang insbesondere mit Serverinfrastrukturen zur Geltung kommen:
- erhöhte Sicherheit (bei Kompromittierung einer virtuellen Maschine sind alle anderen VMs davon nicht betroffen)
- einfachere Wartbarkeit und Monitoring der einzelnen VMs, als z.B. bei auf unterschiedlicher Hardware ausgelagerten Diensten
- hohe Flexibilität und Skalierbarkeit (VMs können jederzeit auf andere physikalische Server migriert werden)
- hohes Einsparpotenzial an Kosten für die Infrastruktur und an Strom- und Betriebskosten, da alle VMs auf einem einzigen physikalischen Server laufen
- Es können beliebige Gastsysteme installiert werden: Linux, FreeBSD, OpenBSD, NetBSD, Solaris, OpenSolaris, Microsoft Windows
- geringer Performanceverlust bei Virtualisierung gegenüber nativer Installationen
Die einzelnen Serverdienste, die jeweils in einer eigenen Umgebung auf einem eigenen Betriebssystem laufen sollen, werden jeweils in einer eigenen domU Instanz installiert. Der Xen-Hypervisor selbst wird in dom0 installiert. Innerhalb der dom0 werden wir am Schluss dieser Installation auch lediglich diesen als Verwalter aller domU's wiederfinden. Weder wird dort andere, nicht dringend benötigte Software installiert, noch irgendwelche Dienste. Dazu verwenden wir ausschließlich die domU's. Nur diese lassen sich später von einer physikalischen Hardware auf eine andere migrieren (auch im Live-Betrieb).
Netzwerk- und Systemumgebung
In diesem Howto verwenden wir die folgende Netzwerk- und Systemumgebung:
- IP-Adresse des Hostsystems (dom0): 10.0.1.1
- Netzwerkmaske: 255.255.0.0
- Hostname des Hostsystems (dom0): cassini.asconix.lan
- IP-Range der Gastsysteme: 10.0.1.2 - 10.0.1.254
- Architektur: i386 (u.U. müssen bei einem amd64 System die entsprechenden Paketnamen bei der Installation angepasst werden)
Installation von benötigter Software
Wie wir weiter oben erläutert haben, gehen wir in diesem Howto von einer Minimalinstallation von Debian GNU/Linux 5.0 (aka "Lenny") aus. Da bei der Minimalinstallation einige für uns wichtige Applikationen und Dienste fehlen (u.a. SSH Server), installieren wir diese zunächst manuell mittels:
# aptitude install ssh less
Installation von Xen
Zunächst installieren wir Xen 3.2 mittels:
# aptitude install xen-linux-system-2.6.26-1-xen-686 xen-hypervisor-3.2-1-i386 xen-tools xen-utils-3.2-1 xenstore-utils xen-shell xenwatch
Die Installation von Xen 3.2 samt den obigen Tools führt zur automatischen Installation von ca. 120 weiteren Paketen als Abhängigkeiten.
Image-basierte versus LVM-basierte Xen Gastsysteme
Nun haben wir die Wahl zwischen zwei Arten, wie Xen das Dateisystem seinen Gästen zur Verfügung stellt. Zum einen können wir Image-basierte Gastsysteme einrichten, zum anderen LVM-basierte. Obwohl die Performance bei den auf LVM aufbauenden Xen Gastsystemen den Image-basierten voraus ist, erklären wir der Einfachheit halber die Installation eines Gastsystems domU, das komplett in einer Imagedatei gespeichert wird.
Loop-Devices erstellen
Um mehrere Gastsysteme parallel betreiben zu können, reicht die Anzahl der bei Debian per Default erstellten Loop-Devices in vielen Fällen nicht aus (bei Lenny sind es per Default 8 Loop-Devices /dev/loop0 bis /dev/loop7). Daher lassen wir das System bei dessen Start 64 derartige Devices erstellen, indem wir in der Konfigurationsdatei /etc/modules die folgende Zeile ersetzen
loop
durch
loop max_loop=64
Anschließend passen wir die Konfigurationsdatei /etc/xen/xend-config.sxp so an, dass die entsprechenden Ethernet-Bridges zwischen den virtuellen Netzwerkkarten innerhalb der Gastsysteme und der physikalischen Devices automatisch erstellt werden. Dazu entkommentieren wir die entsprechende Definition in Zeile 123:
(network-script network-bridge)
Zudem kommentieren wir in der gleichen Konfigurationsdatei die Zeile 139 aus:
# (network-script network-dummy)
Ebenfalls müssen wir darauf achten, dass die Zeile 154 nicht auskommentiert ist:
(vif-script vif-bridge)
Anschließend starten wir den Server neu mittels:
# reboot
Nach dem Reboot kontrollieren wir, ob der Xen-Kernel geladen wurde:
# uname -r
Dabei sollten wir die folgende Ausgabe erhalten:
2.6.26-1-xen-686
Erstellung einer virtuellen Maschine domU
Es existieren unterschiedliche Wege, um Xen Gastsysteme zu initialisieren. Einer der einfachsten Wege besteht darin, die Toolsammlung xen-tools zu verwenden. Diese bieten einige hilfreiche Werkzeuge, um Gastsysteme zu initialisieren.
Konfiguration der xen-tools
Wir haben bereits bei der Installation des Xen Hypervisors das benötigte Paket xen-tools installiert, daher können wir die entsprechenden Tools an dieser Stelle bereits verwenden. Zunächst passen wir die Konfigurationsdatei /etc/xen-tools/xen-tools.conf an. Diese enthält alle Standardeinstellungen, die bei der Erstellung eines neuen Xen Gastsystems domU verwendet werden. Darin definieren wir zunächst in Zeile 45 den Speicherort für die Xen-Images:
dir = /var/xen
Anschließend erstellen wir das Verzeichnis im Dateisystem:
# mkdir /var/xen
Nun legen wir ebenfalls in der Konfigurationsdatei /etc/xen-tools/xen-tools.conf fest, welche Distribution standardmäßig installiert werden soll und wieviel Festplattenplatz und RAM der entsprechenden Instanz per Default zugesichert werden sollen. Da wir in unserem Fall eine Festplatte mit 250 GB verwenden und nicht mehr als 10 Gastsysteme anstreben, definieren wir diese Werte folgendermaßen (ca. Zeile 128):
size = 20Gb memory = 256Mb swap = 256Mb fs = xfs dist = lenny image = sparse
Anmerkung: je nach Performance des Servers sollten diese Werte an die eigene Umgebung angepasst werden!
Anschließend definieren wir in der gleichen Konfigurationsdatei die Netzwerkumgebung. In unserem Fall legen wir die IP-Einstellungen manuell fest und lassen sie nicht per DHCP vergeben (ca. Zeile 163):
gateway = 10.0.0.1 netmask = 255.255.0.0 broadcast = 10.0.255.255
Damit wir bei der Erstellung einer neuen virtuellen Maschine nach einem individuellen Root-Passwort gefragt werden, entkommentieren wir die Zeile 187:
passwd = 1
Nun legen wir in Zeile 214 den schnellsten uns zugänglichen Debian-Mirror. Dieser wird für Installationen mittels debootstrap benötigt:
mirror = http://ftp.de.debian.org/debian/
Damit ein neu erstelltes Image automatisch nach dessen Fertigstellung einmalig neugestartet wird, entkommentieren wir Zeile 247:
boot = 1
Verwenden wir Lenny oder neuere als Gastsysteme, müssen wir die Devicenamen für die serielle Schnittstelle (/dev/hvc0) bzw. die Festplatte (/dev/xvda) anpassen (ca. Zeile 257):
serial_device = hvc0 disk_device = xvda
Erstellung der domU mittels xen-tools
Nachdem wir alle globalen Vorgaben für die xen-tools definiert haben, erstellen wir nun unser erstes Gastsystem. Dabei verwenden wir in diesem Howto Debian GNU/Linux 5.0 "Lenny" sowohl als Host- als auch als Gastsystem:
# xen-create-image --hostname=moebius --ip=10.0.1.2 --role=udev
Anmerkung: an dieser Stelle können wir durch die Angabe von Kommandozeilenparametern die in der Konfigurationsdatei /etc/xen-tools/xen-tools.conf festgelegten Standardwerte beliebig überschreiben (s. Manpage zu xen-create-image). So können wir bspw. an dieser Stelle die Größe des Xen-Images ändern, indem wir dieses mittels des folgenden Kommandos erstellen (hier soll das Image exemplarisch 50 GB gross werden):
# xen-create-image --hostname=moebius --size=50Gb --ip=10.0.1.2 --role=udev
Die Generierung der virtuellen Maschine dauert je nach Hardware einige Minuten. Dabei geben uns die xen-tools Auskunft über den Fortschritt der Installation:
General Information
--------------------
Hostname : moebius
Distribution : lenny
Partitions : swap 256Mb (swap)
/ 20Gb (xfs)
Image type : sparse
Memory size : 256Mb
Kernel path : /boot/vmlinuz-2.6.26-1-xen-686
Initrd path : /boot/initrd.img-2.6.26-1-xen-686
Networking Information
----------------------
IP Address 1 : 10.0.1.2 [MAC: 00:16:3E:41:97:D7]
Netmask : 255.255.0.0
Broadcast : 10.0.255.255
Gateway : 10.0.0.1
Creating partition image: /var/xen/domains/moebius/swap.img
Done
Creating swap on /var/xen/domains/moebius/swap.img
Done
Creating partition image: /var/xen/domains/moebius/disk.img
Done
Creating xfs filesystem on /var/xen/domains/moebius/disk.img
Done
Installation method: debootstrap
Done
Running hooks
Done
Role: udev
File: /etc/xen-tools/role.d/udev
Role script completed.
Creating Xen configuration file
Done
Da wir es so definiert haben, fragt uns der Installer anschließend nach dem Root-Passwort für das Gastsystem domU und startet nach dessen erfolgreichen Installation dieses neu:
All done
cassini:~# Started new Xen guest: moebius [/etc/xen/moebius.cfg]
Logfile produced at:
/var/log/xen-tools/moebius.log
Alle Parameter, die wir entweder über die globale Konfigurationsdatei /etc/xen-tools/xen-tools.conf oder als Kommandozeilenparameter dem Kommando xen-create-image übergeben haben, werden für die erstellte Instanz selbst in einer entsprechenden Konfigurationsdatei festgehalten. In unserem Fall handelt es sich um die Datei /etc/xen/moebius.cfg:
kernel = '/boot/vmlinuz-2.6.26-1-xen-686'
ramdisk = '/boot/initrd.img-2.6.26-1-xen-686'
memory = '256'
root = '/dev/xvda2 ro'
disk = [
'file:/var/xen/domains/moebius/swap.img,xvda1,w',
'file:/var/xen/domains/moebius/disk.img,xvda2,w',
]
name = 'moebius'
vif = [ 'ip=10.0.1.2,mac=00:16:3E:41:97:D7' ]
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
Anmerkung: Wir können jederzeit die Parameter, mit denen die virtuelle Maschine gestartet wird, in dieser Datei ändern. So können wir bspw. den Server aufrüsten und später den einzelnen Instanzen mehr Resourcen (Speicher, Festplatte etc.) an dieser Stelle zusichern.
Umgang mit den xen-tools
Bei den xen-tools handelt es sich um eine in Perl geschriebene Toolsammlung. Die einzelnen Tools erleichtern den Umgang mit Xen-Installationen und den entsprechenden Gastsystemen erheblich. Wir haben bereits ein Tool aus dieser Sammlung kennengelernt: xen-create-image zur Erstellung einer neuen virtuellen Maschine.
In diesem Abschnitt stellen wir einige weitere Tools vor, die die tägliche Arbeit mit Xen als Hypervisor und den einzelnen Gastsystemen erheblich vereinfachen.
- # xm info
Das Kommando liefert uns Informationen über den Xen-Host, in unserem Fall also:
host : cassini release : 2.6.26-1-xen-686 version : #1 SMP Fri Mar 13 22:30:40 UTC 2009 machine : i686 nr_cpus : 2 nr_nodes : 1 cores_per_socket : 1 threads_per_core : 2 cpu_mhz : 2394 hw_caps : bfe9fbff:20000000:00000000:00000140:0040e31d:00000000:00000001 total_memory : 2550 free_memory : 0 node_to_cpu : node0:0-1 xen_major : 3 xen_minor : 2 xen_extra : -1 xen_caps : xen-3.0-x86_32p xen_scheduler : credit xen_pagesize : 4096 platform_params : virt_start=0xf5800000 xen_changeset : unavailable cc_compiler : gcc version 4.3.1 (Debian 4.3.1-2) cc_compile_by : waldi cc_compile_domain : debian.org cc_compile_date : Sat Jun 28 15:25:00 UTC 2008 xend_config_format : 4
- # xm list
Das Kommando liefert eine Liste aller domU's (samt dem Hostsystem), sowie die wichtigsten Informationen zu den Instanzen:
Name ID Mem VCPUs State Time(s) Domain-0 0 2264 1 r----- 223.7 moebius 1 256 1 -b---- 1.5
- # xm console moebius
Das Kommando dient dazu, um sich mit dem Gastsystem moebius zu verbinden. Möchten wir dieses anschließend verlassen und wieder zum Hostsystem zurückkehren, drücken wir Ctrl + 5.
Start eines domU Gastsystems
Nachdem wir das Gastsystem soweit istalliert haben, wird es automatisch gestartet. Sollten wir es dennoch einmal manuell starten müssen, führen wir das folgende Kommando aus:
# xm create -c /etc/xen/moebius.cfg
Da wir in unserem Fall auch essentielle Serverdienste in einer virtuellen Maschine laufen lassen, müssen dafür Sorge tragen, dass diese automatich nach dem Booten des Servers mitgestartet werden. Dazu erstellen wir zunächst auf dem Host dom0 ein entsprechendes Verzeichnis /etc/xen/auto und referenzieren darin die einzelnen Gastsysteme, die automatisch gestartet werden sollen:
# mkdir /etc/xen/auto
# cd /etc/xen/auto
# ln -s /etc/xen/moebius.cfg .
Eigene Ramdisk für domU Gastsysteme
Bei der Standardinstallation verwendet Xen die gleiche Ramdisk für dom0 und die domU's. Das kann jedoch zu einigen gravierenden Problemen führen. In unserem Fall verwenden wir z.B. ein voll verschlüsseltes Dateisystem, das beim Booten des Servers nach einem entsprechenden cryptsetup Passwort zur Entschlüsselung fragt. Nutzen wir die Initrd eines solchen verschlüsselten Systems auch innerhalb unserer domU's, fragen auch diese nach dem entsprechenden Passwort. Um solche Seiteneffekte zu vermeiden, sollten wir stets eine eigene Ramdisk für die domU's verwenden! Die entsprechenden Schritte zur Erstellung einer solchen zeigen wir im Folgenden auf.
Zunächst booten wir das entsprechende Gastsystem domU, für das wir eine individuelle Ramdisk erstellen wollen (s. Starten der Xen Gastsysteme oben). Anschließend installieren wir darin das Paket initramfs-tools, das wir zum Erzeugen und Booten der Init-Ramdisk benötigen:
# aptitude install initramfs-tools
Anschließend erzeugen wir die neue Initrd mittels:
# depmod 2.6.26-1-xen-686
# mkinitramfs -o /boot/initrd.img-2.6.26-1-xen-domU-686 2.6.26-1-xen-686
Nachdem wir die obigen Kommandos ausgeführt haben, finden wir die neue Init-Ramdisk auf dem Gastsystem domU unter /boot/initrd.img-2.6.26-1-xen-domU-686.
Anschließend kopieren wir diese Init-Ramdisk mittels scp auf unseren Xen-Host dom0:
# scp /boot/initrd.img-2.6.26-1.xen-domU-686 root@XenDom0IP:/boot
Anschließend ändern wir innerhalb der dem0 die Xen-Konfigurationsdatei (in unserem Fall für den Host moebius) /etc/xen/moebius.cfg, indem wir die Init-Ramdisk
ramdisk = '/boot/initrd.img-2.6.26-1-xen-686'
ersetzen durch
ramdisk = '/boot/initrd.img-2.6.26-1-xen-domU-686'
Nach den Änderungen starten wir das Xen Gastsystem domU neu mittels:
# xm shutdown moebius
# xm create -c /etc/xen/moebius.cfg
Löschen eines domU Gastsystems
Oft verwenden wir ein bestimmtes Gastsystem, um ein Testsetup durchzuführen oder um bspw. eine bestimmte Software zu evaluieren. Um die Xen-Installation hinterher sauber zu bereinigen und sowohl das Image als auch die Konfiguration des jeweiligen domU Gastsystems (in unserem Fall moebius) zu löschen, führen wir die folgenden Kommandos aus:
# xm shutdown moebius
Anschließend warten wir einige Minuten und prüfen, ob das Gastsystem tatsächlich heruntergefahren wurde mittels:
# xm list
In der nun folgenden Ausgabe sollte moebius als Xen-Host nicht mehr auftauchen.
Anschließend löschen wir die Xen-Instanz moebius (sowohl das Filesystem-Image als auch die Konfiguration) mittels:
# xen-delete-image --hostname=moebius
Das Kommando bestätigt den Vorgang mit der folgenden Statusausgabe:
Deleting: /etc/xen/auto/moebius.cfg Deleting: /etc/xen/moebius.cfg Removing: /var/xen/domains/moebius
U.U. müssen dennoch einige Dateien manuell gelöscht werden:
# rm -rf /var/xen/domains/moebius /var/log/xen-tools/moebius.log



Nettes Howto!