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

Do you like HowtoForge? Please consider to support us by becoming a subscriber.
Submitted by falko (Contact Author) (Forums) on Sun, 2006-11-05 16:04. ::

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-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (which contains the actual kernel) and linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (which contains files needed if you want to compile additional kernel modules later on). I install them like this:

dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb

(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 2.6.18.1-custom
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd          /boot/initrd.img-2.6.18.1-custom
savedefault
boot

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

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

2.6.18.1-custom

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.

 

8 Links


Please do not use the comment function to ask for help! If you need help, please use our forum.
Comments will be published after administrator approval.
Submitted by Morten (not registered) on Sun, 2009-03-01 23:40.

Good summary on how to compile the kernel on ubuntu.

 I sometimes try out the latest test kernel from kernel.org, 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.

Submitted by B3RG3R'NICOLAS (not registered) on Sat, 2008-12-06 18:17.
(worked fine for me)
Submitted by interurban (registered user) on Mon, 2006-11-06 03:59.

You can also get root access by invoking:

sudo -s  

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

 

Submitted by sgla1 (registered user) on Mon, 2007-03-05 07:04.

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:


 foo@foobar:~$ fakeroot make-kpkg --initrd --append-to-version=-custom \
> kernel_image \
> kernel_headers

Submitted by us1111 (registered user) on Fri, 2008-04-04 11:24.
And with make-kpkg, just set CONCURRENCY_LEVEL=X just before starting compilation to use multiple cores...
Submitted by Anonymous (not registered) on Fri, 2009-04-17 14:32.
thanks for the concurrency tip :) 25% utilization was kinda sad to watch :D
Submitted by Anonymous (not registered) on Thu, 2008-12-04 21:27.

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?