Installation von CentOS 6 als Xen Guest (domU) auf einem Debian Squeeze (dom0)

Für die neue Version des Zimbra Mailservers, welchen ich privat verwende, ist ein aktuelles Betriebssystem von Nöten. Bislang lief dies in einem älteren Debian, dieses wird aber nicht mehr unterstützt. Da ich beruflich viel mit CentOS zu tun habe, entschloss ich mich dies als das präferierte Betriebssystem für die Virtualisierung zu verwenden.

Die Installation von CentOS 6 64 Bit als Xen Guest sollte es also werden. Erstaunlicherweise ging die Installation schwieriger als gedacht, da in den benötigten Programmen Bugs enthalten sind, beziehungsweise diese in dem aktuellen Stable-Zweig von Debian Squeeze veraltet sind und kein aktuelles CentOS installieren können.

Nachfolgend beschreibe ich, wie ich die Installation durchführte und welche Anpassungen ich vollzogen habe. Ich setzte ein funktionierendes Xen-Virtualisierungssystem in Version 4.0 mit xen-tools vorraus. Zudem sollte man wissen, was man macht. Den im Tutorials beschriebenen Weg habe ich genommen, bei mir hat er funktioniert. Für die Richtigkeit der Inhalte dieses Tutorials gebe ich keinerlei Garantie!

Die Installation von rpm basierten Guests erfolgt unter Debian mit den xen-tools und dem Programm rinse, dieses ist jedoch in der aktuellen Version nicht aktuell genug. Daher habe ich die aktuelle Version des Entwicklers Installiert:

cd /usr/src/
wget http://www.steve.org.uk/Software/rinse/rinse-2.0.tar.gz
tar xfz rinse-2.0.tar.gz
cd rinse-2.0
cat README
cat INSTALL
make install
apt-get install rpm

Anschließend müssen die xen-tools angepasst werden, damit diese auch für die Installation von CentOS 6 geeignet sind. Dazu kopiert man sich die bootstrap-Scripte von CentOS 5:

cp -a /usr/lib/xen-tools/centos-5.d /usr/lib/xen-tools/centos-6.d

Damit die Installation funktioniert, muss man noch ein weiteres Script Namens 25-setup-kernel anlegen:

touch /usr/lib/xen-tools/centos-6.d/25-setup-kernel
chmod 755 /usr/lib/xen-tools/centos-6.d/25-setup-kernel
vi /usr/lib/xen-tools/centos-6.d/25-setup-kernel

In das Script fügt man folgenden Inhalt ein:

[cc lang=’bash‘ ]
#/bin/sh
#
# This script sets up the kernel and fstab for CentOS 6.
#

prefix=$1

#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi

#
# Log our start
#

logMessage Script $0 starting

# Make the console work
sed -i „/Cancelled/ {G;s/$/co:2345:respawn:\/sbin\/mingetty console/;}“ ${prefix}/etc/inittab
sed -i „s/^1:2345/#1:2345/“ ${prefix}/etc/inittab

# MAKEDEV is needed at this point
chroot ${prefix} ln -s /sbin/MAKEDEV /dev/MAKEDEV
chroot ${prefix} /sbin/MAKEDEV sda sdb sdc sdd

cat > ${prefix}/etc/fstab << EOF
# /etc/fstab: static file system information.
#
# proc /proc proc defaults 0 0
none /dev/pts devpts mode=0620 0 0
EOF

for i in `seq 1 $NUMPARTITIONS`; do
echo -n „/dev/xvde$i “ >> ${prefix}/etc/fstab
eval part=\$PARTITION$i
if [ ! -z „`echo $part | grep swap`“ ]; then
echo „none swap ws 0 0“ >> ${prefix}/etc/fstab
else
echo $part | awk -F: ‚{print $4,$3,$5,0,1}‘ >> ${prefix}/etc/fstab
fi
done

chroot ${prefix} yum clean expire-cache
chroot ${prefix} yum -y install kernel-xen grub.x86_64 perl.x86_64 openssh-clients.x86_64

KERNELVERSION=`ls ${prefix}/boot/vmlinuz-* | sed „s#$prefix/boot/vmlinuz-##“`

mkdir -p ${prefix}/boot/grub
cat > ${prefix}/boot/grub/menu.lst << EOF
# WARNING : Don’t forget to update this when you upgrade kernel !
# You can also exclude kernel-xen from updates by putting
# exclude=kernel-xen in in [main] in yum.conf

default=0
timeout=5
title CentOS ($KERNELVERSION)
kernel /boot/vmlinuz-$KERNELVERSION xen_pv_hvm=enable
initrd /boot/initramfs-$KERNELVERSION.img
EOF

#
# Log our finish
#
logMessage Script $0 finished

[/cc]

Damit bei der Installation auch alles funktioniert, müssen während der Installation für yum auch random Werte zur Verfügung stehen. Dafür muss man auch für rinse noch ein neues bootstrap-Script erstellen:

touch /usr/lib/rinse/common/30-dev-urandom.sh
chmod 755 /usr/lib/rinse/common/30-dev-urandom.sh
vi /usr/lib/rinse/common/30-dev-urandom.sh

Das Script beinhaltet folgendes:

[cc lang=’bash‘ ]
#!/bin/sh
#
# Ensure the chroot has /dev/random and /dev/urandom
#
# Dan Kegel
# —

#
# Get the root of the chroot.
#
prefix=$1

#
# Ensure it exists.
#
if [ ! -d „${prefix}“ ]; then
echo „Serious error – the named directory doesn’t exist.“
exit
fi

#
# Ensure we have /dev
#
if [ ! -d „${prefix}/dev“ ]; then
mkdir „${prefix}/dev“
fi

#
# Create the nodes
#
echo “ Creating random devices in /dev“
if [ ! -e „${prefix}/dev/random“ ]; then
mknod -m 666 „${prefix}/dev/random“ c 1 8
chown root:root „${prefix}/dev/random“
fi
if [ ! -e „${prefix}/dev/urandom“ ]; then
mknod -m 666 „${prefix}/dev/urandom“ c 1 9
chown root:root „${prefix}/dev/urandom“
fi
[/cc]

Damit sind die Vorbereitungen und Anpassungen alle abgeschlossen. Jetzt kann man mit Hilfe der xen-tools einen virtuellen CentOS 6 Gast erzeugen. Dies geht beispielsweise so:

xen-create-image --force --hostname centosvm --ip 10.0.0.2 --gateway=10.0.0.1 --netmask=255.255.255.0  --install-method=rinse --dist centos-6 --arch=amd64 --passwd --memory=2048M --size=20Gb --swap=1024Mb --dir=/xen --mirror=http://mirror.centos.org/centos/6/os/x86_64/Packages/

Damit wird ein Image mit 20 GB Größe angelegt und darin CentOS 6 64 Bit installiert. Ich musste anschließend nur noch in der Konfigurationsdatei der vm die mac-Adresse anpassen, damit die öffentliche IP meines Providers korrekt funktioniert. Dies ist aber eine Notwendigkeit bei meinem Rootserver Providers.