How to Compile an Ubuntu 8.10 Kernel
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.
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.
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.
many thanks for your good how-to! 🙂
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
the ln -s linux-source-2.6.27 linux created a broken link…
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.
This tutorial doesn’t show anything but how to download and decompress linux kernels. LOL.
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.
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
use the two files that end on Custom_i386.deb
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
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?
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.
Excellent how-to! Thanks a lot dude!
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?
Great how-to! Easiest one to follow for 8.10 kernel builds yet.
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.
What user are you when you do this, a regular user cannot write to the /boot directory.
I used sudo so it was root.
What is the disk space on your /boot directory.
df
That should show you.
My /boot in on the same partition as / which has gigs and gigs free… it’s not a freespace issue.
thanks 4 the nice article
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
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
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.
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
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
For Debian systems the best way to go is by using Kernelcheck
http://kcheck.sourceforge.net/
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.
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.
(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
Got the same error as Babu above (March 18)
ALERT! /dev/disk/by-uuid/BA046C9D046C5E7F does not exist. Dropping to a shell!
Please help if you can.
I am continually searching online for articles that can facilitate me. Thank you!