Begin Linux Blog

Linux desktop and server news

How to Compile an Ubuntu 8.10 Kernel

Posted by beginlinux on December 3, 2008

Compile a 8.10 Kernel

The purpose of this tutorial is to show you how to set up a kernel that is highly tuned for your CPU, in this case a dual core Pentium for a workstation.

Caution: If you do something wrong..it happens…be sure to reboot and select an alternative kernel. You should always have several kernels in case of trouble.

Step #1: Download and install the necessary tools.
Download the necessary tools so that you have everything ready.

# apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

You must have the source available to create a new kernel.

# apt-get install linux-source

You must be in the /usr/src directory to work or copy the source,
linux-source-2.6.27.tar.bz2, to the directory you want to work in. Either move into the /usr/src directory to work or into the alternative directory you will make the build in.

# cd /usr/src

This directory will contain the necessary headers to build the kernel. These are the source files.

You need to unpack the source that was downloaded.

# bzip2 -d linux-source-2.6.27.tar.bz2
# tar xvf linux-source-2.6.27.tar

Now you should have a directory that looks like this:

linux-source-2. 6.27

Create a symbolic link to this source directory and name it linux.

# ln -s linux-source-2.6.27 linux

Move into the directory, you can use the term linux as it is now a link to that folder.

# cd linux

The config file is a hidden file that has the configuration from the kernel that is installed. You will need to copy that because it has already determined your hardware devices.

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

When you copy this config file over, it is a file represents the hardware that the kernel discovered at boot and set up. It also reflects many default settings.

Step #2: Now the fun begins….

You are ready to start menuconfig which will allow you to choose your kernel specifics.

make menuconfig

This opens the menu to start configuration.

Here you see it detected the .config file.

kern1

Now work your way through the menus and make the selections that you want to add or subtract. For example, here Reiserfs was originally a module that could be added, it had a “M” to indicate module that could be loaded. Bu it has been unchecked so modular support will not be available, thus saving space in your kernel. The “*” indicates that it will be loaded into the kernel and an empty option means that no support for that option will be placed in the kernel.

kern2

Once you have all of your modifications complete save the new .config file.

Run this command to clean up.

# make-kpkg clean

The next thing you want to do is create a kernel extension so that as you make kernels you are able to tell the versions apart. What I usually do is place my initials and a number so that I can keep track.

# fakeroot make-kpkg – -initrd – -append-to-version=-mw1 kernel_image kernel_headers

After –append-to-version= you write a string that will help you keep track of your kernel changes, it must begin with a minus (-) and must not contain whitespace.

This will take awhile.

After the successful kernel build, you can find two .deb packages in the directory you built the kernel in. If you were located in the linux directory, look in the directory above for the two .deb packages.

Now you can install and create .deb files so you can take your kernel to another machine with similar hardware. Run these commands as root in order to install them into the boot directory and modify your /boot/grub/menu.lst.

# dpkg -i linux-image-2.6.27.2-mw1_2.6.27.2-mw1-10.00.Custom_i386.deb

# dpkg -i linux-headers-2.6.27.2-mw1_2.6.27.2-mw1-10.00.Custom_i386.deb

You should now be able to select and test the new kernel when you reboot.

Now when I look in /boot/grub/menu.lst I see listed my new kernel:

## ## End Default Options ##

title Ubuntu 8.10, kernel 2.6.27.2-mw1
uuid 9c297074-83fe-41d2-b0d5-9e2e043028e5
kernel /vmlinuz-2.6.27.2-mw1 root=UUID=b1c96812-724b-407d-a8b4-9aad3628540e ro quiet splash crashkernel=384M-2G:64M@16M,2G-:128M@16M
initrd /initrd.img-2.6.27.2-mw1
quiet

title Ubuntu 8.10, kernel 2.6.27.2-mw1 (recovery mode)
uuid 9c297074-83fe-41d2-b0d5-9e2e043028e5
kernel /vmlinuz-2.6.27.2-mw1 root=UUID=b1c96812-724b-407d-a8b4-9aad3628540e ro crashkernel=384M-2G:64M@16M,2G-:128M@16M single
initrd /initrd.img-2.6.27.2-mw1

title Ubuntu 8.10, kernel 2.6.27-7-generic
uuid 9c297074-83fe-41d2-b0d5-9e2e043028e5
kernel /vmlinuz-2.6.27-7-generic root=UUID=b1c96812-724b-407d-a8b4-9aad3628540e ro quiet splash crashkernel=384M-2G:64M@16M,2G-:128M@16M
initrd /initrd.img-2.6.27-7-generic
quiet

