Nachdem es in den anderen beiden Beiträgen (Kernel, Xen) um das Bauen des Kernels und Xen von Hand ging, möchte ich heute darüber schreiben, wie ich die Sache ein wenig automatisiert bekommen habe (nur ein wenig) und mir RPMs zum verteilen bastele. Zuerst geht es darum ein RPM für den vanilla Kernel zu bauen und dieses immer Xen tauglich zu halten, danach geht es darum ein Paket für Xen zu bauen, um die Installation zu vereinfachen.
Ich hatte dazu bereits einen langen Artikel vorbereitet und ein abgespecktes Kernel-Specfile auf Basis von FC17 gebastelt. Aber ich bin auf den Blog von Steve gestoßen und sein Spec-File hatte im wesentlichen die gleichen Züge, sodass ich dieses als neue Basis für meine RPMS benutze und etwas angepasst habe (Patches entfernt etc.).
1. Bootstrapping – Einrichten einer passenden Umgebung
Um uns ersteinmal eine geeignete Umgebung zu schaffen, sollten (wie im anderen Vanilla-Kernel-Howto beschrieben) ein paar Development-Pakete installiert sein. Dazu als root
yum groupinstall development yum install ncurses-devel rpmdevtools rpm-devel bc pciutils-devel zlib-devel yum install asciidoc hmaccalc perl-ExtUtils-Embed xmlto audit-libs-devel yum install binutils-devel elfutils-devel elfutils-libelf-devel newt-devel python-devel
Danach sollte man als normaler(!) User eine Umgebung fürs RPM-bauen einrichten. In meinem Fall habe ich den User für dieses Tutorial ‚kernelbau-dennis‘ genannt:
rpmdev-setuptree
2. Kernel herunterladen
Als nächstes brauchen wir den aktuellen Kernel. Zum Zeitpunkt des letzten Updates dieses Artikels war das 3.10.4, bitte vorher auf der Seite schauen, welche Version gerade aktuell ist und den Wget-Aufruf entsprechend anpassen.
cd /home/kernelbau-dennis/SOURCES
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.4.tar.xz
tar -xJvf linux-3.10.4.tar.xz
cd linux-3.10.4
3. Kernel Config erstmalig anpassen
Angenommen wir bauen zum ersten mal einen neuen Kernel, dann ist der Versionssprung von 2.6.32 auf 3.9.x oder höher doch sehr groß. Das würde dafür sorgen, dass wir lange Zeit vor make oldconfig verbringen, daher übernehme ich Anfangs die Konfiguration von Kernel.org und passe sie in einigen Punkten für Xen an. Etwas detaillierter habe ich das ganze im Abschnitt „Kernelconfigs anpassen“ im anderen Xen/Kernel-Tutorial Teil 1 beschrieben. Dieser Schritt ist so nur einmal nötig und stellt unsere erste Config dar, auf der wir aufsetzen und Veränderungen/Updates durchführen.
Ein
make menuconfig
bringt uns in die „grafische“ Konfiguration.
Update: Seit Kernel Version 3.10 ist es notwendig, dass man erst einmal „Linux guests“ aktiviert, bevor man überhaupt die Optionen für die Xen-Module angezeigt bekommt.
- -> Device Drivers -> Network device support:
- Xen network device frontend driver: *
- Xen backend network device: M
- -> Device Drivers -> Block devices:
- Xen virtual block device support: *
- Xen block-device backend driver: M
Wenn alle Einstellungen vorgenommen sind, müssen wir das Configfile noch speichern – am besten gleich mit passendem Namen. Hierzu einfach unten „save“ auswählen und bei der Eingabe die Datei mit „config-3.10.x86_64“ benennen, wobei je nach Kernelversion das Schema „config-$major.$minor.x86_64“ lautet.
Wichtig ist, dass wir sicherstellen, dass die Xen-Frontendmodule fest einkompiliert werden, und die Backends als Module vorhanden sind (hier ein Auszug aus dem anderen Howto):
Auszug: cat config-3.10.x86_64 | grep -i xen | grep NETDEV:
CONFIG_XEN_NETDEV_FRONTEND=y CONFIG_XEN_NETDEV_BACKEND=m
cat config-3.10.x86_64 | grep -i xen | grep BLKDEV:
CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_BLKDEV_BACKEND=m
Danach kopieren wir die nun erstellte Config eine Ebene tiefer und löschen den entpackten Kernel.
cp config-3.10.x86_64 ..
cd ..
rm -rf linux-3.10.4
4. SpecFile anpassen
Zu guter letzt wird noch das Specfile benötigt. Ich habe meines hier zu Verfügung gestellt, das Specfile ist auch im SRPM vorhanden.
cd /home/kernelbau-dennis/rpmbuild/SPEC wget http://www.techdudes.de/download/kernelspecfile-dennis.spec vi /home/kernelbau-dennis/rpmbuild/SPEC/kernelspecfile-dennis.spec
Danach müssen die Versionen im Specfile angepasst werden, sodass die auf die Kernelversion passen.
%define kvmajor 3.10 %define kvminor 4 %define pkg_release 1 %define KRELEASE %{kvmajor}.%{kvminor}-%{release}.%{_target_cpu} %define rhel 6
5. Paket bauen lassen
Um den Bauprozess zu starten, gehen wir in das SPEC Verzeichnis und setzen den rpmbuild Befehl ab.
rpmbuild -ba kernel-xen-dw.spec
Dann etwas warten, ob evtl. nachfragen von make oldconfig kommen. Immer wenn jetzt wieder an der Stelle ein Kernel gebaut werden soll, sorgt das Script dafür, das mit make oldconfig erst einmal ein abgleich zur neueren Kernelversion in der Configdatei vorgenommen wird.
Sollten Probleme auftreten, ist es evtl. sinnvoll das Debug-output zu speichern:
rpmbuild -ba kernel-xen-dw.spec 2> build-err.log | \tee build-out.log
Wenn alles glatt geht, können wir nun die fertigen Pakete unter rpmbuild/RPMS finden:
[kernelbau-dennis@xs1-xenbau x86_64]$ ls /home/kernelbau-dennis/rpmbuild/RPMS/x86_64 kernel-xen-3.10.4-1.el6xen.x86_64.rpm kernel-xen-devel-3.10.4-1.el6xen.x86_64.rpm kernel-xen-firmware-3.10.4-1.el6xen.x86_64.rpm kernel-xen-headers-3.10.4-1.el6xen.x86_64.rpm
Das war´s soweit erstmal für das Xen-fähige Kernel-Paket 🙂
6. Repositories von Dritten
Ich baue mein Paket gerne selbst, weil ich auch die Konfigurationen gerne selbst anpasse. Das Specfile basiert mittlerweile auf dem von Steve und ich werde weiter dran rumbasteln. Für Xen prüfe ich ebenfalls, ob ich meine Files über Bord werfe und neu auf Basis von Choon oder Steve beginne. Wem das alles jedoch zuviel Arbeit ist, kann sich die Kernel und Xen Pakete von Choon und Steve ansehen. Beide betreiben eigene Repositories.
- Steven Haigh:
- Steven Haighs Blog: https://www.crc.id.au
- Stevens Seite zu Xen/Kernel: http://xen.crc.id.au/
- Stevens Repository nutzen: http://xen.crc.id.au/support/guides/install/
- Choon:
- Choon Seite: http://choon.net
- Install howto: http://choon.net/forum/read.php?16,672307,672307