Why would someone want to compile a new kernel? It is often not necessary since the default kernel shipped with Ubuntu handles most configurations. However, it is useful to compile a new kernel in order to:
handle special hardware needs, or hardware conflicts with the pre-supplied kernels
handle hardware or options not included in the stock kernel, such as APM or SMP
optimize the kernel by removing useless drivers to speed up boot time
use options of the kernel which are not supported by the default kernel (such as high memory support)
run an updated or development kernel
impress your friends, try new things
Don't be afraid to try compiling the kernel. It's fun and profitable.
To compile a kernel the Debian way, you need some packages:
kernel-package
,
kernel-source-2.6.10
(the most recent version
at the time of this writing), fakeroot
and a
few others which are probably already installed (see
/usr/share/doc/kernel-package/README.gz
for the
complete list).
This method will make a .deb of your kernel source, and, if you have
non-standard modules, make a synchronized dependent .deb of those
too. It's a better way to manage kernel images;
/boot
will hold the kernel, the System.map, and a
log of the active config file for the build.
Note that you don't have to compile your kernel
the “Debian way”; but we find that using the packaging system
to manage your kernel is actually safer and easier. In fact, you can get
your kernel sources right from Linus instead of
kernel-source-2.6.10
, yet still use the
kernel-package
compilation method.
Note that you'll find complete documentation on using
kernel-package
under
/usr/share/doc/kernel-package
. This section just
contains a brief tutorial.
Hereafter, we'll assume you have free rein over your machine and will
extract your kernel source to somewhere in your home directory[7]. We'll also assume that your kernel version is
2.6.10. Make sure you are in the directory to where you want to
unpack the kernel sources, extract them using tar xjf
/usr/src/kernel-source-2.6.10.tar.bz2
and change
to the directory kernel-source-2.6.10
that will have been created.
Now, you can configure your kernel. Run make
xconfig
if X11 is installed, configured and being run; run
make menuconfig
otherwise (you'll need
libncurses5-dev
installed). Take the time to read
the online help and choose carefully. When in doubt, it is typically
better to include the device driver (the software which manages
hardware peripherals, such as Ethernet cards, SCSI controllers, and so
on) you are unsure about. Be careful: other options, not related to a
specific hardware, should be left at the default value if you do not
understand them. Do not forget to select “Kernel module loader”
in “Loadable module support” (it is not selected by default).
If not included, your Debian installation will experience problems.
Clean the source tree and reset the kernel-package
parameters. To do that, do make-kpkg clean
.
Now, compile the kernel:
fakeroot make-kpkg --revision=custom.1.0 kernel_image
.
The version number of “1.0” can be changed at will; this is just
a version number that you will use to track your kernel builds.
Likewise, you can put any word you like in place of “custom”
(e.g., a host name). Kernel compilation may take quite a while, depending on
the power of your machine.
If you require PCMCIA support, you'll also need to install the
pcmcia-source
package. Unpack the gzipped tar file
as root in the directory /usr/src
(it's important that
modules are found where they are expected to be found, namely,
/usr/src/modules
). Then, as root, do make-kpkg
modules_image
.
Once the compilation is complete, you can install your custom kernel
like any package. As root, do dpkg -i
../kernel-image-2.6.10-
.
The subarchitecture
_custom.1.0_i386.debsubarchitecture
part is an optional
sub-architecture,
such as “i586”,
depending on what kernel options you set.
dpkg -i kernel-image...
will install the
kernel, along with some other nice supporting files. For instance,
the System.map
will be properly installed
(helpful for debugging kernel problems), and
/boot/config-2.6.10
will be installed,
containing your current configuration set. Your new
kernel-image-2.6.10
package is also clever
enough to automatically use your platform's boot-loader to run an
update on the booting, allowing you to boot without re-running the
boot loader. If you have created a modules package, e.g., if you have
PCMCIA, you'll need to install that package as well.
It is time to reboot the system: read carefully any warning that the
above step may have produced, then shutdown -r now
.
For more information on kernel-package
, read
the fine documentation in /usr/share/doc/kernel-package
.
[7] There are other locations where you can extract kernel sources and build your custom kernel, but this is easiest as it does not require special permissions.