Caution: You will need space in the /boot directory to save kernels as you build them. I typically build my /boot directory with 500 MBs of space.

Tip:

Edit your timeout in the /boot/grub/menu.lst and increase it when you are building and trying kernels. That way it will not fly by so fast.

## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 8

Tip:
Comment out the hiddenmenu so that you will see the menu on boot. For more info check out our Building Linux Kernels online course.

30 Responses to “How to Compile an Ubuntu 8.10 Kernel”

  1. [...] Read more at Begin Linux Blog [...]

  2. Bobo said

    many thanks for your good how-to! :-)

  3. walter said

    that you for the post. however, how do i add modules? I can’t get ibex to recognize my wireless so I run it at the previous kernel which works fine. But due to the new way that wireless is used it bailed on my card (Proxim Gold). It looks like I need to specify some files to the kernel before it bakes it. Any suggestions or links appreciated. thanks

  4. Scott said

    the ln -s linux-source-2.6.27 linux created a broken link…

  5. Scott said

    Nevermind… My bad.

    Maybe you could mention that people should use “sudo” before they untar the file. It would REALLY help us new users who are looking to explore Linux in more detail.

  6. Scott said

    This tutorial doesn’t show anything but how to download and decompress linux kernels. LOL.

  7. beginlinux said

    If you are using apt-get and downloading the kernel from the repository, the command apt-get will do all of the decompressing of the kernel.

  8. disappearedng said

    Hey great tutorial man.

    I am just wondering, after compiling the kernel, what can I remove from my /usr/src?

    for example, I used disappearedng1 instead of mw1 and this is the output of ls under /usr/src

    [code]
    linux
    linux-headers-2.6.27.2-disappearedng1
    linux-headers-2.6.27.2-disappearedng1_2.6.27.2-disappearedng1-10.00.Custom_i386.deb
    linux-headers-2.6.27-7
    linux-headers-2.6.27-7-generic
    linux-headers-2.6.27-9
    linux-headers-2.6.27-9-generic
    linux-image-2.6.27.2-disappearedng1_2.6.27.2-disappearedng1-10.00.Custom_i386.deb
    linux-source-2.6.27
    linux-source-2.6.27.tar
    [/code]

  9. Corné said

    use the two files that end on Custom_i386.deb

  10. Corné said

    fakeroot make-kpkg – -initrd – -append-to-version=-mw1 kernel_image kernel_headers

    should be:

    fakeroot make-kpkg –initrd –append-to-version=-mw1 kernel_image kernel_headers

  11. Nina said

    Thank you for the great tutorial! I have ubuntu 8.04 Hardy Heron, and these instructions worked just as fine to get a bootable kernel. But my sound and wireless don’t work. :( I know that my system uses restricted drivers, so do I need to reinstall a new mad wifi?

  12. Nina said

    actually, I retrieved the source a little differently:

    # apt-get install linux-kernel-devel build-essential
    # apt-get build-dep linux-ubuntu-modules-$(uname -r)
    # apt-get source linux-image-$(uname -r)

    but the compile process (make menuconfig, make-kpkg, dpkg -i) were all the same.

  13. Raton said

    Excellent how-to! Thanks a lot dude!

  14. hooverdn said

    When I do this, the

    dpkg -i linux-xenu-2.6.27.10-dh1_2.6.27.10-dh1-10.00.Custom_amd64.deb

    prints a message:

    Please manually create an initrd image

    There is no initrd.img-2.6.27.10-dh1 in /boot (there is only a System.map and a vmlinuz for my build) and there is no entry in /boot/grub/menu.lst for my build.

    How do I create the initrd.img and the other files in /boot for my image?

    Should I just manually create the entry in /boot/grub/menu.lst once I have them?

  15. Shawn said

    Great how-to! Easiest one to follow for 8.10 kernel builds yet.

  16. confused said

    When I attempt to install a custom compiled kernel (2.6.28.X) from debs on my system, I get the following error:

    dpkg: error processing linux-image-2.6.28.7-em64t_1_amd64.deb (--install):
    trying to overwrite `/lib/firmware/atmsar11.fw', which is also in package linux-image-2.6.27.10-em64t
    dpkg-deb: subprocess paste killed by signal (Broken pipe)

    Here is the complete log:
    $ sudo dpkg -i linux-image-2.6.28.7-em64t_1_amd64.deb
    [sudo] password for squishy:
    (Reading database ... 144190 files and directories currently installed.)
    Unpacking linux-image-2.6.28.7-em64t (from linux-image-2.6.28.7-em64t_1_amd64.deb) ...
    Done.
    dpkg: error processing linux-image-2.6.28.7-em64t_1_amd64.deb (--install):
    trying to overwrite `/lib/firmware/atmsar11.fw', which is also in package linux-image-2.6.27.10-em64t
    dpkg-deb: subprocess paste killed by signal (Broken pipe)
    Running postrm hook script /sbin/update-grub.
    Searching for GRUB installation directory ... found: /boot/grub
    Searching for default file ... found: /boot/grub/default
    Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
    Searching for splash image ... none found, skipping ...
    Found kernel: /boot/vmlinuz-2.6.27.10-em64t
    Found kernel: /boot/vmlinuz-2.6.27-11-generic
    Found kernel: /boot/memtest86+.bin
    Updating /boot/grub/menu.lst ... done

    Errors were encountered while processing:
    linux-image-2.6.28.7-em64t_1_amd64.deb

    I know that I can remove my current functional linux-image through dpkg and then I can install the new one, but I’d like to keep both on the system.

  17. beginlinux said

    What user are you when you do this, a regular user cannot write to the /boot directory.

  18. confused said

    I used sudo so it was root.

  19. beginlinux said

    What is the disk space on your /boot directory.

    df

    That should show you.

  20. confused said

    My /boot in on the same partition as / which has gigs and gigs free… it’s not a freespace issue.

  21. thanks 4 the nice article

  22. Babu said

    HI,

    I tried as mentioned in this guide.

    I am running into the following issue when I reboot:
    Gave up waiting for root device. Common problems:
    – Boot args (at /proc/cmdline)
    – Check rootdelay = (did the system wait long enough?)
    – Check root = (did the system wait for the right device?)
    – Missing modules (cat /proc/modules; ls /dev)
    ALERT! /dev/disk/by-uuid/BA046C9D046C5E7F does not exist. Dropping to a shell!

    BusyBox v1.10.2 (Ubuntu 1:1.10.2-1ubuntu6) built-in shell(ash)

    Enter ‘help’ for a list of built-in commands
    (initramfs)

    Could you please let me know how to solve this ?

    Thanks,
    Babu

  23. lolwhites said

    I get as far as fakeroot make-kpkg – -initrd – -append-to-version=-mw1 kernel_image kernel_headers and get this message:

    Error: Unknown target –initrd Unknown target –append-to-version=-2.6.27-14-lw-20090320
    use –targets to display help on valid targets

    Please advise

  24. Willie said

    Thanks for the great howto. The only problem that I have is that on boot up it says “error: “kernel.maps_protect” is an unknown key”. It doesn’t seem to effect anything so I am just going to go with it.

  25. lcns said

    That’s a very good guide.

    I got some errors when building on AMD64 machine. The error saying can’t open files under arch/xen/

    I Added “–arch=x86_64″ and the error resolved.

    fakeroot make-kpkg –initrd –append-to-version=-mw1 kernel_image kernel_headers –arch=x86_64

  26. Chamsoo said

    Hello,

    Thank you for ur great tutorial.

    But….

    1. Downloading the kernel source code,uncompressing it, configuring the kernel, and building it should be done as a normal user on the machine.

    Only the two or three commands it takes to install a new kernel should be done as the superuser (root)

    2. Do not do any kernel development under the /usr/src/ directory tree at all, but only in a local user directory where nothing bad can happen to the system.

    exp.: mkdir ~/linux

    http://chams-blog.blogspot.com/2009/03/how-to-configure-linux-kernel.html

  27. G&T said

    For Debian systems the best way to go is by using Kernelcheck
    http://kcheck.sourceforge.net/

  28. Elliott said

    I have the same problem as “Hooverdn” above? I guess the –initrd option is supposed to create the initrd imagine. Don’t really understand it. Anyone, know how to fix this.

  29. Crankbait said

    You need to do exactly what it says “Please manually create an initrd image”
    In another words create a ramdisk for new kernel. “man mkinitrd”
    If mkinitrd command does not exist install “initrd-tools”
    Then edit /boot/grub/menu.lst and replace/add your new ramdisk and karnel.

  30. vnv srikanth said

    (1)For getting initrd image download initramfs-tools
    # sudo apt-get install initramfs-tools
    (2)give the following command for building the initrd image
    # update-initramfs -c –k 2.6.24.6 (version(2.6.24.6) is the directory name which appears
    in /lib/modules/ after installing modules)
    (3)initrd image will be generated /boot/ directory

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>