Categories
Technisches

Windows auf/unter Xen

Windows auf XEN / Howto

(dieser Artikel ist unvollständig und mittlerweile veraltet)

Ich will auf einem Computer mehrere Betriebssysteme laufen lassen. Virtualisierung bietet einige Vorteile und angeblich ist das jetzt so einfach und preiswert zu machen, dass sich das ja auch für SOHO-Server anbietet. Wichtig dabei ist, dass auch Windows als Gast läuft.

Ziele der Virtualisierung

Die Zielsetzung ist dabei vielleicht etwas anders als bei den enterprisy Installationen:

  • Wir wollen weniger Kisten rumstehen habe
  • Wir wollen weniger Geld für Hardware ausgeben
  • Wir wollen weniger Lüfterlärm und weniger Stromverbrauch
  • Wir wollen unabhängiger von der Hardware sein

Es geht also nicht so sehr darum, zu verteilen, mehr darum, lediglich zusammenzufassen.

Hardware

Als Hardware bietet sich ein Server an, der Vanderpool (Intel) oder Pacifica (AMD) unterstützt. Nur mit einer dieser Techniken lässt sich Windows als Gast auf XEN betreiben. Auch wenn diese Techniken dem Prozessor eigen sind, so sollten wohl auch Chipsatz, Mainboard und BIOS sie unterstützen. Zumindest war bei mir das Vanderpool zuerst ausgeschaltet und ich musste es im BIOS anschalten:

Unter „Advanced“ gab es „Advanced Processor Options“ und dort gab es einen Eintrag „Intel (R) Virtualization Technology“ – den habe ich von „Disabled“ auf „Enabled“ gestellt. Die Standard-Prozedur von wegen Speichern und Exit und weiter reichte aber nicht: man musste den Computer ganz ausschalten, nachdem man VT aktiviert hatte.

Software

Als Debian-affiner habe ich einen Edgy Eft Server installiert. Das ist das erste Ubuntu, welches XEN von Haus aus mitliefert. Wenn einem die Distri Egal ist, dann sollte man vielleicht was andere nehmen – SuSE oder so. Auf jeden Fall werde ich irgendwann auf Feisty Fawn umsteigen müssen, denn dafür wird es dann wohl wieder etwas länger Support und Updates geben als für Edgy.

Installation von XEN

Installation von XEN ist einfach. Wenn man mit einem „apt-cache search xen“ sucht, dann kommt nicht viel dabei heraus, denn XEN liegt in universe, und das ist standardmäßig erst mal nicht aktiviert. Man muss also in der /etc/apt/menu.lst universe „entkommentieren“. Dann mit einem apt-get update aktualisieren, dann geht’s.

Man schaut mit apt-get search xen nach, was es so gibt und installiert alles, was sich gut anhört. Ich habe folgendes installiert:

apt-get install xen-ioemu-3.0 xen-hypervisor-3.0-i386-pae xen-image-xen0-2.6.17-6-server-xen0 bridge-utils

xen-ioemu-3.0 – XEN administrative tools

Das ioemu scheint irgendwie etwas zu sein, dass den Gästen hilft, auf die Hardware zuzugreifen. Folgende Infos habe ich gefunden:

The userspace tools to manage a system virtualized through the XEN virtual machine monitor. This package includes the utilities required to support HVM domains, which allows full virtualization of unmodified operating systems, such as Microsoft’s Windows product line, and standard Linux kernels. For this to work, you will need a CPU with hardware virtualization support, such as Intel’s CPUs with VT, or AMD’s CPUs with Pacifica.

xen-hypervisor-3.0-i386-pae The XEN Hypervisor for i386 (pae enabled version)

Das ist das eigentliche XEN Hypervisor. Ich installiere das mit PAE, weil das zu dem Dom0-Kernel passen muss, und der hat bei mir auch PAE. PAE ist irgendwas von wegen braucht man mit viel RAM oder so :-) de.wikipedia.org/wiki/Physical_Address_Extension

xen-image-xen0-2.6.17-6-server-xen0 – Linux xen kernel binary image for version 2.6.17

Das ist mein Kernel für Dom0. Dom0 ist quasi das „Wirtsbetriebssystem“. Da bringt der mir schon eine Meldung:

Please manually create an initrd image 

Mist. Wie ging das noch mal?

bridge-utils

Das Zeug brauchen wir später um eine Netzwerkverbindung zwischen den Domains auf die reihe zu bekommen. Aber zuerst mal zum initramfs

