http://sunsite.unc.edu/pub/Linux/kernel/v2.0/or one of the many mirror sites. Pick the latest version, e.g. linux-2.0.29.tar.gz. Note that there is also a v2.1 kernel, but this is a development or "experimental" kernel. In general, Linux kernel versions x.y where y is even are "stable" kernels which receive only bug fixes; where y is odd they are "experimental" kernels under development.
This file is BIG - around 6MB. To save having to download all of this, there are 'patch' files which contain only the changes between each version. So if you have, say, version 2.0.27 already (e.g. on CD-ROM) you can upgrade it to 2.0.29 by applying patch-2.0.28.gz and then patch-2.0.29.gz
Here are the commands to unpack the kernel source (replace '/tmp' with whatever directory the files are found in); this example also shows patch files being used.
cd /usr/src tar -xvzf /tmp/linux-2.0.27.tar.gz zcat /tmp/patch-2.0.28.gz | patch -p0 zcat /tmp/patch-2.0.29.gz | patch -p0
cd /usr/src/linux make menuconfigAt this point you will be presented with a hierarchy of menus to select kernel features. Note that if you want to compile a kernel with IP Masquerading, you must go into "Code maturity level options" and enable "Prompt for development and/or incomplete code/drivers", otherwise the IP Masquerading option (under "Networking Options") will be hidden.
Many drivers have < > next to them. This means that they can either be compiled into the kernel, or built as a separate loadable module which you can load in at run time. Those options which have [ ] next to them can only be built into the kernel itself.
When you have finished, you will be asked if you wish to save your kernel configuration. Say YES.
make dep make zImage make modules make modules_install cp /usr/src/linux/arch/i386/boot/zImage /boot/kernelname'make zImage' builds the main kernel file itself, as a compressed image file. When the compile has finished you need to copy this into your /boot directory and give it a name, perhaps zImage-2.0.29 which lets you identify the version. The modules are installed under /lib/modules/2.0.x by make modules_install
If you are compiling a kernel with the same version number as an existing one (e.g. 2.0.27) then you may want to keep a copy of the old modules to use with the old kernel, before doing 'make modules_install'
cd /lib/modules mv 2.0.27 2.0.27.orig
image = /boot/vmlinuz label = linux root = /dev/hda2 read-onlythen you can add a new section so it looks like this:
image = /boot/zImage-2.0.29 label = linux root = /dev/hda2 read-only image = /boot/vmlinuz label = linux-old root = /dev/hda2 read-onlyNote that the new kernel is listed first (so it is the default, if your system boots directly into Linux), and that we have changed the label for the old kernel to linux-old to differentiate it. In this way, you can have many different kernels on your hard drive and switch between them at boot time.
After editing /etc/lilo.conf, type lilo and the installation should go ahead; your default bootup option will be listed with a '*', e.g.
Added windows * Added linux Added linux-oldYou will get an error message if something is not right in your lilo.conf file. Just correct it and rerun lilo.
Red Hat note: If your system loads kernel modules from an 'initial RAM disk' (e.g. for a SCSI card) you will need to built a new ram disk image like this:
mkinitrd /boot/initrd-2.0.29 2.0.29and reference this in lilo.conf (e.g. "initrd=/boot/initrd-2.0.29")
However, the purpose of this is so that the kernel can load modules for drivers which are needed to continue with system bootup - for example, if you have a SCSI hard drive, the kernel needs the appropriate SCSI driver before it can mount the root filesystem. If you are building your own kernel, you know which SCSI driver you want, so you may as well compile this directly into the kernel, in which case you don't need an initrd at all. (initrd is there so that a single kernel supplied by Red Hat will boot on any type of hardware)
PCMCIA users may have to recompile PCMCIA modules. See your distribution documentation.