Es gibt Situationen im Leben, in denen man gerne einen Server virtualisieren möchte. Sei es weil man bestimmten PHP-CMS nicht über den Weg traut oder weil man mal etwas ausprobieren möchte, ohne gleich das Produktivsystem zu zerschießen.
Da OVH das fertige Xen-Image auf Debianbasis nicht mehr anbietet, musste eine eigene Installation her. Im folgenden eine kleine Anleitung ohne Anspruch auf Vollständigkeit.
1. Schritt: Basisinstallation + Bootloader tauschen
Das Debian Lenny Standardimage bei OVH kommt mit LILO als Bootloader daher. LILO ist nicht grad dafür bekannt, sich sonderlich gut mit Xen zu verstehen, deswegen müssen wir ihn durch grub ersetzen. Dafür gibt es zwei Möglichkeiten:
- Custom Lenny Installation
- LILO löschen und grub istallieren
Prinzipiell mag man vielleicht die erste Option bevorzugen, allerdings soll eine komplett eigene Installation bei OVH alles andere als unproblematisch sein, deswegen Variante 2.
Nach der Installation des Lenny Standardimages werfen wir also LILO raus und packen grub auf die Platte(n):
apt-get remove lilo
apt-get install grub
grub-install /dev/sda
grub-install /dev/sdb
Danach einmal den Server rebooten und schauen ob er noch hochfährt.
2. Schritt: Xen installieren
Als nächstes starten wir mit der eigentlichen Installation von Xen. Dazu verwenden wir
apt-get install xen-hypervisor-3.2-1-amd64 xen-linux-system-2.6.26-2-xen-amd64 xen-shel xen-tools xen-utils-3.2-1 xen-utils-common xenstore-utils
Dies sind die zum Zeitpunkt meiner Installation (Ende Dezember 2010) aktuellen Pakete. Die Version des Kernels und von Xen vorher unbedingt mittels
apt-cache search xen
überprüfen!
Damit ist die eigentliche Xen-Installation abgeschlossen. Nun einmal rebooten und dann sollte
uname -a
in etwa das auswerfen
Linux nsxxxxxx.ovh.net 2.6.26-2-xen-amd64 #1 SMP Thu Nov 25 06:39:26 UTC 2010 x86_64 GNU/Linux
3. Schritt: Xen konfigurieren
Läuft Xen, dann steht man vor der Frage, wie viele DomU (VMs) man braucht/haben will. Ich habe jede größere Webseite, sowie die wichtigsten Dienste (Datenbanken, Mail) in eigene VMs gepackt. Die restlichen Joomlas und WordPress-Installationen die noch aufm Server rumflogen wurden ebenfalls in eine VM weggesperrt.
So kommt man sehr schnell auf mehr VMs als man IPs hat. Besonders auf dem Port 80 (HTTP) wirds schneller eng als einem lieb ist. Damit trotzdem alles funktioniert, habe ich mich für eine Kombination aus NAT und nginx entschieden um alles zu verteilen.
In der /etc/xen/xend-config.sxp fügen wir folgende Zeilen hinzu:
(network-script ‘network-nat netdev=eth0′)
(vif-script vif-nat)
netdev=eth0 bezeichnet das Netzwerkinterface, das am Internet hängt. Sollte in 99,9% der Fälle “eth0″ sein. Alle anderen network-scripte und vif-scripte werden auskommentiert.
In der /etc/network/interfaces dann folgende Zeile bei “eth0″ (oder eurem jeweiligen Interface hinzufügen)
up route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.1
Damit ist die Konfiguration von Xen abgeschlossen. Sollten mehr als vier VMs benötigt werden, müsst ihr noch die folgende Zeile in “/etc/modules” hinzufügen bzw. ändern:
loop max_loop=32
Damit könnt ihr maximal 16 VMs gleichzeitig verwenden. Wieso, weshalb, warum seht ihr später. Danach ist (mal wieder) ein Reboot erforderlich.
4. Schritt: DomU erstellen
Nachdem wir nun alles konfiguriert haben, können wir unsere erste DomU (VM) erstellen. Das geht mit dem folgenden Befehl
xen-create-image –hostname=nginx –size=4Gb –swap=256Mb –ide –ip=10.0.0.2 –netmask=255.255.255.0 –gateway=10.0.0.254 –dir=/xen –memory=128Mb –kernel=/boot/vmlinuz-2.6.26-2-xen-amd64 –initrd=/boot/initrd.img-2.6.26-2-xen-amd64 –debootstrap –dist=lenny –mirror=http://ftp2.de.debian.org/debian/ –arch=amd64 –role=udev –passwd
Damit erstellen wir eine VM mit einer 4 GB Festplatte, 256MB swap, 128MB RAM, der IP 10.0.0.2 und dem Namen nginx.
Ist die VM erstellt und das Root-Passwort gesetzt, müssen noch zwei Einträge an der /etx/xen/nginx.cfg vorgenommen werden. Hier müssen folgende zwei Zeilen hinzugefügt werden, sonst startet die VM nicht korrekt:
extra = “console=hvc0 xencons=tty”
extra = “clocksource=jiffies”
Dann können wir die VM mit
xm create nginx.cfg
hochfahren.
5. Schritt: nginx
Wir verbinden uns per ssh auf die VM mit
ssh root@10.0.0.2
Wir installieren nginx wieder via apt-get:
apt-get install nginx
Anschließend fügen wir in der “/etc/nginx/nginx.conf” im Block http folgende Zeilen ein:
server_names_hash_bucket_size 64;
client_max_body_size 32M;
Die erste Zeile ist dafür da, dass auch längere Domainnamen verarbeitet werden können. Die zweite Zeile legt die maximale Größe eines Requests fest. Wer also mit Dateiuploads via HTTP arbeiten möchte, sollte diesen Wert entsprechend setzen bzw. ggf. vergrößern.
Wenn man später in weiteren VMs Webserver (Apache oder sonstige Geschmacksrichtungen) installiert hat, müssen wir die Request auch irgendwie dahin bekommen. Dafür erstellen wir in “/etc/nginx/sites-enabled/” eine neue Datei, die sinnigerweise genauso heißt, wie die Ziel VM, mit folgendem Inhalt:
server {
listen 80;
server_name *.moorhuhnworld.de *.moorhuhn-world.de *.moorhuhnforum.de *.moorhuhn-forum.de;location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.0.0.10/;
proxy_pass_request_body on;
proxy_set_header HOST $host;
}
location ~ /\. {
deny all;
}
}
Anschließend dann nginx mit
/etc/init.d/nginx restart
neustarten und die VM mit “exit” verlassen.
Damit nun nginx die Request auch verteilen kann, müssen wir den Port 80 auch an die nginx VM weiterleiten:
iptables -A PREROUTING -t nat -p tcp -i eth0 –dport 80 -j DNAT -d <deine Server IP> –to 10.0.0.2:80
Achtung! Nach jedem Neustart verschwindet die Weiterleitung wieder, also am besten per Cronjob nach jedem Boot ausführen!
Aktuell habe ich noch ein Problem mit der DNS Auflösung zwischen einzelnen VMs, sobald ich das habe, werde ich diesen Eintrag entsprechend ändern.
Freue mich jederzeit über Verbesserungen, Anregungen usw.

