Gentoo Xen 3.0 domU Howto

Vorraussetzung für dieses Howto ist ein funktionstüchtiges Xen 3.0 Host System. Das Howto orientiert sich stark am aktuellen Gentoo Handbook. Meine Xen Hardware besteht aus einem Pentium D (dual core) mit vier 250GB im RAID-5 Verbund, was eine nutzbare Größe von 750GB ergibt. Der Rechner besitzt 4GB RAM, somit werde ich nicht mehr als drei Gastsysteme mit jeweils 1GB RAM laufen lassen. Da für das Gastsystem 512MB Speicher völlig ausreichen, bleiben noch 512MB ungenutzt, die bei Bedarf auf die Gastsysteme verteilt werden können.Als Partitionen für das Gastsystem nutze ich die zwei Partitionen /dev/sda12 ( Mountpunkt / ) und /dev/sda13 ( Mountpunkt /var ). Diese werden auf dem Hostsystem z.B. mittels cfdisk angelegt, das sieht dann wie folgt aus:

Name Flags Part Type FS Type [Label] Size (MB)
—————————————————————————–
sda12 Logical Linux 34998.57
sda13 Logical Linux 100002.96

Das Root Filesystem ist somit 35GB groß, /var stehen 100GB zur Verfügung. Die /var Partition wurde mit Hinsicht darauf so groß gewählt, dass es ein reiner Web- und Mailserver werden soll. Die Webseiten werden unter /var/www liegen, die Mails unter /var/vmail. Dazu kommt, dass die Logfiles unter /var/log liegen und MySQL seine Datenbankdateien auch unter /var ablegt. Somit sind also alle veränderlichen Daten unter der Partition /var abgelegt und für den Fall, dass jemand sein Unwesen treibt, wird auch nur diese Partition volllaufen.

Für das Gastsystem müssen keine physikalischen Partitionen angelegt werden, man kann auch Dateien auf dem Hostsystem anlegen, die dem Gastsystem als Partitionen dienen. Dies soll sogar nach Messungen der Zeitschrift c’t schneller sein als der Zugriff auf eigene Partitionen. Aufgrund mangelnder Zeit konnte ich dies jedoch nicht selbst ausprobieren, der Server sollte schließlich innerhalb von anderthalb Tagen für die ITB06 voll funktionsfähig sein.

Fangen wir also mit Schritt 4 im Gentoo Handbook (Preparing the Disks) an. Wie oben beschrieben sind die Partitionen angelegt und unformatiert. Nun erstellen wir die Dateisysteme (reiserfs scheint nach der Beschreibung “has very good overall performance and greatly outperforms both ext2 and ext3 when dealing with small files” gut geeignet für Webseiten und Mails):

seth ~ # mkreiserfs /dev/sda12
mkreiserfs 3.6.19 (2003 www.namesys.com)

[…]

Guessing about desired format.. Kernel 2.6.12.6-xen is running.
Format 3.6 with standard journal
Count of blocks on the device: 8544560
Number of blocks consumed by mkreiserfs formatting process: 8472
Blocksize: 4096
Hash function used to sort names: “r5”
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: c7036fef-930b-407e-81d3-3f88ee650d28
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
ALL DATA WILL BE LOST ON ‘/dev/sda12’!
Continue (y/n):

Mit “y” bestätigen und die Ausgabe abwarten…

Initializing journal – 0%….20%….40%….60%….80%….100%
Syncing..ok

[…]

ReiserFS is successfully created on /dev/sda12.

Gleiches Vorgehen wird bei /dev/sda13 benötigt. Nun können wir die Partitionen auf dem Hostsystem mounten:

# Mountpunkt erstellen
mkdir -p /mnt/gentoo
# root Partition mounten
mount /dev/sda12 /mnt/gentoo
# Mountpunkt für /var erstellen
mkdir /mnt/gentoo/var
# /var mounten
mount /dev/sda13 /mnt/gentoo/var

Weiter geht’s mit Punkt 5 im Gentoo Handbook (Installing the Gentoo Installation Files). Bei diesem Kapitel werden die Ausgangsdateien für die Installation heruntergeladen und entpackt. Als Gentoo Distfiles Server habe ich ftp.belnet.be gewählt, da ich bei diesem Server meist gute Downloadraten habe. Es ist natürlich möglich einen anderen Server aus der offiziellen Liste auszuwählen.

