Teil 1 – Den Kernel kompilieren.
Soviel zur Vorgeschichte: Wir hatten Probleme mit einem älteren Xen und einem Kernel um die 2.6.3x mit dem Netbackdriver von Xen, dass bei bestimmten Lastsituationen Pakete verworfen wurden. Nach langer Suche hat sich der Netbackprocess als schuldig erwiesen – allerdings nur bei Kerneln unterhalb von Version 3.x, daher hier eine kleine Anleitung, wie man sich in Centos6 / RHEL6 ein modernes Xen bastelt.
Ich bin hier auf einem Sun Blade mit 8 Kernen unterwegs und habe physikalischen Zugriff auf das System. Daher möchte ich alle bitten, die über die serielle Konsole usw. arbeiten: kontrolliert die Bootparameter im Grub und/oder setzt sicherheitshalber ein Fallback, falls der Kernel nicht lädt. Das Howto ist also ein „works for me“ und sollte so betrachtet werden. Anmerkungen und Verbesserungen sind gerne willkommen :). Bis zur Veröffentlichung ist der Kernel schon bei Version 3.7.0 angelang. Generell sollte aber alles auf CentOS 6 / RHEL 6 Basis funktionieren. Der erste Teil des Howto befasst sich nur mit der Kompilation des Kernels. Man kann es also auch einfach als Kernelhowto nutzen und die Elemente mit Xen ignorieren 🙂
1. Das System vorbereiten
In meiner Umgebung stand mir ein RHEL6.2 Repository zu Verfügung, welches aber die Groupdefintionen nicht vorhielt, also habe ich hier wenn´s geht noch die alternative Variante als Summe der Pakete mit hineingenommen. Als erstes installieren wir also die Development Pakete, damit wir make, gcc etc ppp. erhalten.
yum groupinstall development yum install ncurses-devel oder yum install autoconf automake binutils bison flex gcc gcc-c++ gettext libtool make patch pkgconfig redhat-rpm-config rpm-build ncurses-devel
Weil wir späte noch ein RPM aus dem Kernel basteln folgt dann noch
yum install rpmdevtools rpm-devel
Soll der Kernel mit einem nicht priveligierten User gebaut werden, können wir den auch noch anlegen. Ich nenne ihn mal ‚kernelman‘.
useradd kernelman passwd kernelman exit
Anschließend logge ich mich als ‚kernelman‘ wieder ein und lasse eine Umgebung für die RPMs einrichten.
rpmdev-setuptree
2. Den Linux Kernel von Kernel.org holen
Ich lege erstmal ein Downloadverzeichnis an und ziehe die Quellen direkt dorthin.
mkdir Downloads cd Downloads wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.6.7.tar.bz2 tar -xjvf linux-3.6.7.tar.bz2 cd linux-3.6.7
Falls da schon was liegt (aus vorherigen Fehlversuchen oder ähnlichem), können wir die configs wipen mit:
make mrproper
3. Kernelconfigs anpassen
Man sollte seine Hardware gut kennen, wenn wir ein Modul oder einen Treiber vergessen, kann das entsprechende Gerät nicht genutzt werden, im schlimmsten Fall bootet der neue Kernel nicht.
make menuconfig
Hier alles einstellen, wie ihr´s für eure Hardware braucht, dann kommt der interessante teil.
Damit Xen spaeter als Dom0 laufen kann, brauchen wir für den Kernel die Netback und Blockback module. Wichtig ist, dass die Sachen als Module eingesetzt werden. Ich hatte das zuerst mit fest einkompiliert und dann festgestellt, dass keine DomU sich über die Bridge nach außen verbinden konnte, weil die Netbackdevices nicht richtig funktioniert haben.
Das Problem äußerte sich dann in Fehlermeldunge wie etwa z.B.
RTNETLINK answers: Operation not supported
Hier ein Auszug der vorhandenen Xen Parameter im Kernel 3.6.7 – baute man wild drauf los, gäbe es keine Xen_netdev_backend Module, deshalb ändern wir gleich die Konfiguration in der Datei „.config“ bei den entsprechenden Parametern:
[kernelman@rhel6xentest2 linux-3.6.7]$ cat .config | grep -i xen CONFIG_XEN=y CONFIG_XEN_DOM0=y CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_PVHVM=y CONFIG_XEN_MAX_DOMAIN_MEMORY=500 CONFIG_XEN_SAVE_RESTORE=y CONFIG_XEN_DEBUG_FS=y CONFIG_PCI_XEN=y CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=m # CONFIG_XEN_BLKDEV_BACKEND is not set CONFIG_NETXEN_NIC=m CONFIG_XEN_NETDEV_FRONTEND=m # CONFIG_XEN_NETDEV_BACKEND is not set CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y # CONFIG_XEN_WDT is not set CONFIG_XEN_FBDEV_FRONTEND=y # Xen driver support CONFIG_XEN_BALLOON=y # CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set CONFIG_XEN_SCRUB_PAGES=y CONFIG_XEN_DEV_EVTCHN=m CONFIG_XEN_BACKEND=y CONFIG_XENFS=m CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y CONFIG_XEN_GNTDEV=m CONFIG_XEN_GRANT_DEV_ALLOC=m CONFIG_SWIOTLB_XEN=y CONFIG_XEN_PCIDEV_BACKEND=m CONFIG_XEN_PRIVCMD=m CONFIG_XEN_ACPI_PROCESSOR=m
Wir müssen also nun folgende Zeilen ändern. Von:
CONFIG_XEN_NETDEV_FRONTEND=m # CONFIG_XEN_NETDEV_BACKEND is not set
zu
CONFIG_XEN_NETDEV_FRONTEND=y CONFIG_XEN_NETDEV_BACKEND=m
und von:
CONFIG_XEN_BLKDEV_FRONTEND=m # CONFIG_XEN_BLKDEV_BACKEND is not set
zu
CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_BLKDEV_BACKEND=m
.
Nachdem die entsprechenden Backends auf Module geaendert wurden, werden nun die Frontends auf Fest einkompilieren umgestellt:
Zum Vergleich:
-> VORHER:
cat .config | grep -i xen | grep FRONTEND CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=m CONFIG_XEN_NETDEV_FRONTEND=m CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y CONFIG_HVC_XEN_FRONTEND=y CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_XENBUS_FRONTEND=y
-> NACHHER
cat .config | grep -i xen | grep FRONTEND CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y CONFIG_HVC_XEN_FRONTEND=y CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_XENBUS_FRONTEND=y
Wenn der Rest der Hardware passt, kanns weitergehen.
4. Kernel kompilieren
make -j9
(wobei ihr die 9 durch anzahl der kerne +1 ersetzen solltet. Bei mir sind es 8 Kerne, daher wähle ich 9)
ist das durchgelaufen kannst mit
make modules_install install
weitergehen. Nachdem die Module gebaut sind können wir noch das RPM erzeugen lassen, welches wir später installieren.
make rpm
Den frisch gebauten Kernel installieren wir mit:
rpm -ivh /root/rpmbuild/RPMS/x86_64/kernel-3.6.7-2.x86_64.rpm
5. Den neuen Kernel testen
reboot
starte neu…
Bei der Menüauswahl dann den neuen Kernel wählen.
[root@rhel6xentest2 ~]# uname -a Linux rhel6xentest2 3.6.7 #0 SMP Thu Nov 22 15:58:38 CET 2012 x86_64 x86_64 x86_64 GNU/Linux
Der neue Kernel sollte nun laufen und wir können uns im nächsten Teil darum kümmern Xen zu bauen.
Das Howto in aktueller Form fußt auf einem bunten Mix aus Foren- und Mailinglistenbeiträgen von AndrewSerk aus dem ScientificLinux Forum und Fajar A. Nugraha aus der Xen Mailingliste.
2 thoughts on “Howto (RHEL 6 / CentOS 6): Xen (4.2+) mit neuerem (3.6+) vanilla Kernel bauen. (1/2)”