Linux: Custom Kernels Trim Fat and Tune Performance - Page 2

Your Linux distribution probably arrived with a "kitchen sink" kernel. It doesn't take much to build a better one that's tuned to your hardware's needs.

 By Carla Schroder
Page 2 of 2   |  Back to Page 1
Print Article

Unpack your kernel tarball with tar zxvf linux-2.6.22.tar.bz2, using your correct version of course. Then change to the top-level kernel source directory and open the Makefile in your favorite text editor. Change the EXTRAVERSION = line to something unique, like EXTRAVERSION = .1-carla.

Next, let's see what options the make command has:

$ make help

This is going to spit out a lot of information. Take some time to look it over. Read the Makefile itself, which is a plain-text file. Then do a bit of housecleaning:

$ make mrproper

Read the output of make helpto see what this does. It shouldn't be necessary at this stage, but it's cheap insurance and sometimes you inherit funky stuff.

Now we get to the fun part- configuring our new kernel-to-be:

$ make xconfig

You'll see something like Figure 1.

This is the part that takes a lot of time. If you don't have a config file in your kernel source tree or supply one on purpose, xconfig will use your /boot/config-2.6.* file. This isn't a problem, but a good starting point. You can change anything you want anyway. Click the Help button to see how to use xconfig. Every configuration option has a description, and next week we'll review some of them.

Once you are happy with your configuration, run the makecommand with no options. This will take some time, maybe up to an hour or more. Then change to root and run these commands:

# make modules_install
# mkinitrd -o /boot/initrd-2.6.22.img
# cp ~/kernel/linux-2.6.22/arch/i386/boot/bzImage /boot/vmlinuz-2.6.22
# cp ~/kernel/linux-2.6.22/System.map /boot/System.map-2.6.22

arch/i386/boot/bzImage is your new kernel, and it must be copied to the /boot directory. Copy over the matching System.map, and your new initrdimage should already be there.

Add all of this to your GRUB menu, reboot, and give it a whirl. This is an example menu.lst entry:

title homebrew 2.6.22 kernel
root (hd0,0)
kernel /boot/vmlinuz-2.6.22 root=UUID=b099f554-db0b-45d4-843e-0d6a1c43ba44 ro
initrd /boot/initrd-2.6.22.img

The kernel names and initrd image names are arbitrary; you could call them anything you want, as long your menu.lst entries match. GRUB counts from zero, so /dev/hda1, which is the first partition on the first hard drive, equals (hd0,0) in menu.lst.

The root partition's UUID comes from running the blkidcommand:

$ blkid
/dev/sda1: UUID="b099f554-db0b-45d4-843e-0d6a1c43ba44" SEC_TYPE="ext2" TYPE="ext3"
/dev/hda1: UUID="1a5408ad-7d1d-4e24-b9db-d132d76e9e8e" SEC_TYPE="ext2" TYPE="ext3"

In this shiny new era of udev, you should use UUIDs to identify your block devices because /dev names are no longer static, but at the mercy of udev. You need to create an initrd image because the /devdirectory is not populated until after boot, so there is no way (that I know of) to build the boot device into the kernel anymore.

Next week we'll learn the Debian and the Fedora way of customizing kernels, and review some of the meelyuns of kernel compilation options.


This article was originally published on Jul 23, 2007
Get the Latest Scoop with Networking Update Newsletter