Bisher habe ich bei all meinen Xen Servern immer das Bridge Setup verwendet da es Out-Of-the Box funktioniert. Ich werde zum Brdige Setup und Xen auch noch ein HowTo schreiben (alles auf Basis von Debian) so dass für andere sowas noch zur Verfügung steht
Also wie gesagt widmen wir uns heute einer Installation auf einem Hetzner Server DS8000 mit dem Routed Setup.
Bitte beachten: Bei Hetzner gibts Probleme mit der RTL Karte (Beitrag lesen) daher empfehle ich gleich bei Bestellung mit Herrn Pirner zu sprechen damit ihr eine Intel Karte bekommt, denn die geht ohne Probleme.
Hinweise:
Ich werde hier die Grundschritte zur Xen Installation erklären, Details was Xen ist, wie das alles funktioniert und was überhaupt Linux ist beantwortet euch Tante Google
Als erstes aber noch ein Inhaltsverzeichnis:
- System
- Vorbereitung
- Das Debian System
- Grub
- Hostnamen anpassen
- Grundpakete installieren
- Zeitserver einbinden
- LVM installieren
- XEN Installation
- Sources holen
- Sources installieren
- Debian Way – Die initrd
- Anpassung der menu.lst
- XEN Running
- Rebooting
- Starting
- Stopping
- XEN Running – Das erste mal in der Xen Umgebung
- XEN Routing
- Verständnis v. NAT, Routed, Bridge
- Routed Setup
- xend-config.sxp
- Kernel einstellen, Proxy_Arp und Forwarding
- Anpassung vif-route Script
- Anpassung vif-common.sh Script
- Anpassung xen1.cfg (DomU Configs)
- Ausführungen in der DomU
- Abschluss
1.) System
Unser System das wir verwenden hat folgende Systemdaten:
CPU: AMD Athlon 64 X2 6000+ Dual Core
RAM: 8192 MB
HDD: 750 GB x 2 RAID 1 Verbund
NET: Intel e1000 Karte (so heisst auch das Modul)
2) Vorbereitung
2.1) Das Debian System
Wir richten zunächst das Debian Bentriebssystem ein. Dazu booten wir bei Hetzner in den Rescue Modus und geben
folgenden Befehl ein:
installimage
Dabei verwende ich folgendes Setup für meine Partitionierung
BOOT /boot 1024 ext2
SWAP swap 8192 swap
PART / 20480 ext2
Nun werfen wir die Installation an und warten bis alles fertig ist. Wenn das Script durch ist checken wir kurz unsere Partitionen:
fdisk -l
Die Ausgabe zeigt uns alle Partitionen an. ReiserFS kann man verwenden bei Xen bin ich aber etwas vorsichtiger was ReiserFS angeht, da ich das noch nicht getestet habe, und ext3 tuts ja auch
Bei Hetzner gibt es irgend ein Problem wenn man direkt im Installimage ext3 als FStype angibt. Daher formatiere ich erst mit ext2 und switche dann mit tune2fs auf ext3:
tune2fs -j /dev/sdXX
2.2) Grub
Da Grub ein kleines Problem mit Servern hat die mehr als 4 GB Ram haben müssen wir uns diesen selbst bauen. Dabei verwende ich direkt die Sources aus dem Debian Brunch und kompiliere diese neu. Das habe ich bereit in einem Beitrag auf meinem Blog geschrieben:
Sobald wir Grub gebacken haben, empfehle ich als erstes wieder zu Rebooten damit wir den neuen Grub gleich testen können ob wir alles richtig gemacht haben. Vorher empfehle ich:
grub-install /dev/sdXX
Damit wir den Grub in den MBR schreiben, und dann updaten wir alles damit eine korrekte Menu.lst geschrieben wird:
update-grub
Ein Blick in die Datei kann nicht schaden, nur für die paranoiden
2.3) Hostnamen anpassen
Ich passe in diesem Schritt auch gleich immer die Hostnamen an wie der Server dann heisen soll, dafür verwende ich eine Subdomain damit ich alles auch schon monitoren kann Wie das geht weiss jeder gute Admin
2.4) Grundpakete installieren
Die Pakete die ich hier installiere brauche ich unter anderem für meine Verwaltungsoberfläche. Jeder sollte hier selbst wissen was er braucht und was nicht.
apt-get install php5-cli sudo fping iptables ext2resize gcc psmisc ntpdate libmysqlclient15off psmisc lvm2 python-dev iproute libncurses5-dev kernel-package bzip2 bridge-utils zlib1g-dev x11proto-core-dev libssl-dev
Leg die Steine da hinten gleich wieder hin !! – Ich weiss das in diesem apt-get Befehl die Bridgeutils installiert werden, da wir routed verwenden brauchen wir diese “eigentlich” nicht, aber ich installiere diese dennoch mit, damit ich einheitlich arbeiten kann, und nicht jedes mal den Apt-Get Befehl aufs neue schreiben muss. Ausserdem, schaden tuts nicht
Auch ein Punkt der kommen wird: aptitude – man muss sich entscheiden welchen Paketverwalter man nimmt, apt-get oder aptitude, da ich alle meine Systeme mit apt-get begonnen habe, werde ich das auch weiter verwenden, denn mischen sollte man nicht, da es dann zu Problemen mit den Datenbanken kommen kann, da zwar aptitude die apt DB syncen kann, aber apt nicht die aptitude. Ausserdem mag ich es nicht wenn man hin und her syncen muss, damit die Datenpakete stimmen. Daher bleibe ich bei apt-get
2.5) Zeitserver einbinden
Damit wir auch eine aktuelle Zeit haben verwende ich einen eigenen Zeitserver und binde dazu ntpdate ein:
crontab -e -u root
34 03 * * * /usr/sbin/ntpdate ntpnode.de &>/dev/null
Bitte nicht sowas verwenden:
0 1 * * * /usr/sbin/ntpdate ntpnode.de &>/dev/null
Auch andere User werden standardmäßig diesen Eintrag verwenden, wir denken aber bitte weiter! Wenn jeder (20 000 User und mehr) um die gleiche Zeit auf die Zeitserver stürmen braucht man sich nicht wundern wenn die das zuppeln anfangen weil zu viele Anfragen kommen, daher einfach irgendwelche wilden Werte nehmen und in Ruhe das Update fahren
2.6) LVM Installieren
Ich verwende für die Verwaltung meiner V-Nodes keine echten Partitionen sondern verwende lieber das LVM als
FStype da es mir einige Vorteile im handling bringt und auch in die Verwaltungsoberfläche so implementiert wurde. Um LVM verwenden zu können haben wir eine Partition übrig gelassen, die vom Installimage Script bisher nicht angefasst wurde. Dafür fassen wir diese nun an
cfdisk
Danach ein
reboot
ausführen damit wir weiterarbeiten können. Sobald die Kiste wieder oben ist geht es direkt weiter. Als erstes lassen wir vgscan los um nach vorhandenen LVM Volumes zu suchen:
vgscan -v
dann erzeugen wir das physikalische Volume:
pvcreate /dev/sda2
vgreate vgroup /dev/sda2
Bitte gebt der Volumegroup den Namen den ihr verwenden wollt. Also nicht einfach nur copy und paste ballern Nun haben wir LVM erfolgreich erzeugt damit wir uns weiterem widmen können.
3.) XEN Installation
3.1) Sources holen
Nun gehts ans Eingemachte, wer noch dabei ist, sollte schon mal Muttern zum Kaffee kochen schicken, den wird man hier nun brauchen Wir wechseln zunächst in das Verzeichniss /root und erstellen ein Verzeichnis (muss man auch nicht, ich machs halt so)
cd /root
mkdir xen-sources
cd xen-sources
Nun holen wir uns die Sources und entpacken diese. Danach in das Verzeichnis wechseln:
wget -c http://bits.xensource.com/oss-xen/release/3.1.0/src.tgz/xen-3.1.0-src.tgz
tar xzvf xen-3.1.0-src.tgz
cd xen-3.1.0-src
Nun beginnen wir das Kompilieren. Dazu verwenden wir 2 Befehle:
make XEN_TARGET_X86_PAE=y world
Wer das mit Frames machen will, damit es etwas schneller geht und keinen AMD hat kann folgenden Befehl
verwenden:
make -j 64 XEN_TARGET_X86_PAE=y world
Sobald dies durch ist, kommt der nächste Befehl den wir wieder eingeben:
make XEN_TARGET_X86_PAE=y install
Wenns nen bissl mehr sein darf (schneller):
make -j 64 XEN_TARGET_X86_PAE=y install
Am Ende kommt gerne eine Warnung, dass latex fehlt, und daher die Doku nicht gebaut werden kann. Wer braucht
die Doku am System wenn wir Internet haben ? – Ich nicht – Ignore. Nun beginnen wir den Kernel zu konfigurieren damit wir alle Treiber im Kernel auch haben. Bitte nicht übertreiben und nen Kernel so schwer wie einen Blauwal bauen sondern schick optimieren. Ich habe für den DS8000 eine Kernel-Config mir gesichert, wer die haben will kann ja lieb fragen
Und nun die Config Sache aufrufen:
make linux-2.6-xen-config CONFIGMODE=menuconfig
2 Kannen Kaffee und 1 Schachtel Zigaretten weiter haben wir dann unseren Kernel. Dieser wird nun übersetzt:
make linux-2.6-xen-build
Wenns nen bissl Boost sein darf:
make -j 64 linux-2.6-xen-build
Haben wir auch dieses überstanden gehts direkt weiter:
make linux-2.6-xen-install
Und boosting:
make -j 64 linux-2.6-xen-install
32 Bit System ? Dann folgendes nicht vergessen wenn wir mit den obigen Sachen durch sind:
mv /lib/tls /lib/tls.disabled
3.2.) Debian Way – Initrd
Da ich meine Kernel immer Debian Like mit einer Initrd baue, brauchen wir natürlich auch noch eine solche und erzeugen diese mit einem kleinen Befehl:
mkinitramfs -o /boot/initrd.img-2.6-xen 2.6.18-xen
Damit haben wir unsere initrd welche wir nun über grub in den Bootmanager laden:
update-grub
In den Ausgaben von Grub muss nun etwas von einem XEN Hypervisor stehen, den er damit gefunden hat. Nun müssen wir aber noch die Menu.lst anpassen. Dazu im nächsten Schritt.
3.3) Anpassen der menu.lst
Bitte beachten: Grub ist wie eine Frau, wenn man die falsch anpackt ist der Abend gelaufen !! Daher überlegen, verstehen, handeln und nicht umgekehrt!!
title Xen 3.1.0 / Debian GNU/Linux, kernel 2.6.18-xen
root (hd0,0)
kernel /xen-3.1.0.gz dom0_mem=25600
module /vmlinuz-2.6.18-xen root=/dev/sda1 ro console=tty0
module /initrd.img-2.6-xen
savedefault
boot
Achtung:
Die initrd wird mittels Grub über ein weiteres Modul an den Kernel übergeben. Lilo kann das nicht, ausser man arbeitet mit einem Bootpack. Auch das habe ich schon einmal gemacht, mal sehen vllt. schreibe ich dazu mal was Aber Grub verrichtet ja gute Arbeit.
Nun schliessen wir die Datei wenn alles richtig eingestellt wurde. Bitte jetzt kein update-grub mehr ausführen,
sonst fangen wir direkt nochmal an Bevor wir den Reboot Knopf drücken, legen wir noch die erforderlichen Symlinks für Xen an damit die Daemons auch beim Reboot gleich mit starten:
update-rc.d xend defaults 20 21
update-rc.d xendomains defaults 21 20
Und nun gehts rund.
4.) XEN
4.1) Rebooting
Wenn wir alles richtig gemacht haben, und nichts vergessen haben können wir Xen neu starten. Ab und zu kommt gerne mal der Fehler dass er keine loop Devices mehr frei hat. Diese erzeugen wir mit einem kleinen Befehl direkt so oft, dass wir Puffer haben:
for ((i=1;i<256;i+=1)); do mknod /dev/tty$i c 4 $i; done
Nun rebooten wir Xen
shutdown -r now
4.2) Starting
Damit wir XEN zum Starten bekommen, reicht eigentlich ein Reboot aus, da wir alles im Autostart eingetragen haben, ansonsten kann man das auch mit den Befehlen:
/etc/init.d/xend start
/etc/init.d/xendomains start
erledigen. Dabei immer beide Befehle verwenden damit auch die DomUs gestartet werden, sonst startet nur der XenD aber mehr auch nicht
4.3) Stopping
Um Xen und die ganze Einheit sauber anzuhalten (zB vor Wartungsarbeiten) kann man folgende Befehle verwenden:
/etc/init.d/xend stop
/etc/init.d/xendomains stop
4.4) XEN Running – Das erste mal in der Xen Umgebung
Sobald wir rebootet haben und alles richtig war, befinden wir uns in der Xen Umgebung was wir mit einem
uname -r
herausfinden können. Wenn dort steht:
2.6.18-xen
Dann sind wir in der Xen Umgebung. Ein Blick in die DMESG von Xen kann auch informativ sein:
xm dmesg
Bitte auch checken ob der Ram richtig erkannt wurde:
xentop
Dort muss der RAM gesamt auftauchen den wir zur Verfügung haben, als rnd 8 GB, wenn dort nur 4 GB stehen – Grub falsch eingebaut, und nochmal von vorne den Grub richten
5.) XEN Routing
5.1) Verständnis
Generell ist das XEN Routing einfach zu verstehen, es gibt 3 Arten (ich beziehe mich hier nur auf die Routed Variante, zu den anderen werde ich ggf. mal was schreiben): Bridge, Routed, NAT. Das Routed funktioniert dabei ziemlich einfach:
a)
Das Script /etc/xen/scripts/network-route wird ausgeführt, welches die IP Weiterleitung (ip forwarding) in der Dom0 aktiviert.
b)
Als nächstes wird das Script vif-route gestartet, welches die IP Adresse von eth0 auf die virtuelle Karte vif.0 kopiert und dabei auch noch eine Route für diese Netzwerkkarte hinzufügt, damit der virtuelle
Host erreichbar ist. Allerdings gilt dies nur für die Dom0 sowie die ebenfalls laufenden Gäste. Rechner die außerhalb dieses Konstrukts liegen, sind dabei nicht ohne weiteres erreichbar. Der Grund liegt in der Auflösung der MAC Adressen. Die externen Rechner wissen nicht wie sie den virtuellen Gast erreichen können, da dessen MAC ihnen nicht bekannt ist. Um dies zu ändern, bedarf es eines Stellvertreters der die Anfrage entgegen nimmt und weiterleitet. Dies ist der Auftritt des Arp (Address Resolution Protocol – es ordnet in einer Tabelle die MAC Adressen einer IP Adresse zu, welche mit dem Programm arp -a ausgelesen werden kann) Proxy.
5.2) Routed Setup
Damit wir nun endlich mit XEN und routed arbeiten können brauchen wir dazu verschiedene Confs in denen wir etwas anpassen müssen. Fangen wir der Reihe nach an:
5.3) xend-config.sxp
In dieser Datei werden alle Grundeinstellungen für Xen eingerichtet. Die Datei werde ich zunächst nicht weiter erklären, sondern direkt zu den Punkten kommen. Bisher steht dort:
(network-script network-bridge)
(vif-script vif-bridge)
Das ändern wir nun wiefolgt:
(network-script network-route)
(vif-script vif-route)
Danach die Datei speichern.
Wer das ganze mit sed Befehlen erledigen möchte:
sed -i "s/(network-script network-bridge)/#(network-script network-bridge)/g" /etc/xen/xend-config.sxp
sed -i "s/(vif-script vif-bridge)/#(vif-script vif-bridge)/g" /etc/xen/xend-config.sxp
sed -i "s/#(network-script network-route)/(network-script network-route)/g" /etc/xen/xend-config.sxp
sed -i "s/#(vif-script vif-route)/(vif-script vif-route)/g" /etc/xen/xend-config.sxp
Damit werden die Einstellungen auch geschrieben. Nun müssen wir den XENd neustarten, das erledigen wir mit dem Init Script
/etc/init.d/xend restart
5.4) Kernel einstellen, Proxy_Arp und Forwarding
Damait wir das Routing korrekt einstellen können müssen wir ein paar kleine Änderungen vornehmen. Dabei aktivieren wir als erstes das Forwarding und danach aktivieren wir den proxy_arp. Hier die Codes dazu:
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/conf/eth0/proxy_arp
Damit wir das nicht jedes mal aufs Neue beim Reboot eingeben müssen stellen wir diese Parameter nun dauerhaft für den Kernel ein. Dazu verwenden wir die sysctl.conf:
pico /etc/sysctl.conf
Das hier einfügen:
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.ip_forward=1
net.ipv4.conf.default.proxy_arp=1
Speichern, schliessen und anschliessend ggf. rebooten um gleich einmal zu testen obs funktioniert
5.5) vif-route Script anpassen
Damit das Roting richtig funktioniert müssen wir ein paar Änderungen in der vif-route vornehmen. Wie ich bereits oben geschrieben habe erledigt für uns alles Weitere proxy_arp damit die Pakete richtig geroutet werden. Dies müssen wir nun so ändern, damit auch die erforderlichen Einstellungen für die /proc/ Verzeichnisse gemacht werden um bei einem Reboot der gesamten Hostserver bzw. beim Neuanlegen von VEs alle Einstellungen gleich automatisch erledigt werden. Dabei zeige ich euch nun erst die aktuelle Fassung der vif-route Datei und dann die Änderung. Zunächst öffnen wir die Datei mit einem Editor und suchen folgenden Eintrag:
main_ip=$(dom0_ip)
Nach diesem Eintrag folgt dann gleich die Sektion die wir brauchen. Hier der Originallaut der Sektion:
case "$command" in
online)
ifconfig ${vif} ${main_ip} netmask 255.255.255.255 up
echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
ipcmd='add'
cmdprefix=''
;;
offline)
do_without_error ifdown ${vif}
ipcmd='del'
cmdprefix='do_without_error'
;;
esac
Dieses wird von uns nun umgeschrieben in:
case "$command" in
online)
ifconfig ${vif} ${main_ip} netmask 255.255.255.255 up
echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp
ipcmd='add'
cmdprefix=''
;;
offline)
do_without_error ifdown${vif}
ipcmd='del'
cmdprefix='del'
echo 0 >/proc/sys/net/ipv4/eth0/proxy_arp
;;
esac
Generell empfehle ich das Script vorher zu Sichern oder die alten Einstellungen nur auszukommentieren, damit man ein RoleBack ausführen kann.
5.6) vif-common.sh anpassen
In der aktuellen Version von Xen 3.1.0 befindet sich leider in den Sources für das vif-common.sh Script und damit für das reouted Setup ein kleiner Bug den wir ebenfalls beheben müssen. Dazu muss eine Zeile von uns umgeschrieben werden. Wir fangen also wieder an:
pico /etc/xen/scripts/vif-common.sh
Dort suchen wir nach der Zeile:
# ip_of interface
Darunter steht folgender Quelltext der ersetzt werden muss:
ip_of()
{
ip addr show "$1" | awk "/^.*inet.*$1$/{print $2}" | sed -n '1 s,/.*,,p'
}
richtig muss es lauten
ip_of()
{
ip -4 -o addr show primary dev $1 | awk '$3 == "inet" {print $4; exit}' | sed 's!/.*!!'
}
Ich habe den Befehl ein wenig optimiert als dieser im Bugreport angegeben wurde Danach speichern wir auch diese Datei und schliessen diese. Das wir natürlich ein Backup aufgehoben haben oder die Änderung entsprechend kommentiert haben weiss jeder für sich selbst
5.7) xen1.cfg Datei anpassen (DomU Config)
Die Standardconfig Dateien von den DomUs verwenden ja standardmäßig das Bridgesetup. Dabei wird in der Datei die VIF Einstellung wie folgt erzeugt:
vif = [ 'mac=00:17:31:BE:AB:FE,bridge=xenbr0' ]
Das funktioniert jetzt nicht mehr. Wir müssen diese Dateien etwas anders schreiben damit es mit dem routed Setup klappt. Hier also ein Beispiel:
vif = [ 'mac=00:17:31:BE:AB:FE,ip=XX.XX.XX.XX' ]
Damit haben wir die Confs für das routed Setup umgestellt. Somit können wir den DomU mit
xm create /etc/xen/cen1.cfg
erzeugen und finden dann einen neuen auf routing basierenden Xen Server
5.8) Ausführungen auf der DomU
Nun kommt eine Sache die man sich einfach merken muss, wenn man sie nicht versteht. Damit die VEs mit dem Dom0 kommunizieren können müssen diese einen Gateway haben. Bei Hetzner werden alle IPs auf die HauptIP geroutet, damit nutzen wir als den Hauptgateway als Gateway für das Netzwerk. Die DomUs müssen somit als eigener Gateway laufen, damit diese dann an die Dom0 gebunden werden können. Das erledigt dabei Xen für uns wenn der VE erzeugt wird. Wir müssen also im DomU nur die jeweilgie Route hinzufügen damit dieser dann nach aussen kommunizieren kann. Unter einem Debian Gast sieht die /etc/network/interfaces Datei dann so aus:
iface eth0 inet static
address 78.nn.130.202
netmask 255.255.255.192
broadcast 78.nn.130.255
gateway 213.133.102.76
up route add default gw 78.nn.130.202
Dabei ist hier die Gateway einstellung die HauptIP des Servers der Dom0 (Achtung: Hier nicht den Gateway des Dom0 angeben, geht nicht ) Nun müssen wir eine Route für den Kernel hinzufügen damit dieser dann routen kann:
route add default gw $ip_der_domu
Bei “$ip_der_domu” geben wir die IP Adresse der DomU an also sich selbst quasi als Gateway. Damit haben wir folgendes Aufbauschema:
Dom0(HauptIP) ---- DomU(Gateway) --- Route(IP_DomU) --- DomU
Somit gelangt der VE ins Netz und kann ohne weiteres konnektieren Auch die Nameserver werden dann verfügbar, kurz der VE ist am Netz.
Hier noch ein paar Ausgaben zur Nachvollziehbarkeit:
route -n
78.nn.130.192 0.0.0.0 255.255.255.192 U 0 0 0 eth0
0.0.0.0 78.nn.130.202 0.0.0.0 UG 0 0 0 eth0
ip show
78.nn.130.202 dev vif22.0 scope link src 213.133.102.76
213.133.102.64/27 via 213.133.102.65 dev eth0
213.133.102.64/27 dev eth0 proto kernel scope link src 213.133.102.76
default via 213.133.102.65 dev eth0
Die letzte Ausgabe stammt von der Dom0 Einheit
6) Abschluss
Mit ein paar Handgriffen kann man also seinen XEN Host auf Routed Setup umstellen. Da ich bisher keine wirkliche Anleitung für ein solches Setup gefunden habe, habe ich diese hier geschrieben. Ich werde den Beitrag nach und nach noch verfeinern damit dieser besser wird. Wer Anregungen hat, kann diese gerne hinzufügen, so wird der Eintrag noch besser werden.
Das routed Setup ist etwas komplizierter als das Bridge Setup, da dieses ja meinstens direkt nach der Installation schon funktioniert. Wer allerdings wie ich Dank seinem Provider umstellen muss, wird diese Anleitung nützlich finden.
Have fun!