As Ubuntu 11.10 was released it’s time for another article in my “How to compile a kernel for Ubuntu …” series. This article will show you how to get the latest kernel from the Ubuntu kernel maintainers for Ubuntu 11.10 and create a kernel which you can modify to make it more suited for your computer.
Introduction
git
I’ll be using git to get the latest kernel version. This is my favorite way to get the sources and it is in my opinion the fastest way to make changes later on when you want to update your own kernel to the latest version.
I suggest adding my Launchpad repository to your system. The repository holds the latest version of git and is usually updated within a day of a new release of git, follow the instructions on the page Git Packages for Ubuntu to add my repository.
Architecture
I am compiling the amd64 which basically is the version used for all 64 bit versions, if you want to compile for i386 you need replace amd64 for i386 throughout this article.
Flavor
I choose the name i7 as the flavor name as I’ll be building a kernel geared towards my laptop which has a i7 processor. Besides the change of processor type in the configuration I also have some other changes but that’s beyond this article.
Preparations
Let’s get started by preparing our machine for compiling the Ubuntu 11.10 kernel.
Open a terminal.
sudo su - apt-get install fakeroot build-essential apt-get install crash kexec-tools makedumpfile kernel-wedge apt-get build-dep linux-image-$(uname -r) apt-get install git libncurses5 libncurses5-dev libnewt-dev exit
Create a directory where you would like to build your kernel, this directory will hold the kernel source in a sub directory and all the deb files will end up in this folder. I choose /d1/development/kernel/ubuntu/oneiric
Getting the source
cd /d1/development/kernel/ubuntu/oneiric git clone git://kernel.ubuntu.com/ubuntu/ubuntu-oneiric.git source cd source
The source code of the kernel is installed in the directory source.
Creating a branch
We will create a branch in which we will be doing our modifications. That way the master branch will stay in tact which will make it a whole lot easier when we want to update our own custom build Ubuntu 11.10 kernel to a newer version.
To see all the available kernels available type the following command:
git tag|grep Ubu|sort -V
The Ubuntu kernel developers tag each version as Ubuntu-
git checkout Ubuntu-3.0.0-13.21 -b i7
This will create a branch called i7.
Don’t select kernels like Ubuntu-3.0.0-1200.1, where the number after the second dash is in the thousands. These are specialized kernels and they may not work on your specific machine.
Creating a new config
I’ll be using the method of creating a new flavor, this adds a bit more work but this way you can always compile the original kernels.
We’ll use the generic flavor as the base for our own flavor being i7, as discovered by one of the readers of this blog, this extension needs to be in small caps.
cp debian.master/config/amd64/config.flavour.generic debian.master/config/amd64/config.flavour.i7 fakeroot debian/rules clean debian/rules updateconfigs
To make changes to the configuration file we need to edit the configuration file. The kernel developers have created a script to edit kernel configurations which has to be called through the debian/rules makefile, unfortunately you will have to go through all the flavors for this script to work properly.
debian/rules editconfigsThe script will ask you if you want to edit the particular configuration. You should not make changes to any of the configurations until you see the i7 configuration
Do you want to edit config: amd64/config.flavour.i7? [Y/n]
Make your changes, save the configuration and then keep going until the script ends.
When you’re done, make a backup of the config flavor file.
cp debian.master/config/amd64/config.flavour.i7 ../.
Now we need to clean up the git tree in order to get ready for compilation.
git reset --hard git clean -df
Getting ready for compilation
Because we are going to be creating a new flavor based on a existing flavor (generic in my case) we need to create some extra files. During compilation the process checks the previous release for some settings, as we’re creating a local flavor it doesn’t exist in the source, so we’re creating it.
To see the previous release we use:
ls debian.master/abi
The previous release in this case is 3.0.0-12.20
cp debian.master/abi/3.0.0-12.20/amd64/generic debian.master/abi/3.0.0-12.20/amd64/i7 cp debian.master/abi/3.0.0-12.20/amd64/generic.modules debian.master/abi/3.0.0-12.20/amd64/i7.modules
Copy our flavored configuration file back.
cp ../config.flavour.i7 debian.master/config/amd64/
We need to edit some files:
File: debian.master/etc/getabis
Search for the line:
getall amd64 generic server virtual
Change it in:
getall amd64 generic server virtual i7
File: debian.master/rules.d/amd64.mk
Search for the line:
flavours = generic server virtual
Change it in:
flavours = generic server virtual i7
File: debian.master/control.d/vars.i7
This files does not exist and in order to make the compilation process aware of our own flavor we want to compile we need to create it.
cp debian.master/control.d/vars.generic debian.master/control.d/vars.i7
You can edit the file and make it your own.
arch="i386 amd64" supported="i7 Processor" target="Geared toward i7 desktop systems." desc="x86/x86_64" bootloader="grub-pc | grub-efi-amd64 | grub-efi-ia32 | grub | lilo (>= 19.1)" provides="kvm-api-4, redhat-cluster-modules, ivtv-modules, ndiswrapper-modules-1.9"
We need to commit our changes in the git repository.
git add . git commit -a -m "i7 Modifications"
The text after -m is the message you add to your commit.
Compilation
It’s finally time for compiling, to keep our newly created branch in pristine condition we will do the compilation in a separate branch. We keep our branch clean as this will help later on when we want to update our new branch to a newer kernel.
git checkout -b work fakeroot debian/rules clean
All the packages will be created in the directory /d1/development/kernel/ubuntu/oneiric
Create independent packages:
skipabi=true skipmodule=true fakeroot debian/rules binary-indep
The above statement will create the following deb files:
linux-doc_3.0.0-13.21_all.deb linux-headers-3.0.0-13_3.0.0-13.21_all.deb linux-source-3.0.0_3.0.0-13.21_all.deb linux-tools-common_3.0.0-13.21_all.deb
Create the tools package:
skipabi=true skipmodule=true fakeroot debian/rules binary-perarch
The above statement will create the following deb file:
linux-tools-3.0.0-13_3.0.0-13.21_amd64.deb
Create the flavour depended files:
skipabi=true skipmodule=true fakeroot debian/rules binary-i7
The above statement will create the following deb files:
linux-headers-3.0.0-13-i7_3.0.0-13.21_amd64.deb linux-image-3.0.0-13-i7_3.0.0-13.21_amd64.deb
Installation
After the compilation is finished we’ll have the above packages in the parent directory.
To install the files
cd .. sudo dpkg -i linux-headers-3.0.0-13-i7_3.0.0-13.21_amd64.deb linux-headers-3.0.0-13_3.0.0-13.21_all.deb linux-image-3.0.0-13-i7_3.0.0-13.21_amd64.deb
Check your bootloader if the newly installed Ubuntu 11.10 kernel is the default one, for grub check the file /boot/grub/menu.lst or if you run grub2 check /boot/grub/grub.cfg
Reboot and enjoy your newly installed Ubuntu 11.10 kernel.

