Table of Contents

Fedora Kernel Building Information

Current Version at time of writing: Fedora 12

New Info:

http://fedoraproject.org/wiki/Building_a_custom_kernel (info for fedora > 8)


Old Info:

http://www.mjmwired.net/

http://www.mjmwired.net/resources/mjm-fedora-fc5.html#kernelsrc

     the above links shows how to download the fedora kernel source

http://www.howtoforge.com/kernel_compilation_fedora

     the above link explains how to build a fedora rpm kernel

http://fedoraproject.org/wiki/Docs/CustomKernel

Fedora is using a system frequency of 1000Hz now, which sometimes causes problems when the Fedora server is being run as a virtual server (the client system). The clock gets all out of whack.

I've been able to compile a custom kernel with a frequency of 100Hz to solve this problem. 1)

Preparation

Download Kernel Source

Obtaining Kernel Source through 'yum'

There are yum utilities which will download the LATEST kernel source.

You only have to install yum-utils once:

[root@maltsweb kernel-source]# yum install yum-utils

Download the new kernel source:

[root@maltsweb kernel-source]# yumdownloader --source kernel --enablerepo core-source --enablerepo updates-source

Install the Kernel Source

Install the SRC.RPM file and Prepare source

Install the kernel.src.rpm that you chose to install in the previous steps.

Install:

[root@maltsweb kernel-source]# rpm -Uvh kernel-2.6.15-1.1955_FC5.src.rpm
   1:kernel                 ########################################### [100%]

Prep the Source

Install any dependencies that our kernel build might have:

# yum-builddep kernel

Set it up:

First we need to “brand” our custom kernel:

[root@maltsweb kernel-source]# vi /usr/src/redhat/SPECS/kernel-2.6.spec

And change:

- #% define dist .XX
+ %define dist .www

Make sure you remove the space after the %

And finally run:

[root@maltsweb kernel-source]# rpmbuild -bp --target=$(uname -m)  /usr/src/redhat/SPECS/kernel-2.6.spec

rpmbuild: -bp = build prep (it extracts and patches the kernel, preparing it for building, but does NOT build the kernel)

Customize your kernel

This is when you prepare patches, new configs, etc.

Configure the Kernel

cd SOURCES/*
make menuconfig

Build the Kernel RPM

Build the RPM:

# cd SPECS/
# rpmbuild -bb --target=$(uname -m) --with firmware --without debug --without debuginfo --without devel kernel.spec

Install the RPM:

cd RPMS/i386
rpm -ivh kernel-2.6.20www1.2316-2.i386.rpm

Old Notes

mkinitrd

mkinitrd /boot/initrd-2.6.20-www1.2316-2.img 2.6.20-www1.2316

Edit grub

vi /boot/grub/menu.lst
#title Fedora Core (2.6.20-1.2316.fc5smp)
#       root (hd0,0)
#       kernel /vmlinuz-2.6.20-1.2316.fc5smp ro root=/dev/VolGroup00/LogVol00 rhgb quiet
#       initrd /initrd-2.6.20-1.2316.fc5smp.img

title Fedora Core (2.6.20-www1.2316)
        root (hd0,0)
        kernel /vmlinuz-2.6.20-www1.2316 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
        initrd /initrd-2.6.20-www1.2316-2.img

Removing old Kernels

Reboot using the new kernel (and leave the old one installed just incase).

Run the following to verify that the new kernel is loaded:

[john@maltsweb ~]$ uname -r
2.6.20-www1.2316


Now, view the currently installed kernels:

[root@maltsweb john]# rpm -q kernel
kernel-2.6.20www1-1
kernel-2.6.20www1.2316-2

select the kernel you wish to remove (kernel-2.6.20www1-1 in this case, since the other kernel looks similar to the currently running kernel) and remove it:

[root@maltsweb john]# rpm -e --nodeps kernel-2.6.20www1-1
[root@maltsweb john]#

Removing old source files/making space for the build

You should probably remove the source of your previous kernel build prior to building the new kernel.

[root@maltsweb ~]# cd /usr/src/redhat/BUILD/
[root@maltsweb BUILD]# ls
kernel-2.6.20  kernel-2.6.20www1.2316
[root@maltsweb BUILD]# ls -l
total 16
drwxr-xr-x  5 root root 4096 May 15 18:33 kernel-2.6.20
drwxr-xr-x 21 root root 4096 May 15 18:25 kernel-2.6.20www1.2316
[root@maltsweb BUILD]# uname -r
2.6.20-www1.2316
[root@maltsweb BUILD]#

The above shows that I currently have the kernel-2.6.20 source code, and a custom build for kernel-2.6.20www1.2316, which matches the currently running kernel. So when I upgrade my kernel, before I start I can remove the custom kernel directory:

[root@maltsweb BUILD]# rm -Rf kernel-2.6.20www1.2316/
[root@maltsweb BUILD]#

This should clear up enough space to build a new kernel.