Xen 4.1 und LVM: Installation und Konfiguration (Debian Wheezy)
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:
MaxBandwidth 0
Nach einem Neustart kann vnstat
verwendet werden:
/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:
dhcp = 'dhcp'
vif = [ 'vifname=test1,mac=00:16:3E:36:DA:AE' ]
Um ein neues Interface in die vnstat
-Überwachung einzubinden reicht folgender Befehl:
vnstat -u -i test1
Bandbreite limitieren
Mit der Angabe rate
in der Configdatei des Gastes kann die Upload-Datentransferrate beschränkt werden:
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:
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
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
:
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.