Fedora doesn’t ship with an x86 Athlon (K7 series i.e. Athlons up to Athlon XP) optimized Kernel, so I wanted to build one (the standard one w/o xen etc.) myself. I didn’t find any info on the web about this, except that MK7 has to be enabled in the kernel config.
Phew, MK7! Sounds scaringly like MI5, MI6 or even MKULTRA.. :))
WARNING: I’m not very familiar with compiling Kernels nor with the Kernel RPMs of Fedora. I once did a vanilla Kernel compile from source and some simple rebuilds of Fedora Kernel RPMs. The described procedure seems to be working for me. But be warned!
0.) Setup non-root rpmbuild environment
Don’t build as root! Be sure to have rpmdevtools RPM installed. Then as the user you want to build with, issue fedora-buildrpmtree. This will setup your rpmbuild environment including a directory ~/rpmbuild.
1.) Get original FC5 Kernel source
Download latest Fedora Kernel source RPM. In my case that is kernel-2.6.17-1.2174_FC5.src.rpm.
Extract the RPM with fedora-extract kernel-2.6.17-1.2174_FC5.src.rpm.
2.) Enable Athlon RPM builds
Create a Kernel config file for Athlon K7 architecture. Do this by copying the kernel-*-i686.config to kernel-*-athlon.config (of course with the * replaced by the Kernel version) and changing that copy like shown in the diff below:
[scheff@p512o kernel-2.6.17-1.2174_FC5]$ diff kernel-2.6.17-athlon.config kernel-2.6.17-i686.config
2772c2772
< # CONFIG_M686 is not set
---
> CONFIG_M686=y
2778c2778
< CONFIG_MK7=y
---
> # CONFIG_MK7 is not set
This defines an architecture K7 instead of i686.
Edit the kernel-2.6.spec file like shown in this diff:
[scheff@p512o kernel-2.6.17-1.2174_FC5]$ diff kernel-2.6.spec kernel-2.6.spec.orig
11c11
< %define buildxen 0
---
> %define buildxen 1
13c13
< %define buildkdump 0
---
> %define buildkdump 1
26c26
< %define release %(R="$Revision: 1.2175 $"; RR="${R##: }"; echo ${RR%%?})_FC5
---
> %define release %(R="$Revision: 1.2174 $"; RR="${R##: }"; echo ${RR%%?})_FC5
35c35
< %define all_x86 i586 i686 athlon
---
> %define all_x86 i586 i686
67,72d66
< %ifarch athlon
< %define all_arch_configs $RPM_SOURCE_DIR/kernel-%{kversion}-athlon*.config
< %define image_install_path boot
< %define signmodules 1
< %endif
<
173c167
< ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ia64 athlon
---
> ExclusiveArch: noarch %{all_x86} x86_64 ppc ppc64 ia64
237,238d230
< Source77: kernel-%{kversion}-athlon.config
<
To sum it up, I enabled building for the Athlon architecture by expanding the i686 entries, defined the aforementioned config file, disabled building of kdump and xen Kernels and increased the revision number.
I increased the revision so I wouldn’t have to replace my recent official Kernel and for better distinguishabilty, but this also means that eventually needed kernel module RPMs have to be rebuilt.
3.) Build the RPMs
Create symbolic links in ~/rpmbuild/SOURCES to the diretory’s content of the extracted RPM e.g. like this:
[scheff@p512o kernel-2.6.17-1.2174_FC5]$ ln -s /home/scheff/src/kernel-2.6.17-1.2174_FC5/* /home/scheff/rpmbuild/SOURCES/
Build the binary and and source RPMs with:
[scheff@p512o kernel-2.6.17-1.2174_FC5]$ rpmbuild -ba --target=athlon ~/rpmbuild/SOURCES/kernel-2.6.spec
The building process will take a very long time (for me about an hour or so). But once successfully finished (exit 0) you should find these RPMs:
~/rpmbuild/RPMS/athlon/kernel-2.6.17-1.2175_FC5.athlon.rpm
~/rpmbuild/RPMS/athlon/kernel-debuginfo-2.6.17-1.2175_FC5.athlon.rpm
~/rpmbuild/RPMS/athlon/kernel-devel-2.6.17-1.2175_FC5.athlon.rpm
~/rpmbuild/SRPMS/kernel-2.6.17-1.2175_FC5.src.rpm
Now you could delete the symlinks in the ~/rpmbuild/SOURCES diretory, to keep it clean.
4.) Installing the RPMs
Well, if you dared to build the Kernel RPMs you shouldn’t need assistance in intalling them, but just for the sake of completeness:
[root@p512o ~]# rpm -ihv /home/scheff/rpmbuild/RPMS/athlon/kernel-2.6.17-1.2175_FC5.athlon.rpm /home/scheff/rpmbuild/RPMS/athlon/kernel-devel-2.6.17-1.2175_FC5.athlon.rpm
Reboot and check if your homegrown Kernel behaves nicely. For me it did very well and a bit faster me thinks.
And don’t forget that you need to build the matching kernel modules, if the kernel revision number was changed. For me that is kernel-module-ntfs-2.6.17-1.2175_FC5-2.1.27-0.rr.10.5 (see linux-ntfs homepage for build instructions) and kmod-fglrx-8.27.10-0.2.6.17_1.2175_FC5 (see my previous posting for build instructions) both with Athlon optimizations.
Caveats
One thing that makes me wonder, is that uname -m still shows i686, but I’m not sure if this is normal.
The kernel config shows 3D Now is enabled and Machine is indeed set to K7.
It would certainly have been better to do a menuconfig with the 2.6.17-1.2174_FC5 config in the kernel source tree. Here’s the config diff:
[scheff@p512o boot]$ diff config-2.6.17-1.2175_FC5 config-2.6.17-1.2174_FC5
3,4c3,4
< # Linux kernel version: 2.6.17-1.2175_FC5
< # Fri Aug 25 01:03:12 2006
---
> # Linux kernel version: 2.6.17-1.2174_FC5
> # Tue Aug 8 15:26:05 2006
111c111
< # CONFIG_M686 is not set
---
> CONFIG_M686=y
117c117
< CONFIG_MK7=y
---
> # CONFIG_MK7 is not set
133a134
> CONFIG_X86_PPRO_FENCE=y
142d142
< CONFIG_X86_USE_3DNOW=y
If you find any errors or nonsense please comment. Feel free to ask questions, too. This posting is prone to change, as this was my very first and dirty attempt.
ChangeLog
[070429 Fix minor typos. Fix some markup. Add logo image.]