How-to Build Latest Linux Kernel on Debian from Linus’ git Repo

1434

Here’s a how-to for building a recent 2.6 Linux kernel on your Debian GNU/Linux box.

You will need to do all this as root. It’s serious business building new Linux kernels 🙂

su -

The dash after the su command makes it behave as if you had logged in as root directly, a full login environment is applied.

Make sure you have the required tools and libraries installed:

apt-get install build-essential module-init-tools initramfs-tools 
procps libncurses5-dev kernel-package fakeroot git-core screen
zlib1g-dev

Use git to clone Linus’ latest git repo:

cd /usr/src

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

cd linux-2.6

This will take a long time.

Once you have the source you’re ready for configuration. I base my new kernel configuration on a known working configuration, then trim it down from there. Check to see what configurations you have in /boot:

ls /boot/config*

Configure your new kernel source using your chosen config file:

make menuconfig

Select “Load an Alternate Configuration File,” enter your config file path, for example I used /boot/config-2.6.26-2-686. Hit exit and save.

Build the kernel and package it:

make-kpkg clean

CONCURRENCY_LEVEL=9 screen fakeroot make-kpkg --revision=1 --initrd kernel_image

make-kpkg clean cleans up the kernel source.

CONCURRENCY_LEVEL=9 translates into `make -j9` later. make -j9 means to compile things in parallel using all your processors, so adjust accordingly for your actual system. I usually go 2x the actual number of processors +1.

screen is a command used to run another command in a virtual screen. The new virtual screen doesn’t end if you disconnect. `man screen` if you’re not familiar, it’s a very useful tool.

fakeroot provides a fake root environment in which to build a package.

make-kpkg is a kernel building and packaging tool.

The –revision is whatever you want, I increment mine by one every time I build a new kernel, and usually start over when Linus releases a “stable” kernel.

The –initrd option makes dpkg build a new initrd image when you install the kernel package later. An initrd image contains drivers your system needs before your kernel loads, for example, raid and ext3.

Build a new kernel using a distro’s (Debian in my case) default config takes a while. Everything will usually work on the first try using a distro config since everything is built as modules as much as possible, and all modules get built. You stand a good chance of successfully booting a new kernel built this way. Later you can remove stuff from the config and rebuild. Wash, rinse, and repeat until you get your kernel config down to just the hardware you actually have in your system.

Install the new kernel:

cd ..

dpkg -i linux-image-2.6.31-rc7_1_i386.deb

Reboot.

When your system comes back up.

> uname -a
Linux saturn.localdomain 2.6.31-rc7 #2 SMP Mon Aug 24 21:53:19 CDT 2009 i686 GNU/Linux