Zuerst bearbeite ich mir mal die /boot/grub/menu.lst um XEN booten zu können:

### END DEBIAN AUTOMAGIC KERNELS LIST
title           xen
root            (hd0,0)
kernel          /boot/xen-3.0-i386-pae.gz noreboot
module          /boot/xen0-linux-2.6.17-6-server-xen0 root=/dev/sda1 ro quiet splash
module          /boot/initrd.img-2.6.17-6-server-xen0

und weil 3 Sekunden für arme Sysadmins viel zu schnell sind (sprich: 3 Sekunden reichen nicht, um das Stück Pizza zur Seite zu legen), ändern wir noch (ganz oben in der Datei):

timeout         10

Dann mache ich mir die initrd:

update-initramfs -c -k 2.6.17-6-server-xen0 

c steht für create, k sagt: „jetzt kommt die Versionsangabe“.

Wenn alles geklappt hat, dann bootet man nach einem „init 6“ keinen „normalen“ Kernel mehr, sondern den XEN-Kernel. Beim Booten muss man dazu aber innerhalb der 10 Sekunden die ESC-Taste drücken. Nur so kommt man in das Grub-Menü, in dem man den Kernel auswählen kann. Ansonsten landet man wieder im „Normalen“ OS.

Das ursprüngliche Betriebssystem ist dann „Dom0“. Man merkt schon an den Nachrichten, die beim Booten auf dem Bildschirm erscheinen, dass jetzt etwas anders ist.

Wenn alles geklappt hat, dann kann man mit einem „/etc/init.d/xend start“ den XEN-Daemon starten und dann mit „xm list“ nach den aktuell laufenden Domains schauen:

Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0     1895     2 r-----     14.5

Wie erwartet läuft nur eine Domain: unser „Wirtssystem“ „Dom0“. Aber das können wir ja Ändern.

Installation von Gastbetriebssystemen

Tutorials für Spezial-Linuxe als Gast gibt es en masse, Anleitungen für HVM (Windows) eine ganze Ecke weniger. Wenn man nach Anleitungen sucht, dann ist es wichtig, das immer auf HVM einzugrenzen.

Haken: XEN sind keine gescheiten Fehlermeldungen zu entlocken. Das führte bei mir zu einem ganzen vollen Tag Zeitverlust nur Aufgrund eines Tippfejlers.

Oft war weder einem „xm dmesg“ noch /var/log/xen etwas gescheites zu entlocken.

Was ich empfehlen kann: Windows Boot-CD auf Festplatte kopieren. Das ist viel schneller als von der CD zu installieren:

dd if=/dev/cdrom of=/haumichblau/wincd.iso

dauert nicht lange, weil die cd in einem Rutsch gelesen werden kann. Auf das ISO kann dann in der Konfigurationsdatei der VM zugegriffen werden. Also erstelle ich mir eine Konfigurationsdatei für die VM unter /etc/xen/auto/win.xm

# Kernel ist der HVM-Loader. 265MB RAM sollten zum testen reichen
kernel  = '/usr/lib/xen-ioemu-3.0/boot/hvmloader'
builder = 'hvm'
memory  = '256'
device_model='/usr/lib/xen-ioemu-3.0/bin/qemu-dm'
# Laufwerke
disk    = [ 'file:/haumichblau/windisk.img,ioemu:hda,w','file:/haumichblau/wincd.iso,ioemu:hdc:cdrom,r' ]
#disk    = [ 'phy:/dev/hda,hda,r' ]
# Hostname
name    = 'annika'
#  Networking
#dhcp = dhcp
vif = ['type=ioemu, bridge=xenbr0']
# Behaviour
boot='d'
vnc=0
vncviewer=0
sdl=1

Damit Sollte die VM vom CD-Rom-ISO booten. Die letzten 3 Zeilen sind vielleicht interessant: Man hat quasi die Auswahl zwischen sdl und vnc. Wenn man eh ein Klickibunti auf seinem Server hat, dann kann man mit sdl die VM in einem Fenster sehen. Wenn man auf seinem Server aber kein Klickibunti hat, dann kann man mittels vnc sich die ganze Chose von einem anderen Rechner aus anschauen. Dazu sollte man aber in der /etc/xen/xend-config.sxp noch die Zeile

(vnc-listen '0.0.0.0')