When I get to this step:
skipabi=true skipmodule=true fakeroot debian/rules binary-i7
I get:
make: *** No rule to make target `binary-i7′. Stop.
I followed this pretty much verbatim…
I have tried this over and over, and am still running into this exact same problem. Everything builds fine, but it just says “No rule to make target `binary-i7′. I have tried many times in excruciating detail to make sure I wasn’t mistyping anything. It does throw continuous warnings saying python-config isn’t available, but it just says it will build without python-support. Could that be a problem?
I am building on a fresh install of oneiric directly from Ubuntu. Thanks!
Sounds like a typo or missed step:
Check the files: debian.master/etc/getabis and debian.master/rules.d/amd64.mk
Check you copied the file debian.master/control.d/vars.i7
I tried to compile for an i386 machine with adaptions to your guide
On the step “# skipabi=true skipmodule=true fakeroot debian/rules binary-i7″
I get the following error messages
check-config: FAIL: value CONFIG_LSM_MMAP_MIN_ADDR 0
check-config: FAIL: value CONFIG_SECURITY y
check-config: FAIL: value CONFIG_SECURITY_SELINUX y
check-config: FAIL: value CONFIG_SECURITY_SMACK y
check-config: FAIL: value CONFIG_SECURITY_YAMA y
check-config: FAIL: value CONFIG_DEFAULT_SECURITY_APPARMOR y
check-config: FAIL: !exists CONFIG_SECCOMP | value CONFIG_SECCOMP y
check-config: FAIL: !exists CONFIG_HAVE_SECCOMP_FILTER | value CONFIG_SECCOMP_FILTER y
check-config: FAIL: !exists CONFIG_CC_STACKPROTECTOR | value CONFIG_CC_STACKPROTECTOR y
check-config: FAIL: ( ( arch armel | arch armhf ) & value CONFIG_DEFAULT_MMAP_MIN_ADDR 32768 ) | ( value CONFIG_DEFAULT_MMAP_MIN_ADDR 65536)
check-config: FAIL: value CONFIG_TMPFS_POSIX_ACL y
check-config: FAIL: value CONFIG_BLK_DEV_DM y
check-config: FAIL: value CONFIG_INIT_PASS_ALL_PARAMS y
check-config: FAIL: value CONFIG_IMA n
check-config: FAIL: value CONFIG_IPV6 y
check-config: FAIL: value CONFIG_ECRYPT_FS y
check-config: 21/37 checks passed — exit 1
make: *** [config-prepare-check-ebx] Error 1
Any idea how to correct?
It seems your kernel configuration has some conflicts. Did you change the configuration?
“”"I followed this pretty much verbatim”"”
Same here, and I get the same error
When I followed this HOWTO and got stuck on this step (where ‘i7′ had been replaced by my own flavor name):
#skipabi=true skipmodule=true fakeroot debian/rules binary-i7
And I got the same error output on this page: http://ubuntuforums.org/showthread.php?t=1468299
Before that output, I found:
run-parts -v debian/tests
run-parts: executing debian/tests/README
run-parts: failed to exec debian/tests/README: Exec format error
run-parts: debian/tests/README exited with return code 1
run-parts: executing debian/tests/check-aliases
So I ‘rm’ed debian/tests/README, then everything is OK.
May it helps.
What were the permission for README in that directory? It sounds like the file was set for executable.
Yes, it’s executable.
-rwxrwxrwx 1 root root 1134 2011-11-12 12:06 README*
I didn’t set the permission manually, it must be a bug.
First you pulled the repository as root, not a good thing to do, you really should do that as a normal user.
When you pull a repository with git the file permissions are set as well by git. I have a a feeling all file rights are set to 777 in the entire repository. Not sure how it happened though.
Your reply leads me to notice the permissions of the other files. They are all set to root/777, including files outside the repository.
I am using a wubi-installed Ubuntu, is that cause the problem?
Thank you.
I never used the wubi-installed version, But I’m pretty sure that might be the cause of the wrong rights. As it’s running on a Windows box and Linux and Windows rights don;t really go hand-in-hand they might have opted to set the right to 777 for the wubi-installation.
for “””I followed this pretty much verbatim””” guys,
are you sure you replaced “i386″ with “amd64″ in your i386 based PCs??
“small caps”? Do you mean “lowercase”?
Yup lowercase.
Nice tutorial!! However..
It is not very wise to work as an admin when you compile your source code!! Use sudo instead.
You are right and that’s why you exit the root shell after the preparations.
Thanks a lot for this. Very easy to follow – I actually used this page with along with the one for Natty to compile a 3.2 kernel for my Ubuntu Studio 11.04 install. Just substituted ‘precise’ in place of ‘oneiric’ in the section ‘getting the source’.
Thank you.
I actually posted an article for this as well : http://blog.avirtualhome.com/2012/01/13/compile-linux-kernel-3-2-for-ubuntu-11-10/
A tips to make the compile process go faster :
just before running compilation, type the following command line :
export CONCURRENCY_LEVEL=n
Where “n” can be from 2 to 8
For instance “2″ for a core2 and “8″ for i7
This should already be build in the scripts provided by Canonical.
indeed, but that way you can fix it better for your machine (default would be 4 or 6 for i7 though 8 can still enhance speed, for instance
)
Really nice,
very cool sharing.