XEN unter Debian

From NJH-Wiki

Jump to: navigation, search
Autor 
Thomas Schmidt


Contents

Einleitung

Auf unserem Mietserver wollten wir mehrere Projekte unterbringen, die trennbar und einzeln auszuwechseln sein sollten. Einige mussten für viele Benutzer zugänglich gemacht werden, andere sollten zuverlässig abgeschottet laufen.

Ich entschied mich für den Einsatz von XEN, weil es die Anforderungen erfüllt. Weiterhin ist es momentan (Anfang 2007) mehr im Gespräch ist als die Konkurrenten vServer, QEMU usw., sehr gut in Debian integriert, zuverlässig und frei.

Voraussetzungen

Gebraucht wird ein Rechner mit Debian Etch. Ich habe die AMD-64-Version genommen. Die Standardquellen reichen. Backports, Closed-Source-Software, Compilierungen und Daten von anderen Quellen sind nicht notwendig.

Man braucht anscheinend sehr viel RAM im Rechner, da jede virtuelle Maschine (DomU genannt) einen fest eingestellten Bereich zugeteilt bekommt. 3x 512MB für drei Gastsysteme sind nicht viel, aber trotzdem muss man 2GB einbauen, weil auch der XEN-Host (Dom0) etwa 196MB Speicher braucht.

Auf der Festplatte muss zwar für jedes System viel Platz geschaffen werden, aber man muss nicht die Summe aller vituellen Gastfestplatten zur Verfügung haben. Die Gäste belegen nämlich nur den tatsächlich verbrauchten Plattenplatz. Wenn man für jedes Gastbetriebssystem 1,5GB rechnet, ist der Mehrverbrauch nicht so entscheidend.

XEN Basisinstallation

Es wird ein System mit einer Netzwerkkarte eth0 und einer IP pro Gast plus einer für den Host eingerichtet.

In /etc/network/interfaces reicht die übliche Konfiguration mit Loopback und fest eingesteller IP der Netzwerkkare eth0.

$ apt-get install xen-linux-system-2.6.18-4-xen-amd64 xen-tools bridge-utils

Entsprechend ein anderer Kernel für eine andere CPU. XEN-Tools erleichtern das Leben erheblich. Bridge-Utils richten eine Bridge ein, das ist ein virtueller Netzwerkhub, der alle virtuellen Netzwerkkarten der Gäste miteinander verbindet.


Die symbolischen Links auf den Kernel werden auf den neu installierten umgebogen:

/boot$ ls -l
Original:
lrwxrwxrwx 1 root root      25 2007-04-24 16:42 initrd.img -> initrd.img-2.6.18-4-amd64
lrwxrwxrwx 1 root root      22 2007-04-24 16:42 vmlinuz -> vmlinuz-2.6.18-4-amd64
Symbolische Links auf neuen Kernel umgebogen:
lrwxrwxrwx 1 root root      29 2007-04-24 23:39 initrd.img -> initrd.img-2.6.18-4-xen-amd64
lrwxrwxrwx 1 root root      26 2007-04-24 23:38 vmlinuz -> vmlinuz-2.6.18-4-xen-amd64


Ich habe Lilo rausgeschmissen und Grub als Bootloader installiert. Das ist reine Glaubensfrage. Man muss an dieser Stelle nur sicherstellen, dass der Rechner mit dem neuen Kernel bootet.

$ apt-get install grub
$ apt-get remove lilo
$ grub-install /dev/sda
$ update-grub


Die XEN-Tools helfen bei der Einrichtung der Gastsysteme. Wie sie es machen, kann man einstellen.

$ cat /etc/xen-tools/xen-tools.conf
#
# /etc/xen-tools/xen-tools.conf
#
#  Global configuration file for the scripts included with Xen-tools.
#
##
dir = /home/xen
#
#
#  Installation method.
debootstrap = 1
#
size   = 20Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 512Mb    # Swap size
# noswap = 1      # Don't use swap at all for the new system.
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = etch    # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
#
#  Currently supported and tested distributions include:
#
#   sid          - Debian
#   sarge        - Debian
#   etch         - Debian
#   dapper       - Ubuntu
#   centos4      - CentOS 4
#   fedora-core4 - Fedora Core 4 (codname stentz)
#
# Uncomment and adjust these network settings if you wish to give your
# new instances static IP addresses.
#
gateway   = 123.432.63.243
netmask   = 255.255.255.0
#
# Default kernel and ramdisk to use for the virtual servers
#
kernel = /boot/vmlinuz-2.6.18-4-xen-amd64
initrd = /boot/initrd.img-2.6.18-4-xen-amd64
#
# The default mirror for debootstrap which can be used to install
# Debian Sid, Sarge, and Etch.
#
mirror = http://ftp.de.debian.org/debian/


Und die Konfiguration des XEN-Hosts:

