XEN Virtualisierung

Einführung

Bei XEN unterscheidet man zwischen Dom 0 und Dom U. Wobei Dom 0 der Hypervisor ist, also das Hauptsystem und alle weiteren Domänen aus Dom Us, den virtualisierten Systemen bestehen. Der Hypervisor kontrolliert alle anderen Systeme.

Installation des Grundsystems

Ich verwende für das Grundsystem eine Ubuntu Serverinstallation ohne zusätzliche Pakete. Also nicht mit DNS oder LAMP installieren. Wahrscheinlich würde auch ein ganz normales Ubuntu funktionieren...

apt-get install vim ssh

Damit wir aus der Ferne arbeiten können.
Seit Gutsy haben sich einige Fehler eingeschlichen, wie wir später auch noch sehen werden. Für die Automatische XEN-Installation existiert jeweils ein Dummypaket welche alle nötigen Pakete nach lädt. Leider sind diese Pakete nicht immer vorhanden. In der Serverversion existiert z.B. nur ein Desktoppaket.
Für die Serverversion

apt-get install ubuntu-xen-server

Für die Desktopversion

apt-get install ubuntu-xen-desktop

Manuell

apt-get install linux-xen xen-utils-3.1 xen-tools bridge-utils xen-docs-3.1 xen-ioemu-3.1

Damit genügend Loopback-Devices erstellt werden können:
/etc/modules:

...
loop max_loop=64
...

In der xend Konfigurationsdatei /etc/xen/xend-config.sxp muss die Zeile (network-script network-bridge) aktiviert werden und die Zeile (network-script network-dummy) muss ausgeklammert werden.
Danach XEN mit /etc/init.d/xend restart neu starten.

Jetzt muss neu gestartet werden, damit der XEN-Kernel geladen wird.

Virtuelle Systeme installieren

Es gibt verschiedene Möglichkeiten um virtuelle Systeme zu installieren. Man kann für jedes System eigene Partitionen erstellen oder man kann die Dateisysteme in Imagedateien vorrätig halten. Anscheinend ist der Geschwindigkeitsvorteil bei physikalischen Partitionen nur marginal.

Dom U mit Diskimages

Erstellen wir zuerst ein Gastsystem auf der Basis eines Diskimages ähnlich wie bei VirtualBox.

mkdir /var/xen
dd if=/dev/zero of=gast.img bs=1M count=1 seek=4095
dd if=/dev/zero of=swap.img bs=1M count=1 seek=512
mkfs.ext3 gast.img
mkswap swap.img
mount -o loop gast.img /mnt
debootstrap gutsy /mnt
cp -a /lib/modules/2.6.19-4-server/ /mnt/lib/modules

/mnt/etc/fstab:

proc            /proc           proc    defaults        0       0
/dev/hda1       /               ext3    defaults,errors=remount-ro 0       1
/dev/hda2       none            swap    sw              0       0

/mnt/etc/hostname

xen-gast1

/mnt/etc/hosts

127.0.0.1   localhost
127.0.1.1   xen-gast1

/mnt/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
# iface eth0 inet dhcp
iface eth0 inet static
        address 192.168.2.21
        netmask 255.255.255.0
        gateway 192.168.2.1
cp /etc/apt/sources.list /mnt/etc/apt/

Jetzt benötigen wir noch eine XEN-Konfigurationsdatei für jeden Gast

/etc/xen/xen-gast1

kernel = "/boot/vmlinuz-2.6.22-14-xen"
ramdisk = "/boot/initrd.img-2.6.22-14-xen"
builder='linux'
memory = 128
name = "xen-gast1"
vcpus = 1
vif = [ 'bridge=xenbr0' ]
disk = [ 'file:/var/xen/gast.img,hda1,w', 'file:/var/xen/swap.img,hda2,w' ]
root = "/dev/hda1 ro"
# extra = "3" für was ist das noetig??
# GUTSY BUGFIX:
extra = ' TERM=xterm xencons=tty console=tty1'

GUTSY BUGFIX 2:

chroot /mnt
update-rc.d -f hwclock.sh remove
update-rc.d -f hwclockfirst.sh remove
rm -f /etc/init.d/hwclock.sh /etc/init.d/hwclockfirst.sh /etc/udev/rules.d/85-hwclock.rules