am Ende so editieren, sonst geht das (in der Standardeinstellung) nur von localhost aus und damit kämen wir vom regen in die Traufe.

Zu den Festplatten/CD-Roms:

Wir haben da zwei definiert: ‚file:/haumichblau/windisk.img,ioemu:hda,w‘ und ‚file:/haumichblau/wincd.iso,ioemu:hdc:cdrom,r‘. Nehmen wir das ausseinander: file:/haumichblau/windisk.img ist eine noch nicht existierende Datei. Alternativ könnten wir auch eine Partition angeben. ioemu:hda bedeutet, dass man der VM ein hda (erste Festplatte) vorgaukelt und das w steht dafür, dass man darauf auch schreiben darf. file:/haumichblau/wincd.iso ist unser ISO-Image, dass wir gemacht haben, mit ioemu:hdc hängen wir das quasi „als Master an an den zweiten IDE-Port“ und das r steht für nur lesenden Zugriff.

Fehlt eigenlich nur noch die Datei für die Festplatte:

dd if=/dev/zero of=/haumichblau/windisk.img bs=1024k seek=4096 count=0 

Netzwerk fehlt uns noch. Wir greifen zwar in der VM schon drauf zu, aber wir sollten das in der /etc/xen/xend-config.sxp auch noch aktivieren. Dazu habe ich geschaut, dass das (network-script network-dummy) auskommentiert war und stattdessen das (network-script network-bridge) entkommentiert. (vif-script vif-bridge) war glaube ich schon aktiv.

Nach der Veränderung sollte man den xend neu starten.

Dann sollten wir die VM mittels „xm create /etc/xen/auto/win.xm“ starten können. Von einem anderen Computer können wir uns dann mit VNC auf Port -äh- 5900(?) verbinden. Nach dem ersten Teil der Installation bittet uns unser Windows darum, die CD aus dem Laufwerk zu nehmen. Wir machen das, indem wir in der Konfigurationsdatei der VM den Eintrag „boot“ auf c ändern. Dann können wir mit einem beherzten „xm destroy annika“ unsere VM ausschalten (annika ist der Name, den wir in der Konfigurationsdatei festgelegt haben) und mit einem „xm create /etc/xen/auto/win.xm“ wieder starten.

Zeit

> 5. Unser Uhrzeit-Problem 
[...]
>> Note that the wall-clock time exported
>> by Xen is UTC --- all domains must have appropriate timezone handling
>> (i.e. a correct /etc/localtime file).
Was die 2 Stunden erklärt. Man könnte dem Windows vielleicht einfach sagen, dass es in [ Greendings steht?
>> A:If you want each
>> domain to keep its own time, there are two ways to cause a domain to
>> run its wallclock independently from Xen: 1. Specify
>> 'independent_wallclock' on the command line. 2. 'echo 1
>> >/proc/sys/xeno/independent_wallclock'
>>
>> To reenable tracking of Xen wallclock: 1. 'echo 0
>> >/proc/sys/xeno/independent_wallclock'
...oder so.

Disk-Images

Die festplatten werden in Dateien oder Partitionen emuliert. Diese kann man aus dem Hostbestriebssystem nicht so einfach mounten. Wenn man die Gastfestplatte z.B. unter /dev/sda1 hat, dann zeigt einem ein fdisk /dev/sda1 auch schön die Partitionen an, die darin sind, aber /dev/sda1p1 etc. lassen sich nicht einfach mounten: mount meldet

mount: /dev/sda1p1 is not a valid block device

Dazu braucht man dann lomount oder kpartx, aber wo bekommt man das her? Nirgendwo zu finden, bei Edgy ist es nicht dabei. Irgendwann habe ich dann das Binary www.minimix.ch/debian-live/files/lomount vom Bojovic Dragan genommen. Nicht das ich den kennen würde oder so, aber das ist einfach das einzige, was ich gefunden habe.

Hilfreiche Links

XEN Manual:
www.cl.cam.ac.uk/research/srg/netos/xen/readmes/user/user.html
HVM Beispiel für unter SuSe:
en.opensuse.org/Xen_Full_Virtualization_Example
In Deutsch!
www.iku-ag.de/opensource/xen-auf-sles.jsp
Beispiel für Edgy:
help.ubuntu.com/community/XenVirtualMachine/XenOnUbuntuEdgy
Schlechte IO-Performance unter Windows?
lists.xensource.com/archives/html/xen-users/2007-01/msg01101.html ff