# In das Installationsverzeichnis wechseln
cd /mnt/gentoo
# Stage 3 Paket herunterladen (für die eigene Architektur, hier für amd64)
wget http://ftp.belnet.be/packages/gentoo/releases/amd64/2006.0/stages/stage3-amd64-2006.0.tar.bz2
# Paket entpacken (die Parameter sind wichtig, damit die Dateirechte stimmen)
tar xvjpf stage3-*.tar.bz2
# Portage Snapshot herunterladen
wget http://ftp.belnet.be/packages/gentoo/snapshots/portage-latest.tar.bz2
# Portage Snapshot entpacken
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr

Nun sollte die make.conf für das Gastsystem Konfiguriert werden. Dazu kopieren wir einfach die Beispieldatei make.conf.example über die minimale installlierter make.conf drüber

cp /mnt/gentoo/etc/make.conf.example /mnt/gentoo/etc/make.conf

und bearbeiten sie dann.

nano -w /etc/make.conf

Wichtig sind in dieser Datei eigentlich nur drei Zeilen, zum einen die Zeile, in der die Variable CHOST gesetzt wird,

# Für amd64
CHOST=”x86_64-pc-linux-gnu”
# Oder für x86
CHOST=”i686-pc-linux-gnu”

zum anderen die beiden Zeilen, die mit CFLAGS bzw. mit CXXFLAGS beginnen.

# CFLAGS für Pentium-D (Nocona Architektur)
CFLAGS=”-march=nocona -O2 -fomit-frame-pointer -pipe”
# Oder für Pentium-4 mit frame-pointern (zum debuggen von manchen Programmen benötigt)
CFLAGS=”-march=pentium4 -O2 -pipe”
#CXXFLAGS genau wie CFLAGS setzen
CXXFLAGS=”${CFLAGS}”

Verlassen kann man nano übrigens mit Strg-X, Y und dann [Return] (zum bestätigen des Speicherns).

Um das Basis-System zu installieren, benötigen wir noch die Nameserver Konfiguration im Gastsystem. Dazu kopieren wir einfach die Datei /etc/resolv.conf vom Hostsystem in das Installationsverzeichnis des Gastsystems:

cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

Nun können wir die Pseudodateisysteme /dev und /proc mounten, um im Gastsystem zur Installationszeit Zugriff auf Geräte und Prozesse zu haben:

# proc Filesystem mounten
mount -t proc none /mnt/gentoo/proc
# /dev nach /mnt/gentoo/dev “linken”
mount -o bind /dev /mnt/gentoo/dev

Dann kann man in das installierte Basissystem “chrooten”, wie in Kapitel 5 (Installing the Gentoo Base System) beschrieben:

chroot /mnt/gentoo
env-update
source /etc/profile

Nun befindet man sich mittels chroot schon auf dem Dateisystem des neuen Gastsystems. Alle Konfigurationen die man nun ausführt, gelten nicht für das Hostsystem, sondern für den Xen Guest. /mnt/gentoo/etc ist nun über /etc ansprechbar als hätte man das neue System wie ein normales System gebootet. Das hat auch zur Konsequenz, dass man aus dem Gast-Dateisystem nicht mehr an die Dateien des Hostsystems rankommt.

Nun sollte man den “portage tree” auf den neusten Stand bringen. Der “portage tree” beinhaltet die Informationen zu allen installierbaren Paketen. Ãœber folgenden Befehl kann man ihn updaten:

emerge –sync

Die Ausführung kann einige Minuten in Anspruch nehmen (je nach Internetverbindung, Prozessor-/Speicher-/Festplattengeschwindigkeit).

Wir fahren fort mit Kapitel 7 des Gentoo Handbooks (Configuring the Kernel).

Als erstes setzen wir die aktuelle Zeitzone auf Europa / Berlin, mittels

cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Um die Xen Kernel Dateien emergen zu können, müssen wir erst noch ein paar Einträge vornehmen:

# xen-sources-2.6.12 enthält mehrere Sicherheitslücken, daher müssen wir das Paket von Hand aktivieren
echo =sys-kernel/xen-sources-2.6.12.6-r3 >> /etc/portage/package.unmask
echo =sys-kernel/xen-sources-2.6.12.6-r3 >> /etc/portage/package.keywords
# xen-sources haben xen als abhängigkeit. Dies ist eigentlich nur auf dem Hostsystem notwendig, soll uns aber hier nicht stören.
# Also Gentoo revision geben wir r999 an, damit wir die Gentoo Revisionen (r3, r4, r5 etc.) bei einem Systemupdate mitbekommen, jedoch unstable builds (p9029 etc.) ausgelassen werden.
echo \<=app-emulation/xen-3.0.1-r999 >> /etc/portage/package.keywords
# Seit dem 24. März 2006 sind die xen Pakete nun aufgespalten in app-emulation/xen und app-emulation/xen-tools, daher verfahren wir analog für xen-tools
echo \<=app-emulation/xen-tools-3.0.1-r999 >> /etc/portage/package.keywords
# xen hat auch noch eine abhängigkeit…
echo sys-devel/dev86 >> /etc/portage/package.keywords
# now emerge it
emerge xen-sources

