XEN

Mit Hilfe von Xen lassen sich virtuelle Maschinen erzeugen, dies ist praktisch z.B. um verschiedene Kundenserver separat voneinander auf derselben Hardware laufen zu lassen, aber auch Testsysteme lassen sich so realisieren.

Xen selbst ist schnell installiert und aufgesetzt, allerdings sollte man sich schon einige Gedanken machen, z.B. ist es sehr sinnvoll ein LVM-System zu verwenden.

LVM erlaubt es Partitionen beliebig zu vergrößern und zu verkleinern, außerdem sind damit Snapshots für Backupzwecke möglich. Allerdings muss LVM meist bereits bei der Installation berücksichtigt werden, oder eine leere Partition verfügbar sein, welche nachträglich mit LVM bestückt werden kann. Unter [[/debian-remote-installer/|Debian Remote Installer]] ist erläutert wie man diese Bedingungen schaffen kann.# Systeminstallation mit LVM #

Um die Xen-VMs besser sichern zu können empfiehlt sich die Installation auf einem LVM (ggf. mit RAID-Unterbau). Die Konfiguration kann über den Debian-Installer erfolgen, allerdings ist dieser dann nicht in der Lage selbstständig GRUB zu installieren. Bis zum Installationszeitpunkt von GRUB führt man die Debian-Installation wie gewohnt durch (inkl. RAID und nachgelagerter LVM-Konfiguration). Das LVM sollte mit einer kleinen Partition für das Hostsystem angelegt werden. Der freie Speicher wird dann später beim Einrichten der Clients zugewiesen.

Wenn die Debian-Installation so weit abgeschlossen ist und die GRUB-Installation ansteht wechselt man auf eine freie Konsole (Strg+Alt+F2), die automatische GRUB-Installation schlägt fehl. Dort müssen nun einige Verzeichnisse gemountet werden:

mount /dev /target/dev
mount /dev/shm /target/dev/shm
mount /dev/devpts /target/dev/devpts
mount /proc /target/proc
mount /sys /target/sys

Nun kann man in das bereits installierte Debian-System wechseln und Grub installieren:

chroot /target
grub-install /dev/sda
grub-install /dev/sdb
grub-install /dev/sdc
update-grub

Nun kann man zum Debian-Installer zurückkehren (Strg+Alt+F1) und setzt die Installation ohne Bootmanager fort.

Installation

Nachdem das neue System bereitsteht kann man Xen installieren:

apt-get install xen-linux-system-amd64 xen-tools xen-utils-4.1 xen-hypervisor-4.1-amd64

Grundkonfiguration

Zunächst ist dafür zu sorgen dass Grub automatisch den Xen-Kernel bootet:

dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen
update-grub
reboot

Außerdem wird eine Netzwerk-Bridge benötigt:

# /etc/network/interfaces

auto xenbr0
iface xenbr0 inet dhcp
    bridge_ports eth0

Siehe auch: http://wiki.xen.org/wiki/Host_Configuration/Networking

Anschließend werden einige Einstellungen (Speicherverwaltung) für den Host vorgenommen:

# /etc/default/grub

# Xen boot parameters for all Xen boots
GRUB_CMDLINE_XEN="dom0_mem=1024M"
# /etc/xen/xend-config.sxp

(dom0-min-mem 1024)
(enable-dom0-ballooning no)

Die Optionen müssen noch von GRUB übernommen werden:

update-grub
reboot

Außerdem sorgen wir dafür dass der Status der VMs beim herunterfahren nicht gesondert gesichert wird:

# /etc/default/xendomains

XENDOMAINS_RESTORE=false
XENDOMAINS_SAVE=""

VM erstellen und starten

Um einen (Debian-) Gast zu erstellen reicht folgende Zeile aus:

xen-create-image --hostname=test1 --size=10Gb --swap=512Mb --memory=512Mb --pygrub --dist wheezy --fs=ext4 --ip=dhcp --dir=/home/xen

Hierbei wird ein System mit dem Namen test1 angelegt (in der Praxis sollte hier der Name des Kunden genutzt werden), mit vcpus wird die Anzahl der CPUs für den Gast festgelegt. Als Distribution wird Debian Wheezy genutzt, als Dateisystem ext4. Es wird ein Laufwerk mit 8GB Speicherplatz sowie eine 1GB große Swap-Partition angelegt. Der Arbeitsspeicher wird auf 1GB begrenzt.

Die Images für das System werden unter /home/xen abgelegt.

Nachdem debootstrap seine Arbeit erledigt hat ist der Gast einsatzbereit, man sollte nur nicht vergessen sich das Kennwort für den root-Benutzer zu notieren.