GUTSY BUGFIX 3: /mnt/etc/udev/rules.d/70-persistent-net.rules:

...
# SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:16:3e:XX:XX:XX", NAME="eth0"
SUBSYSTEM=="net", DRIVERS=="?*",  NAME="eth0"
...

Falls der Kernel vom Dom0 hängen bleibt, muss vielleicht noch ACPI ausgeschaltet werden:

/boot/grub/menu.list:

  ...
  module   /boot/vmlinuz-2.6.22-14-xen root=UUID=your-uuid-here ro console=tty0 acpi=off
  ...

Beim Starten darf die Gastpartition nicht mehr im Hauptsystem gmountet sein.

umount /mnt

Jetzt können wir unseren Gast starten:

xm create xen-gast1

Wobei der Name dem Namen der Konfigurationsdatei entspricht. Für weitere Operationen wird allerdings der Name aus der Konfigurationsdatei verwendet (name = “xen-gast1”). Daher sollten diese gleich sein um Probleme zu vermeiden.

Mit dem Kommando xm list können wir überprüfen, welche Domänen gerade laufen. Mit dem Kommando xm shutdown xen-gast1 können wir ein System sauber runterfahren.

Diskimage vergrössern

Wenn der Platz einer virtuellen Partition knapp wird, so kann man das Dateisystem vergrössern. Dazu muss zuerst die Gast Domäne angehalten werden.

xm shutdown xen-gast1

Jetzt können wir die Datei um die gewünschte Grösse erweitern.

dd if=/dev/zero bs=1M count=1024 >> gast1.img
resize2fs -fp gast1.img

Und die Gastdomäne wieder starten

xm create xen-gast1

locales

apt-get install language-pack-de-base
Install/Reconfigure localeconf:
apt-get install localeconf
dpkg-reconfigure localeconf
  • Manage locale configuration files with debconf? → yes
  • Please select the default system locale. → Your locale. (de_CH UTF8).
  • Select the environment settings that should override the default locale. → Alle

Install/reconfigure locales:

apt-get install locales
dpkg-reconfigure locales
  • Hier die selben locale die wir bei localeconf angegeben haben.

Zeitzone richtig einstellen

Zuerst das richtige Zonenfile ins /etc linken:

ln -sf /usr/share/zoneinfo/Europe/Zurich /etc/localtime

Jetzt die Zeit neu synchronisieren, falls der NTP Dienst läuft, diesen zuerst stoppen.

/etc/init.d/ntp stop  # nur nötig falls NTP am laufen ist
ntpdate ntp.ubuntu.com
/etc/init.d/ntp start

Und die aktuelle Zeit in die Systemuhr übertragen. Dies geht aber nur im Dom0!

/sbin/hwclock --systohc

XEN mit NAT

Bisherige Installationen haben wir immer mit Bridging realisiert. Für NAT spricht der Vorteil, dass man intern ein virtuelles Netzwerk zur Verfügung hat. Ausserdem haben wir auf dem Hetzner XEN mit routing nicht zu laufen bekommen.

/etc/xen/xend-config.sxp:

...
(network-script network-nat)
(vif-script     vif-nat)
...
/etc/init.d/xend restart

Jetzt müssen wir auch noch das Dom0 System fürs Masqerading vorbereiten:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# erste Externe IP auf erste interne IP
iptables -t nat -I PREROUTING -d XX.XX.XX.01 -j DNAT --to 10.0.0.1
iptables -t nat -I POSTROUTING -s 10.0.0.1 -j SNAT --to XX.XX.XX.01
# zweite Externe IP auf zweite interne IP
iptables -t nat -I PREROUTING -d XX.XX.XX.02 -j DNAT --to 10.0.0.2
iptables -t nat -I POSTROUTING -s 10.0.0.2 -j SNAT --to XX.XX.XX.02

Um eine DomU zu erstellen können wir die xen-tools verwenden:

xen-create-image --hostname=gast1 --size=2Gb --swap=512Mb --memory=256Mb --ip=10.0.0.1 --netmask=255.255.255.0

Weitere Hinweise

 
linux/xen.txt · Zuletzt geändert: 11.07.2008 17:43 von tangst