How To Compile A Kernel - The Ubuntu Way - Page 2

5 Configure The Kernel

It's a good idea to use the configuration of your current working kernel as a basis for your new kernel. Therefore we copy the existing configuration to /usr/src/linux:

cp /boot/config-`uname -r` ./.config 

Then we run

make menuconfig

which brings up the kernel configuration menu. Go to Load an Alternate Configuration File and choose .config (which contains the configuration of your current working kernel) as the configuration file:

Then browse through the kernel configuration menu and make your choices. When you are finished and select Exit, answer the following question (Do you wish to save your new kernel configuration?) with Yes:


6 Build The Kernel

To build the kernel, execute these two commands:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

After --append-to-version= you can write any string that helps you identify the kernel, but it must begin with a minus (-) and must not contain whitespace.

Now be patient, the kernel compilation can take some hours, depending on your kernel configuration and your processor speed.


7 Install The New Kernel

After the successful kernel build, you can find two .deb packages in the /usr/src directory.

cd /usr/src
ls -l

On my test system they were called linux-image- (which contains the actual kernel) and linux-headers- (which contains files needed if you want to compile additional kernel modules later on). I install them like this:

dpkg -i linux-image-
dpkg -i linux-headers-

(You can now even transfer the two .deb files to other Ubuntu systems and install them there exactly the same way, which means you don't have to compile the kernel there again.)

That's it. You can check /boot/grub/menu.lst now, you should find two stanzas for your new kernel there:

vi /boot/grub/menu.lst

The stanzas that were added on my test system look like these:

title           Ubuntu, kernel
root            (hd0,0)
kernel          /boot/vmlinuz- root=/dev/sda1 ro quiet splash
initrd          /boot/initrd.img-

title           Ubuntu, kernel (recovery mode)
root            (hd0,0)
kernel          /boot/vmlinuz- root=/dev/sda1 ro single
initrd          /boot/initrd.img-

Now reboot the system:

shutdown -r now

If everything goes well, it should come up with the new kernel. You can check if it's really using your new kernel by running

uname -r

This should display something like

If the system doesn't start, restart it, and when you see this:


press ESC to enter the GRUB menu:

Select your old kernel and start the system. You can now try again to compile a working kernel. Don't forget to remove the two stanzas of the not-working kernel from /boot/grub/menu.lst.


Share this page:

15 Comment(s)

Add comment

Please register in our forum first to comment.



You can also get root access by invoking:

sudo -s  

This eliminates the need to create a root accout.  However, either way works. 



I believe the command below was wrapped to two lines due to the cms software.  If I am not mistaken it should be one line unless you explicitly spit it using the "\" (backslash).

 For those new to the command line, note how the prompt changes for the second and third lines, indicating the command is continued across multiple lines:

 [email protected]:~$ fakeroot make-kpkg --initrd --append-to-version=-custom \
> kernel_image \
> kernel_headers


And with make-kpkg, just set CONCURRENCY_LEVEL=X just before starting compilation to use multiple cores...

By: Anonymous

I followed all of the instructions but I got a problem when I was building kernel:

scripts/mod/sumversion.c: In function ‘get_src_version’:
scripts/mod/sumversion.c:384: error: ‘PATH_MAX’ undeclared (first use in this function)
scripts/mod/sumversion.c:384: error: (Each undeclared identifier is reported only once
scripts/mod/sumversion.c:384: error: for each function it appears in.)
scripts/mod/sumversion.c:384: warning: unused variable ‘filelist’
make[3]: *** [scripts/mod/sumversion.o] Error 1
make[2]: *** [scripts/mod] Error 2
make[1]: *** [scripts] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.18'
make: *** [debian/stamp-build-kernel] Error 2

Any ideas?

By: Anonymous

There is an error on version 2.6.33

| COLUMNS=150 dpkg -l 'gcc*' perl dpkg 'libc6*' binutils make dpkg-dev |\
| awk '$1 ~ /[hi]i/ { printf("%s-%s\n", $2, $3) }'> debian/stamp/build/info
| uname -a >> debian/stamp/build/info
| echo using the compiler: >> debian/stamp/build/info
| grep LINUX_COMPILER include/linux/compile.h | \
| sed -e 's/.*LINUX_COMPILER "//' -e 's/"$//' >> debian/stamp/build/info
| grep: include/linux/compile.h: No such file or directory
| echo done > debian/stamp/build/kernel
| fakeroot /usr/bin/make -f ./debian/rules debian/stamp/binary/pre-linux-image-2.6.33-rc1-amd64
| make[1]: Entering directory `/usr/src/linux-2.6.33-rc1'
| ====== making target debian/stamp/install/linux-image-2.6.33-rc1-amd64 [new prereqs: ]======
| This is kernel package version 12.031.
| echo "The UTS Release version in include/linux/version.h"; echo " \"\" "; echo "does not match current version:"; echo " \"2.6.33-rc1-amd64\" "; echo "Please correct this."; exit 2
| The UTS Release version in include/linux/version.h
| ""
| does not match current version:
| "2.6.33-rc1-amd64"
| Please correct this.
| make[1]: *** [debian/stamp/install/linux-image-2.6.33-rc1-amd64] Error 2


The solution


Check this

By: Anonymous

Same here.... btw, did you run the patches? for me it said, patch not found. could that be the problem?

By: Vincent

I used a tip from

"modifying linux-2.6.x/scripts/mod/sumversion.c, and adding #include <limits.h>
fixes this issue"

By: nevelis

Shot, vincent :D that worked for me.

By: Anonymous

thanks for the concurrency tip :) 25% utilization was kinda sad to watch :D


(worked fine for me)

By: Morten

Good summary on how to compile the kernel on ubuntu.

 I sometimes try out the latest test kernel from, and after coping the systems current config file to .config I run

make oldconfig

That way I will be allowed to act on all new features of the newer kernel, something that is hidden to me when I run make menuconfig. After make oldconfig I can run make menuconfig as you describe.

By: KevinG

Its worked for me. Thank YOU

By: Anonymous

Hello, I'm almost new in Linux, but with the new kernel 2.6.35 available for my Ubuntu distro the old OSS is unchecked, and I need it for other applications. So, I must recompile a kernel with OSS API. I got the last kernel tarball downloaded (2.6.36). Following this HOWTO, I got this output when executing make-kpkg clean:

[email protected]:/usr/src/linux# make-kpkg clean
exec make kpkg_version=12.033 -f /usr/share/kernel-package/ruleset/ clean
====== making target minimal_clean [new prereqs: ]======
This is kernel package version 12.033.
test ! -f .config || cp -pf .config config.precious
test ! -e stamp-building || rm -f stamp-building
test ! -f Makefile || \
            make    ARCH=i386 distclean
make[1]: Entering directory `/usr/src/linux-headers-2.6.35-22-generic'
/usr/src/linux-headers-2.6.35-22-generic/ubuntu/aufs/Makefile:3: ubuntu/aufs/ No such file or directory
make[3]: *** No rule to make target `ubuntu/aufs/'.  Stop.
make[2]: *** [ubuntu/aufs] Error 2
make[1]: *** [_clean_ubuntu] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-22-generic'
make: *** [minimal_clean] Error 2

Why make is always returning to folder of, when I'm already  running another kernel downloaded from somewhere else? And while executing from "linux" directory? Any idea? Would be most thankful for it.

P.S. I'm having same problems when trying to compile something else...

By: tomba

you should add info about initial ram disks (update-initramfs -c -k 'custname')

because this procedure doesn't create it by it self o.O

By: sid

For example assume that I have installed 3.10.9 custom kernel now i would like to apply few patches and like to change it to 3.10.10.

How to achieve it ?