$ cat /etc/xen/xend-config.sxp
# -*- sh -*-
#
#
# Xend configuration file.
#
#
##
# To bridge network traffic, like this:
#
# dom0: fake eth0 -> vif0.0 -+
#                            |
#                          bridge -> real eth0 -> the network
#                            |
# domU: fake eth0 -> vifN.0 -+
#
# use
#
(network-script 'network-bridge antispoof=yes')
#
# If you are using only one bridge, the vif-bridge script will discover that,
# so there is no need to specify it explicitly.
#
(vif-script vif-bridge)
#
# Dom0 will balloon out when needed to free memory for domU.
# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
# If dom0-min-mem=0, dom0 will never balloon out.
(dom0-min-mem 196)
#
# In SMP system, dom0 will use dom0-cpus # of CPUS
# If dom0-cpus = 0, dom0 will take all cpus available
(dom0-cpus 0)

Es wird also die besprochene Bridge eingesetzt. Antispoof=yes bedeutet, dass IPTables (also die Firewall) so eingerichtet wird, dass ein Gast nur Pakete mit seiner IP als Absender senden darf.

$ mkdir /home/xen

Gäste und der Betrieb

Mit den XEN-Tools ist es sehr einfach, ein Gastsystem einzurichten:

$ xen-create-image --hostname xentest1 --ip 123.18.124.242

Dabei werden die beiden Partitionsimages auf /home/xen generiert und eine Konfigurationsdatei in /etc/xen/ erstellt.

Den Gast startet man mit:

xm create /etc/xen/gast1.cfg

Überhaupt braucht man im Betrieb nur noch den xm-Befehl, um die laufenden Gäste und deren CPU-Verbrauch zu ermitteln, neue zu starten, sie herunterzufahren und auf /dev/tty1 des Gastes eine Konsole zu bekommen.

So sieht eine funktionierende Bridge aus, hier mit einem gestarteten Gast:

$ brctl show
bridge name     bridge id               STP enabled     interfaces
xenbr0          8000.feffffffffff       no              vif0.0
                                                       peth0
                                                       vif1.0
iptables -L

zeigt an, wie die Firewall die Pakete an der Bridge kontrolliert. Wenn alles auf Accept steht, lässt sie einfach alles durch.

Sehr interessant:

$ ll
-rw-r--r-- 1 root root 21 474 836 480 2007-04-25 01:05 disk.img
$  du * -sh
1,1G    disk.img
$ df
Dateisystem          1K-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/sda2            286371612   2241592 269583164   1% /

Dieses Image hat zwar eine Größe von 20GB, verbraucht auf der Platte aber nur 1,1GB. Damit hat die gesamte Serverplatte weniger Daten gespeichert als alleine das Image groß ist.


Weiteres

Resize / Größe ändern: (Vorher Gastsystem runterfahren!)

$ dd if=/dev/zero bs=1024000 count=1024 >> disk.img
$ resize2fs -f disk.img

Damit steht im Gastsystem 1GB mehr Platz zur Verfügung, die Imagedatei verbraucht aber erst einmal nicht mehr Speicher auf der Platte.

Wenn man ein Image kopiert, werden ungenutzte Teile nicht mehr gespeichert, so dass das Image nur noch so viel auf der Platte belegt, wie auch wirklich im Gast gespeichert wurde.

Nur Dom0, also der Host, kann die Systemzeit setzen. Das sollte er auch tun:

$ apt-get install ntpdate
$ ntpdate ptbtime1.ptb.de

Wer sich wundert, dass die Gäste eine andere Zeit angeben als der Host, korrigiert die Zeitzone:

ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Loop-Devices

Es musste ja kommen, irgend etwas haben die Debian-Paket-Bauer vergessen. Beim Start des fünften Gastsystemes kam diese Meldung:

Error: Device 2049 (vbd) could not be connected.

Auf deutsch: Die paar Loop-Devices, die in /dev sind, reichen nicht.

Da wir einen modularen Kernel haben, kann man zur Laufzeit nachhelfen und erstellen diese Datei:

$ cat /etc/modprobe.d/xen 
options loop max_loop=64

Nun noch schnell das Modul neu laden oder den Server rebooten:

$ rmmod loop
$ modprobe loop

Jetzt sind in /dev/ 64 Loop-Devices zu sehen und noch ein paar Gäste startbar.

Feedback

Korrekturen und Ergänzungen sind sehr wilkommen, da auch der Autor erst seit kurzem mit XEN arbeitet und nur das ergründen konnte, was er dringend gebraucht hat.

  • oben steht, dass Grub/Lilo Gemschmacksache sein. Soweit ich das in Erinnerung habe ist für XEN Grub Pflicht. -- Frennkie 19:56, 27 May 2007 (CEST)
  • Ich nutze statt loop devices LVM. Damit rennt man auch nicht in die Problematik mit zu wenigen loop devices.. aber es ist gut möglich, dass das jetzt Geschmacksache ist! ;-) -- Frennkie 19:56, 27 May 2007 (CEST)
Personal tools