Nun wird portage, die nötigen Dateien vom portage mirror ziehen und kompilieren/installieren. Auf langsamen Systemen kann das auch widerum längere Zeit dauern. Wenn alles fertig auf der Platte ist, sollte gegen Ende eine Zeile

>>> sys-kernel/xen-sources-2.6.12.6-r3 merged.

zu sehen sein. Nun können wir beginnen, den xen kernel zu konfigurieren und kompilieren. Als kleiner Hinweis für genkernel Benutzer sei gesagt, dass das Kompilieren mit genkernel nicht ohne weiteres funktioniert. Es existieren zwar Patches für genkernel, diese sind jedoch nicht für die aktuelle Version – ich habe irgendwann aufgehört danach zu suchen und einfach die bewährte Methode mittels manuellem konfigurieren und kompillieren angewendet.
# in das Verzeichnis mit den Kernelquelldateien wechseln
cd /usr/src/linux
# Konfiguration mit ncurses-Oberfläche starten
make menuconfig

Dort müssen nun einige wichtige Einstellungen vorgenommen werden. Die Einstellungen unter “XEN —>” sollten etwa so aussehen:

[ ] Privileged Guest (domain 0)
[ ] Physical device access
[ ] TPM-device frontend driver
[*] TPM-device backend driver
[ ] TPM backend closes upon vTPM failure (NEW)
< *> Block-device frontend driver
< *> Network-device frontend driver
[ ] Block device tap driver
[ ] Fake shadow mode
[*] Scrub memory before freeing it to Xen
Processor Type (X86_64) —>

Der “Processor Type” sollte automatisch auf die richtige Prozessorarchitektur eingestellt sein, die dem Prozessortyp auf dem Hostsystem entspricht. Desweiteren sollte SCSI support komplett deaktiviert werden ( “Device Drivers” —> “SCSI device support” —> “SCSI device support” ) damit der kernel die von Xen emulierten SCSI devices lädt. Außerdem müssen unter “File systems —>” die zum booten benötigten Dateisysteme fest einkompiliert werden, also in meinem Fall reiserfs: “< *> Reiserfs support”.

Jetzt kann man das Konfigurationsmenü verlassen und die eingestellte Konfiguration speichern. Durch Eingabe von

make

wird die Kompilierung des Kernels und der Kernelmodule gestartet. Dies ist wieder ein Zeitpunkt, sich eine Tasse Kaffee holen zu gehen 😉

Wenn der Kernel fertig kompiliert ist, kann man mittels “make modules_install” die Kernelmodule ins Dateisystem kopieren lassen.

Nun wird wie in Schritt 8 des Gentoo Handbooks (Configuring your System) die Datei /etc/fstab eingerichtet. Eingetragen werden müssen das Root Filesystem / und /var. Der entsprechende Teil sieht wie folgt aus (nicht benötigte Dateisysteme sind auskommentiert):

# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
#/dev/BOOT /boot ext2 noauto,noatime 0 0
/dev/sda12 / reiserfs noatime 0 0
/dev/sda13 /var reiserfs noatime 0 0
#/dev/SWAP none swap sw 0 0
#/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
#/dev/fd0 /mnt/floppy auto noauto 0 0

Dann kann man noch Einstellungen für die Netzwerkkonfiguration vornehmen

# /etc/conf.d/hostname
HOSTNAME=”meg”

# /etc/conf.d/domainname
DNSDOMAIN=”strama.info”

und damit die Einstellungen auch bei jedem Start übernommen werden, fügen wir das initscript dem default runlevel zu:

rc-update add domainname default

Die Einstellung der IP-Adresse u.ä. erfolgt in der Datei /etc/conf.d/net

config_eth0=( “192.168.0.11 netmask 255.255.255.0 brd 192.168.0.255” )
routes_eth0=( “default gw 192.168.0.1” )

Ich werde in diesem Howto nicht weiter auf die Konfiguration des Netzwerkes eingehen, für andere Einstellungen sollte man sich die Datei /etc/conf.d/net.example ansehen oder die Gentoo Dokumentation zu Rate ziehen.

Mit

rc-update add net.eth0 default

kann man die Netzwerkkonfiguration automatisch beim hochfahren des Gastsystems aktivieren. Um die Netzwerkkonfiguration zu vervollständigen, sollte man noch den hostnamen der Datei /etc/hosts hinzufügen:

192.168.0.11 meg

