Xen ermöglicht es, mehrere virtuelle Computer auf einem einzigen realen Rechner parallel laufen zu lassen, ähnlich wie das bekanntere VmWare, siehe auch KategorieHardwareVirtualisierung.
Xen steht unter GPL.
Für den der schnell mal Xen ein wenig testen möchte. Hier gibt es eine Live CD auf Grundlage von Knoppix mit Xen und QEMU, KVM .... zum Download: http://unit.aist.go.jp/itri/knoppix/index-en.html
Diese Dokumentation bezieht sich auf Xen der Version 3.0.
Inhalt dieser Seite:
Inhaltsverzeichnis
Das Besondere an Xen
Xen unterscheidet sich von anderen Virtualisierungs-Lösungen vor allem dadurch, dass es normalerweise nicht die gesamte Hardware eines PCs penibel emuliert. Stattdessen bietet es dem Gast-Betriebssystem definierte Schnittstellen für die Nutzung der Hardware an, z.B. für Festplatte, Prozessor und Netzwerkkarte.
Die Gast-Betriebssysteme müssen in diesem Fall für Xen angepasst werden (Paravirtualisierung), um die von Xen zur Verfügung gestellten Schnittstellen nutzen können. Die auf dem Gast-Betriebssystem laufenden Anwendungen müssen dagegen NICHT angepasst werden, diese merken von der Paravirtualisierung nichts.
Vorteil der Paravirtualisierung
Die Gast-Betriebssysteme laufen erheblich schneller als z.B. auf VMware, siehe auch Xen Performance, da die Hardware nicht vollständig emuliert werden muss. Insbesondere die Emulation des Prozessors kostet viel Zeit.
Statt dessen wird direkt über die definierten Xen-Schnittstellen kommuniziert.
Dabei bleibt alles unter der Kontrolle des Xen-Wirtsystems.
Der Nachteil:
Ein Betriebssystem muss angepasst werden, damit es als Gast auf Xen läuft. Damit scheiden Betriebssysteme wie Windows aus, da sie nicht in Form von veränderbarem Quelltext vorliegen und nicht angepasst werden dürfen.
Eine gewisse Abhilfe schaffen die CPU-Erweiterungen von Intel (VT) und AMD (Pacifica), mit deren Hilfe z.B. Windows XP als Gast ohne spezielle Anpassungen auf Xen laufen können. Allerdings geht ohne Paravirtualisierung der Geschwindigkeitsvorteil von Xen verloren
Aufbau des Xen-Systems
Xen führt jedes Gast-Betriebssystem in einer eigenen virtuellen Maschine (VM) aus, welche in Xen-Terminologie Domains genannt werden.
Jedes Gast-Betriebssystem verwaltet wiederum seine Anwendungen selbst, inklusive der Zuteilung der Rechenzeit für die einzelnen Programme, dies jedoch natürlich nur innerhalb der Rechenzeit, die Xen der jeweiligen VM bzw. Domain zugeteilt hat.
Die unterste Ebene Domain 0 belegt Xen selbst. Diese ist mit den meisten Rechten ausgestattet. Die Domain 0 bildet die Basis, von welcher aus virtuelle Maschinen gestartet und verwaltet werden können. Von hier werden virtuelle Schnittstellen (Festplatten, RAM u.a.) für die höher liegenden VMs zur Verfügung gestellt. Innerhalb der Domain 0 läuft der xend, mit Hilfe dessen das System verwaltet wird. Der xend ist verantwortlich für die Verwaltung der VMs und ermöglicht den Zugriff auf deren Konsolen.
Installation
Als erstes muss das Xen-Wirts-System installiert werden, welches die Gast-Systeme beherbergen soll.
Voraussetzung dafür ist die Unterstützung von Xen für das jeweilige Betriebssystem, siehe dazu hier, wobei dom0 bedeutet, dass das System als Wirt einsetzbar ist.
Desweiteren muss der Bootmanager Grub verwendet und die Programmpakete iproute2, bridge-utils, hotplug und twisted installiert werden.
Ab Suse 10.1 und Fedora 5 kann Xen über das normale Installations-System installiert werden.
Unter Debian- oder Ubuntu-Linux ist dies zur Zeit noch nicht möglich.
Folgende Anleitung bindet Xen in Ubuntu, Debian oder andere Linux-Distributionen ein.
Voraussetzungen
Zunächst muss der Bootmanager Grub verwendet und die Programmpakete iproute2, bridge-utils, hotplug und twisted installiert werden. Unter Debian bzw. Ubuntu ist dazu folgendes auf der bash einzugeben:
apt-get install iproute python python-twisted bridge-utils curl
Installationsablauf
Um es sich einfacher zu machen und nicht kompilieren zu müssen, kann das "XEN Stable binary release" von Xen herunter geladen werden. Diese Datei ist in das Verzeichnis /usr/local/src zu kopieren.
Anschließend ist in dieses Verzeichnis zu wechseln und Xen auszupacken mit:
tar xvzf xen-<Version>-install-x86_32.tgz
Nun in das Installations-Verzeichnis wechseln mit:
cd xen-<Version>-install
und Xen installieren:
sh install.sh
Die nun ausgegebenen Meldungen genau prüfen, da die Installations-Routine meldet, wenn z.B. bestimmte Voraussetzungen nicht erfüllt sind.
Einrichten des Xen-Wirtsystems
Zunächst ist das Wirtsystem vorzubereiten, auf welchem die virtuellen Rechner zum Laufen gebracht werden sollen.
Bootmanager grub anpassen
Um den speziellen Xen-Kernel nutzen zu können, ist der Bootmanager grub über die Datei /boot/grub/menu.list anzupassen.
Beispiel:
title Xen 3.0 / XenLinux 2.6 kernel /boot/xen-3.0.gz dom0_mem=65536 module /boot/vmlinuz-2.6-xen root=/dev/hda1 ro console=tty0
Die Pfade /boot/xen-3.0.gz und /boot/vmlinuz-2.6-xen müssen natürlich existieren und können je nach Xen-Version anders lauten.
Mit dem Parameter dom0_mem wird dem Xen-Wirtsystem (Domain 0) Arbeitsspeicher (in KB) zugewiesen. Wird dom0_mem ein hoher Wert zugewiesen, bleibt den VMs weniger Speicher übrig.
Unter root ist die "/"-Root-Partition einzutragen, nicht das Home-Verzeichnis des Users root. Die "/"-Partition ist z.B. zu ermitteln mit:
mount | grep " / "
Ist bei der Installation eine eigene /boot-Partition angelegt worden, muss bei den Pfadangaben jeweils das /boot weggelassen werden. Dem Beispiel oben entsprechend hieße das:
title Xen 3.0 / XenLinux 2.6 kernel /xen-3.0.gz dom0_mem=65536 module /vmlinuz-2.6-xen root=/dev/hda1 ro console=tty0
"Thread Local Storage" deaktivieren
Zur Beschleunigung sollte unbedingt tls deaktiviert werden, das System wird ansonsten extrem abgebremst
Folgendes ist dazu auszuführen:
mv /lib/tls /lib/tls.disabled
Mit dem Xen-Kernel neu starten
Ab jetzt sollte der Xen-Kernel durch eine entsprechende Auswahl im Bootmanager gestartet werden können.
Wahrscheinlich werden beim Starten einige Fehlermeldungen auftauchen. Diese müssen kein Grund zur Besorgnis sein, sondern können an den Unterschieden der Konfiguration des Xen-Kernels im Gegensatz zum Standard-Kernel der jeweiligen Linux-Distribution liegen.
Xen-Dämonen automatisch starten
Zwei Dienste müssen dazu gestartet werden: xend und xendomains.
Die Funktion von xend ist weiter oben schon erläutert. xenddomains wird verwendet, um VMs automatisch zu starten und zu stoppen, wenn das Xen-Wirts-System (Domain 0) gestartet bzw. herunter gefahren wird.
Damit die beiden Dienste nach jedem Neustart automatisch gestartet sind, müssen symbolische Links von den Init-Skripten in die entsprechenden rc-Verzeichnisse angelegt werden.
Unter Debian kann dies geschehen mit dem Tool update-rc.d:
update-rc.d xend defaults 20 21
update-rc.d xendomains defaults 21 20
Ich konnte einen kleinen Bug von Xen 3.0 feststellen, für das Starten von xendomains:
Das Verzeichnis /var/lock/subsys/ konnte nicht gefunden werden.
/etc/init.d/xendomains start
touch: kann ,,/var/lock/subsys/xendomains" nicht berühren: Datei oder Verzeichnis nicht gefunden
Dieses ist dann anzulegen mit:
mkdir /var/lock/subsys/
Gast-Linux installieren auf einer virtuellen Maschine
Es gibt grundsätzlich zwei Möglichkeiten, ein Gastsystem zu installieren:
- In ein eigenes reales Dateisystem
- In eine Image-Datei in das Dateisystem des Xen-Wirtsystems
In ein eigenes reales Dateisystem installieren
Ist auf der Festplatte noch Platz für weitere Partitionen, kann ein Linux für eine virtuelle Maschine ganz normal von bootfähiger CD in diese freien Bereiche installiert werden.
Der Bootmanager darf allerdings NICHT in den MBR geschrieben werden, da ja Xen das virtuelle Linux startet, nicht grub.
Für weitere VMs kann das so von CD installierte System kopiert werden.
In ein Image installieren
Um ein '/'-root-Dateisystem-Image mit 1 GB und ein Swap-Image mit 256 MB zu erzeugen, ist folgendes einzugeben:
mkdir /var/images dd if=/dev/zero of=/var/images/vm1disk bs=1024k count=1024 dd if=/dev/zero of=/var/images/vm1swap bs=1024k count=256 mkfs.ext3 /var/images/vm1disk && mkswap /var/images/vm1swap
Mit count=<Zahl> wird die Größe des Images im MB definiert.
Das Image in das Unix-Dateisystem einbinden mit:
mkdir /mnt/disk mount -o loop /var/images/vm1disk /mnt/disk
Nun kann ein Betriebssystem in die Image-Datei kopiert werden.
Debian als virtuelle Maschine einrichten mit "debootstrap"
Das Programm "debootstrap" muss auf dem Xen-System installiert werden mit:
apt-get install debootstrap
Nach Einbindung eines Images in das Dateisystem (siehe oben), wird ein Debian-Linux installiert mit:
debootstrap --arch i386 sarge /mnt/disk http://debian.tu-bs.de/debian/
Die Quelle mit http://... ist nach eigenen Wünschen anzupassen.
Mussen die nötigen Dateien über einen Proxy geladen werden, ist die Variable http_proxy zu setzen, siehe auch ProxyServer.
Ist das Image nun erfolgreich erzeugt, kann dieses als Vorlage für weitere virtuelle Maschinen dienen. Für eine neue VM wird diese Datei einfach kopiert und angepasst.
Dazu zunächst aus Sicherheitsgründen in eine chroot-Umgebung wechseln:
chroot /mnt/disk /bin/bash
Anschließend den neuen virtuellen PC über die folgenden Dateien anpassen:
/etc/hostname => Hostnamen eintragen
/etc/network/interfaces => Netzwerk konfigurieren, z.B.
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.11 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1
/etc/apt/sources.list => Die Quellen für das Debian-Paket-Management anpassen
/etc/fstab => Dies z.B. anpassen wie folgt:
/dev/sda1 / ext3 errors=remount-ro 0 1 /dev/sda2 none swap sw 0 0 proc /proc proc defaults 0 0
Wie bei dem Xen-Wirtssystem ist auch auf dem Gastsystem abschließend tls zu deaktivieren mit:
mv /lib/tls /lib/tls.disabled
Nun aus der chroot herausgehen und das Images aus dem Dateisystem entfernen mit:
exit umount /mnt/disk
Nach starten der VM (siehe unten) die Debian-Grundkonfiguration durchführen durch Aufruf von:
base-config
VM starten
Die Beispiel-Konfigurations-Datei /etc/xen/xmexample1 ist zu kopieren und anschließend an die eigene Umgebung anzupassen.
Beispiel der Einträge:
kernel = "/boot/vmlinuz-2.6.12-xenU" ## RAM-Speicher Zuweisung (in Megabyte) für die neue Domain memory = 128 ## Name des virtuellen Servers name = "xenvm1" ### Liste von zugewiesenen Partitionen oder Imagedateien ## Eintrag für oben genannte debootstrap-Beispiel mit Image. disk = [ 'file:/var/images/vm1disk,sda1,w', 'file:/var/images/vm1swap,sda2,w' ] ## Beispiel für reale Partitionen #disk = [ 'phy:hda7,sda1,w', 'phy,sda2,w' ] root = "/dev/sda1 ro"
Um eine VM starten zu können, muss, falls dem nicht schon so ist, der Xen-Dämon xend gestartet werden mit:
xend start
Haben wir die Konfigurations-Datei xenvm1 genannt, kann die VM gestartet werden mit:
xm create -c xenvm1 vmid=1
Das -c bewirkt, dass man nach dem Start der VM gleich auf der Konsole von dieser landet.
Die Boot-Meldungen sollten beim create über den Bildschirm laufen, abschließend sollte der Login-Prompt erscheinen. Den Promt kann man mit Strg+5 wieder verlassen. Es empfielt sich openssh-server zu installieren und die weitere Konfiguration per SSH zu erledigen.
VM automatisch starten
Um virtuelle Maschinen automatisch nach einem Reboot des Xen-Wirtssystem zu starten, muss die Konfigurations-Datei in das Verzeichnis /etc/xen/auto verlinkt werden. Für eine Beispiel-Konfigurations-Datei mit Namen xenvm1 ist folgendes einzugeben:
ln -s /etc/xen/xenvm1 /etc/xen/auto/
Administration der virtuellen Maschinen
xm
xm ist das Haupt-Programm zur Verwaltung von Xens Gast-VMs. Wir haben es oben schon einmal benutzt, um die VMs zu starten. xm kann aber wesentlich mehr.
xm list
Dieses gibt zum Beispiel folgendes aus:
# xm list Name ID Mem(MiB) VCPUs State Time(s) Domain-0 0 64 1 r----- 112.0 vm1 3 128 1 ------ 27.4
Erläuterungen zu der Ausgabe:
Name |
ist der Name der VM |
|
ID |
ist die Nummer der VM/Domain, wichtig, um z.B. nachträglich an die Konsole der VM zu kommen |
|
Mem(MiB) |
Arbeitsspeicherzuweisung in Megabyte |
|
VCPUs |
Anzahl der zugewiesenen Prozessoren |
|
State |
Status |
|
|
r |
running - laufend |
|
b |
blockiert |
|
p |
pausierend |
|
s |
shutdown - heruntergefahren |
|
c |
crashed - abgestürzt |
Time(s) |
Verbrauch von CPU-Rechenzeit in Sekunden |
Eine erheblich detailliertere Ausgabe wird durch ein zusätzliches "-l" bewirkt:
xm list -l
xm console
Dieses dient dem Zugriff auf die Konsole. Damit erscheint genau das vor einem, was man sehen würde, als wenn man vor einem realen PC sitzen würde. Mit Strg+5 kann man diese wieder verlassen.
Beispiel:
xm console 3
Die 3 ist ID der VM, entnommen aus dem obigen Beispiel mit xm list
ACHTUNG: Um sich wieder von der VM-Konsole abzumelden, muss bei deutscher Tastatur <CTRL> '5' eingegeben werden.
xm shutdown <Domänen-Id>
Mit diesem Kommando wird das Betriebssystem der VM angewiesen, herunterzufahren
xm mem-set
Über dieses Kommando kann die Speicherzuweisung für eine VM angepasst werden.
Syntax:
xm mem-set <Domänen-Id> <Hauptspeicher>
Beispiel:
xm mem-set 3 256
Das Betriebssystem in der VM konnte bei mir den neu zugewiesenen Speicher erst nach Neustart der VM nutzen.
Soll die Speicherzuweisung auf Dauer verändert werden, ist in der VM-Konfigurations-Datei der Wert memory anzupassen
Tipps & Tricks
Grafische Oberfläche: http://xenman.sourceforge.net
Mini-Howto
Debian Anleitung in den Linuxforen {de} und Penguin User Group {de}
IBM A moment of Xen: Virtualize Linux to test your apps {en}
The Perfect Xen Setup For Debian And Ubuntu @Howtoforge.com {en}
Debian Administration.org Installing Xen 3.0 upon Debian Sarge {en}
Hier wackelige dyndns-Adressen zu verlinken, finde ich wenig sinnvoll. Die Doku ist ja ganz gut, aber wenn sich hier jeder seinen eigenen PC eintragen würde, wird die Linksammlung sehr unübersichtlich. Hier der Link:
Sie hierzu Xen/Diskussion
Bücher
Das Xen Kochbuch {de} Hans-Joachim Picht: Xen Kochbuch. O'Reilly Verlag, Köln 2009, ISBN 978-3-89721-729-4.
FAQ
Was wird emuliert/Virtualisiert und wie? z.B. Emuliert VmWare Ethernet als AMD Netzwerk Chip u.s.w wie macht das Xen? (Netz, Grafik, Geräte wie USB .... )
Wie oben bereits beschrieben, werden die Devices nicht komplett emuliert, sondern Xen stellt Schnittstellen zur Verfügung. Deshalb muss das Gast-System für Xen angepasst werden.
Frage: Wie funktioniert dann die Nutzung der neuen VM-CPU-Erweitungen mit Xen?
Dieses Zitat aus dem "Penguin User Group" Wiki finde ich passender. "Durch die Paravirtualisierung wird jedem virtuellem System vorgespielt, es besitze die alleinigen Rechte über die Ressourcen. Tatsächlich sendet der Gast die Befehle direkt an den Hypervisor Xen-Schicht) und Xen leitet sie an die echte Hardware weiter." Dann habe ich mal in einen Gast oder dom0 ein modprobe e1000 oder e100 gemacht. Er lädt die Module obwohl ich nur Hardware für den e1000 eingebaut habe. lspci zeigt output in dom0 aber nicht im Gastsystem. Mhhh jetzt bin ich noch mehr verwirt.
- Damit das klappt, muss den Wirtsystem erst die Hardware "entzogen" werfen. Die Hardware wird da durch für den Gast zur Verfügung gestellt, dass Xen durch den Treiber "pci-backend" (Grub Eintrag od, manuel per /sys) diese an sich bindet und vor dem Wirt schützt. der Treiber wiederum reicht es dann an den Gast weiter. Mit lspci wird die Karte dann in beiden Systemen aufgelistet, aber sie steht nur noch diesem einen Gast zur Verfügung.
Ich empfehle die überarbeitete Anleitung von mir auf www.pug.org Seite. Da wurde vieles korrigiert.
- Grafik: Sieht nach X11 in dom0 aus. VNC für Grafik in den Gastsystemen und Terminal Emulation für Text. Alternativen?
Können Gastsysteme auf Devices direkt zugreifen?
- Nein, Xen mit der Domain 0 steht immer zwischen Hardware und Gastsystem.
Da scheint aber etwas möglich zu sein: http://www.pug.org/index.php/Xen-Installation "Punkt: Hardware in Dom0" Oder? Ist zwar nicht wirklich schön aber wohl doch manchmal nötig.