Nun kann der Gast gestartet werden:

xen create /etc/xen/test1.cfg
xen console test1

Die Konsole kann mit Strg+] wieder verlassen werden.

LVM-Gastlaufwerke

Das obige Verfahren erzeugt Image-Dateien für die Gast-Laufwerke. Will man LVM verwenden muss folgender Befehl genutzt werden um den Gast zu erzeugen:

xen-create-image --hostname=test2 --size=10Gb --swap=512Mb --memory=512Mb --pygrub --dist wheezy --fs=ext4 --dhcp --lvm=vg0

Für den Gast werden dann automatisch zwei neue logische LVM-Laufwerke angelegt, /dev/vg0/test2-swap und /dev/vg0/test2-disk. Dies kann man sich auch mit lvdisplay anzeigen lassen:

  --- Logical volume ---
  LV Path                /dev/vg0/root
  LV Name                root
  VG Name                vg0
  LV UUID                gEIfyq-7CMB-BJhg-nfAO-06z1-PI1i-mhqUqs
  LV Write Access        read/write
  LV Creation host, time , 
  LV Status              available
  # open                 1
  LV Size                46.56 GiB
  Current LE             11920
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/vg0/test2-swap
  LV Name                test2-swap
  VG Name                vg0
  LV UUID                RrmY35-RlvV-9U6E-mIm5-j9aF-sCGZ-TMBnm1
  LV Write Access        read/write
  LV Creation host, time test, 2012-12-19 14:57:29 +0100
  LV Status              available
  # open                 1
  LV Size                512.00 MiB
  Current LE             128
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/vg0/test2-disk
  LV Name                test2-disk
  VG Name                vg0
  LV UUID                rduUWz-8rIq-tqEC-uKtF-ub2m-QjvP-jFt9QG
  LV Write Access        read/write
  LV Creation host, time test, 2012-12-19 14:57:29 +0100
  LV Status              available
  # open                 1
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     4096
  Block device           253:2

Gastfestplatte vergrößern/verkleinern

Benötigt der Gast mehr Speicherplatz kann das Laufwerk mit lvresize -L +5Gb /dev/vg0/test2-disk um z.B. 5GB vergrößert werden. Nachdem das LVM-Volume vergrößert wurde muss noch das Dateisystem entsprechend angepasst werden, der Gast muss zuvor natürlich heruntergefahren werden:

e2fsck -f /dev/vg0/test2-disk
resize2fs /dev/vg0/test2-disk

Mit vgdisplay vg0 kann man prüfen wie viel freier Speicherplatz noch insgesamt auf dem Host zur Verfügung steht (Free PE / Size).

Um die Festplatte zu verkleinern geht man wie folgt vor:

e2fsck -f /dev/vg0/test2-disk
resize2fs /dev/vg0/test2-disk 10G
lvchange -an /dev/vg0/test2-disk
lvresize -L -10Gb /dev/vg0/test2-disk
lvchange -ay /dev/vg0/test2-disk
e2fsck -f /dev/vg0/test2-disk

Auch hierbei sollte das Gastsystem natürlich nicht laufen.

Gastfestplatte löschen

Soll der Gast gelöscht werden sollten auch die Laufwerke entfernt werden, dies geschieht durch lvremove /dev/vg0/test2-disk bzw. lvremove /dev/vg0/test2-swap.

Gast-IP ermitteln

Die einfachste Methode um die IP eines Gasts zu ermitteln ist sich einfach dort einzuloggen (xen console $name). Ist dies nicht möglich kann nmap genutzt werden, hierzu ist es jedoch hilfreich zunächst die MAC-Adresse zu ermitteln:

xenstore-read /local/domain/0/device/vif/16/mac

Die 16 steht hierbei für die ID der Gastmaschine (xen list). Alternativ können Pfad und MAC aber auch über den Befehl xen network-list 16 herausgefunden werden.

Die nun bekannte MAC-Adresse wird nun an nmap übergeben:

nmap -sP 192.168.3.0/24 | grep -B 2 00:16:3E:95:5C:14

Gäste überwachen

Mittels xen top kann die CPU und Speicherauslastung sowie der Netzwerktraffic aller Gastsysteme in Echtzeit überwacht werden.

Traffic überwachen

Da jeder Gast seine eigene virtuelle Netzwerkkarte besitzt kann auch der Traffic problemlos überwacht werden, hierzu bietet sich vnstat an:

apt-get install vnstat

In der Konfiguration wird nun noch das Bandbreitenlimit abgeschaltet:

```bash /etc/vnstat.conf>
MaxBandwidth 0


Nach einem Neustart kann `vnstat` verwendet werden:

```bash
/etc/init.d/vnstat restart

Es dauert etwas bis vnstat ausreichend Daten gesammelt hat, anschließend sollte das Ergebnis wie folgt aussehen:

root@xentest:~# vnstat
                      rx      /      tx      /     total    /   estimated
 vif3.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

 vif5.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

 vif6.0:
       Sep '12    137.33 MiB  /   80.01 MiB  /  217.34 MiB  /  328.00 MiB
         today    137.33 MiB  /   80.01 MiB  /  217.34 MiB  /     283 MiB

 vif7.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

 vif9.0:
       Sep '12      1.28 MiB  /     853 KiB  /    2.11 MiB  /       0 KiB
         today      1.28 MiB  /     853 KiB  /    2.11 MiB  /      --    

 eth0:
       Sep '12     87.26 MiB  /  156.64 MiB  /  243.90 MiB  /  368.00 MiB
         today     87.26 MiB  /  156.64 MiB  /  243.90 MiB  /     318 MiB

 vif4.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

 vif8.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

 xenbr0:
       Sep '12      2.60 MiB  /     710 KiB  /    3.30 MiB  /       0 KiB
         today      2.60 MiB  /     710 KiB  /    3.30 MiB  /      --    

 vif2.0:
       Sep '12         0 KiB  /      93 KiB  /      93 KiB  /       0 KiB
         today         0 KiB  /      93 KiB  /      93 KiB  /      --    

Um die Zuordnung der Netzwerkinterfaces zu den Xen-Clients zu vereinfachen kann man den Namen des Clients statt vifx.0 verwenden:

```bash /etc/xen/test1.cfg>
dhcp = 'dhcp'
vif = [ 'vifname=test1,mac=00:16:3E:36:DA:AE' ]


Um ein neues Interface in die `vnstat`-Überwachung einzubinden reicht folgender Befehl:

```bash
vnstat -u -i test1

Bandbreite limitieren

Mit der Angabe rate in der Configdatei des Gastes kann die Upload-Datentransferrate beschränkt werden:

```bash /etc/xen/test1.cfg>
vif = [ 'rate=5MB/s,mac=00:16:3E:E6:4E:63' ]


Die Rate von `5MB` ergibt in der Praxis eine Übertragungsgeschwindigkeit von ca. 4 Megabyte pro Sekunde. Beschränkt wird hierbei nur Upload-Traffic. Downloads werden immer mit der maximal verfügbaren Geschwindigkeit durchgeführt.

Soll auch der Downstream limitiert werden kann `tc` verwendet werden:

```bash
tc qdisc add dev test1 root handle 1: htb default 12
tc class add dev test1 parent 1: classid 1:12 htb rate 1mbit

Limitiert die Bandbreite für test1 auf 1mbit/sek.

Mit folgendem Befehl kann das Limit wieder aufgehoben werden:

tc qdisc del dev test1 root

Um zu prüfen welche Einstellungen für ein Interface aktiv sind können folgende Befehle genutzt werden:

tc class show dev test1
tc qdisc show dev test1

Die Default-Settings für qdisc sehen wie folgt aus:

qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

class liefert im Defaultzustand ein leeres Ergebnis.

WICHTIG: tc muss innerhalb des Gastsystems ausgeführt werden.

Performance

Das Hostsystem muss für die Gäste einige Aufgaben ausführen, geht dem Host hierbei die Luft aus leiden darunter alle Gäste. Standardmäßig sind Host und Gäste aber gleichberechtigt (256 Credits) was die Ressourcenverteilung angeht. Dies kann wie folgt geändert werden:

xen sched-credit -d Domain-0 -w 512

Der Befehl muss bei jedem Neustart erneut ausgeführt werden und sollte daher in die rc.local aufgenommen werden.

Auf Systemen mit Gästen die I/O-Intensiv sind sollte zudem eine oder mehrere CPUs für das Hostsystem reserviert werden. Hier wird dom0_max_vcpus=X dom0_vcpus_pin in die grub.conf eingetragen. Nach einem Neustart kann man sich mit xm vcpu-list anzeigen lassen ob die Einstellungen korrekt übernommen wurden.