Damit ist das Netzwerkinterface vollständig konfiguriert. Es sind nur noch wenige Schritte, bis das Gastsystem zum ersten Mal hochfahren kann.

Zum Einloggen wird natürlich ein Passwort benötigt. Daher sollte man nun das root Passwort setzen.

passwd

ausführen und dann das Passwort eingeben und zur Sicherheit noch einmal bestätigen.

New UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Damit die Gentoo init Scripte beim Hochfahren des Gastsystemes merken, dass es sich um ein Xen System handelt, müssen wir noch einen Patch einspielen, der die Funktion “is_xenU_sys()” berichtigt, siehe Bug 107976 und Bug 96240.

# Patch runterladen
wget http://bugs.gentoo.org/attachment.cgi?id=75475 -O /xen-init.d-script.patch
# Verzeichnis wechseln
cd /
# Patch ausführen
patch -p1 < xen-init.d-script.patch

Nun können, wie in Schritt 9 – Installing Necessary System Tools – benötigte Werkzeuge für den normalen Linux-Betrieb installiert werden.

# System Logger installieren und dem default runlevel hinzufügen
emerge sysklogd
rc-update add sysklogd default
# Cron Daemon installieren und dem default runlevel hinzufügen
emerge vixie-cron
rc-update add vixie-cron default
# locate tool installieren (zum finden von dateien)
emerge slocate
# Dateisystemtools installieren (hier für reiserfs)
emerge reiserfsprogs

Nun sind alle wichtigen Tools installier. Bei einer normalen Installation würde jetzt die Installation des Boot Loaders (GRUB) folgen. Da das Betriebssystem in unserem Fall aber nicht von einem Bootloader sondern vom Xen Daemon gestartet wird, beginnen wir nun mit der Einrichtung des Gastes auf dem Hostsystem.

Dazu müssen wir die chroot-Umgebung verlassen:

exit

Da der Xend den Gast-Kernel nicht von innerhalb des Gast Dateisystems starten kann, müssen wir den Kernel auf das Host-Dateisystem kopieren. Ich habe mir hierfür den Ort /opt/xen ausgesucht. Die Kernel können natürlich auch alle im /boot Verzeichnis des Hostsystems gelagert werden. Damit könnte es jedoch Probleme geben, da /boot nicht automatisch gemountet wird. Also erstellen wir mit

mkdir -p /opt/xen

den benötigten Ordner und kopieren dann mit

cp /mnt/gentoo/usr/src/linux/vmlinuz /opt/xen/vmlinuz-2.6.12.6-xen-r3-meg

in das Dateisystem des Hosts. Es ist sinnvoll, den Namen des Gastsystems in den Dateinamen des Kernels aufzunehmen wenn es mehrere Gast-Kernel gibt. Wenn alle Gastsysteme den gleichen Kernel nutzen sollen, reicht es auch aus, den Kernel mit der Endung -xenU oder -domU als unprivilegierten Kernel kenntlich zu machen. Dies gilt natürlich nur zur eigenen Orientierung; Xen ist es egal wie die Kerneldatei benannt ist…

Damit sich Xen nicht beim Starten beschwert, müssen die Dateisysteme ungemountet werden:

umount /mnt/gentoo/var /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo

Als Vorlage für die Konfiguration des Gastsystems für den Xen Daemon dient uns die Datei “/etc/xen/xmexample1”

cp /etc/xen/xmexample1 /etc/xen/meg

Dort müssen einige Zeilen angepasst werden (hier stehen nur die veränderten Zeilen):

# Kernel image file.
kernel = “/opt/xen/vmlinuz-2.6.12.6-xen-r3-meg”

# Initial memory allocation (in megabytes) for the new domain.
memory = 1000

# A name for your domain. All domains must have different names.
name = “meg”

disk = [ ‘phy:sda12,sda12,w’,
‘phy:sda13,sda13,w’]

# Set if you want dhcp to allocate the IP address.
dhcp=”off”
# Set netmask.
netmask=”255.255.255.0″
# Set default gateway.
gateway=”192.168.0.1″
# Set the hostname.
hostname=”meg”
# Set the IP address
ip=”192.168.0.11″

# Set root device.
root = “/dev/sda12 ro”

# Sets runlevel 4.
# extra = “4”

Nun endlich kommt der große Moment: der erste Start des Gastsystems

xm create meg -c

Mit diesem Befehl bootet der Xen Daemon das Gastsystem “meg” und bindet mit -c die Konsole des Gastsystems an die aktuelle. So kann man direkt die Ausgabe beim Booten mitverfolgen.

Leave a Reply

Your email address will not be published. Required fields are marked *