Außerdem sollte in allen Gast-Konfigurationen (/etc/xen/*.cfg) die Option cpus=x-y aufgenommen werden. x steht hierbei für die erste CPU welche ein Gastsystem verwenden darf, y für die Letzte.

Backup

Das Backup einer VM sollte über LVM-Snapshots erfolgen, hierbei ist sichergestellt, dass Daten die sich auf dem Client während des Backups verändern korrekt gesichert werden. Nutzt die VM Images sollte das Backup vom Client selbst aus durchgeführt werden, so wie bei einer physikalischen Maschine.

Der Snapshot wird wie folgt erstellt:

lvcreate -n test1-snapshot -L 1G -s vg0/test1-disk

Anschließend kann der Snapshot gemountet werden:

mount /dev/vg0/test1-snapshot /mnt

Nun können die Daten in /mnt ganz normal gesichert werden. Nachdem das Backup durchgeführt wurde kann der Snapshot gelöscht werden:

umount /mnt
lvremove /dev/vg0/test1-snapshot

WICHTIG: Die Größe des Snapshot (1G) muss so gewählt werden dass die Größe ausreicht um alle während des Backups neu erzeugten Daten aufnehmen zu können. Läuft der Snapshot vorher voll wird der Snapshot deaktiviert und das Backup schlägt fehl. Natürlich muss in der Volume Group genügend Platz vorhanden sein um das Snapshot-Laufwerk in der gewünschten Größe anlegen zu können. Daher sollten Backups von VMs auch nicht zeitgleich erfolgen.

Alternativ kann eine Überwachung des Snapshots mittels dmeventd eingerichtet werden, hierüber kann der Snapshot dann bei Bedarf automatisch vergrößert werden:

apt-get install dmeventd

```bash /etc/lvm/lvm.conf>

 snapshot_autoextend_threshold = 80
 snapshot_autoextend_percent = 20

 monitoring = 1

Mit `snapshot_autoextend_threshold` gibt man an ab welcher "Füllmenge" des Snapshot eine Vergrößerung erfolgt. Mit `snapshot_autoextend_percent` gibt man an um wieviel Prozent der Snapshot vergrößert werden soll. Damit `dmeventd` die Vergrößerung auch wirklich vornimmt ist es erforderlich das `monitoring` einzuschalten.

Der `dmeventd` schreibt alle Aktionen ins `syslog`:

```bash /var/log/syslog>
Jan 28 12:54:19 test lvm[25882]: Extending logical volume snap to 1.31 GiB
Jan 28 12:54:19 test lvm[25882]: Monitoring snapshot vg0-snap
Jan 28 12:54:19 test lvm[25882]: Logical volume snap successfully resized
Jan 28 12:54:21 test lvm[25882]: No longer monitoring snapshot vg0-snap

Obwohl dmeventd behauptet die Überwachung des Snapshots zu beenden funktioniert die Vergrößerung beliebig oft hintereinander (zumindest solange noch Platz in der Volume Group zur Verfügung steht).Um ein Backup einer kompletten Maschine zu erstellen, z.B. um auf einem Testsystem den Defaultzustand wiederherzustellen kann dd verwendet werden. Hierzu muss der Gast zunächst heruntergefahren werden:

xen shutdown $gast
dd if=/dev/vg0/$gast-disk | pv > /backup/$gast-disk.dd.img
dd if=/dev/vg0/$gast-swap | pv > /backup/$gast-swap.dd.img
xen create /etc/xen/$gast.cfg

Ein Restore erfolgt dann folgendermaßen:

xen shutdown $gast
dd if=/backup/$gast-swap.dd.img of=/dev/vg0/$gast-swap
dd if=/backup/$gast-disk.dd.img of=/dev/vg0/$gast-disk
xen create /etc/xen/$gast.cfg

WICHTIG: Die Größe des LVM-Volumes darf zwischenzeitlich nicht geändert worden sein, bzw. muss die Größe vor dem Restore wieder auf die Ursprungsgröße zurückgesetzt werden. Anschließend kann das Volume vergrößert und ein neues Backup erzeugt werden.

Problembehebung

Es kann vorkommen dass beim Erzeugen/Start einer neuen VM das Dateisystem nicht gemountet werden kann, in diesem Fall stehen wahrscheinlich keine Loop-Devices mehr zur Verfügung. Es können aber einfach weitere angelegt werden:

# mkloop.sh

#!/bin/bash

for ((i=8;i<64;i++)); do
  [ -e /dev/loop$i ] || mknod -m 0600 /dev/loop$i b 7 $i
done

Werden dauerhaft mehr loop-Devices benötigt sollte die Zeile loop in /etc/modules um den Parameter max_loop= erweitert werden:

loop max_loop=64

Werden LVM-Partitionen für die Gäste verwendet ist kein loop-Device notwendig.


Kommentare

Kommentare unterstützt von Disqus.

Nächster Beitrag Vorheriger Beitrag