One of the biggest draws to using Linux is its easy customization and one of the most fun things to customize is the Kernel itself, the heart of the Linux Operating System. Chances are that you will most likely never have to compile your own kernel. The one that ships with your distribution and updates via your package management system is usually good enough, but there are times when it might be necessary to recompile the kernel.
Some of these reasons might be special hardware needs, the desire to create a monolithic kernel instead of a modularized one, optimizing the kernel by removing useless drivers, running a development kernel, or simply to learn more about Linux. In this case, we are going to compile a newly released Kernel 3.12, on Debian Wheezy. The newly released Kernel 3.12 has several new features, including some new drivers for the NVIDIA Optimus, and the Radeon Kernel Graphics Driver. It also offers huge improvements to the EXT4 filesystem, and some updates to XFS and Btrfs.
How to Compile and Install Kernel 3.12 in Debian
To get started, we are going to need some packages, namely fakeroot and kernel-package:
# apt-get install fakeroot kernel-package
Now, lets grab a latest source tarball from www.kernel.org or you may use following wget command to download it.
# wget -c https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.tar.xz
Now, let’s unpack the archive.
# tar -xvJf linux-3.12.tar.xz
After, extracting, a new kernel source directory will be created.
# cd linux-3.12
Now, we will want to configure the kernel. It is best to start with a configuration that you are currently using and work from there. To do this, we will copy the current configuration from the /boot directory to the current working directory and save it as .config.
# cp /boot/config-`uname –r`.config
To start with the actual configuration, you have one of two options. If you have X11 installed, you can run make xconfig, and have a nice GUI menu to assist you as you configure your Kernel. If you are running in a CLI environment, you can run make menuconfig. You will need the libncurses5-dev package installed to use menuconfig:
# apt-get install libncurses5-dev # make menuconfig
As you will see, once you are in the configuration of your choice, that there are a ton of different options available for your Kernel. In fact, there are far too many for the scope of this tutorial. When selecting Kernel options, the best way is by trial and error, and doing plenty of Googling. It is the best way to learn. If you are simply just trying to update your Kernel to the most recent version, you don’t have to change anything and can simply select “Save Configuration”. Since we copied the current kernel’s configuration file to the new kernel’s .config file.
Be mindful that “Kernel module loader” is selected in “Loadable module support”. If it is not, and you are using kernel modules, it can seriously mess things up.
Once that is straight, it is time to clean the source tree.
# make-kpkg clean
Finally, it’s time to build the kernel package.
# export CONCURRENCY_LEVEL=3 # fakeroot make-kpkg --append-to-version "-customkernel" --revision "1" --initrd kernel_image kernel_headers
As you will see above, we have exported a variable called CONCURRENCY_LEVEL. A general rule of thumb with this variable is to set it as the number of cores your computer has + 1. So, if you are using a quad core, you would:
# export CONCURRENCY_LEVEL=5
This will greatly speed up your compilation time. The rest of the compilation command is pretty self-explanatory. With fakeroot, we are making kernel packages (make-kpkg), appending a string to name our kernel (“customkernel”), giving it a revision number (“1”) and we are telling make-kpkg to build both an image package and a header package. Once the compilation is finished, and depending on your machine, and number of modules you are compiling, it can take quite a long time, change directories to one back from the Linux source directory, and you should see two new *.deb files – one linux-image file and one linux-headers file:
You can now install these file like you would install any *.deb file with dpkg command.
# dpkg -i linux-image-3.12.0-customkernel_1_i386.deb linux-headers-3.12.0-customkernel_1_i386.deb
The new kernel, since it is a Debian package, will update everything you need, including the bootloader. Once installed, you simply reboot, and select the new kernel from your GRUB/LiLO menu.
Be sure to pay close attention to any error messages during the boot process so you can troubleshoot any issues. If, for whatever reason, your system doesn’t boot, you can always fall back to your last working Kernel and try again. The non-functional Kernel can always be removed with apt command.
# sudo apt-get remove linux-image-(non-working-kernel)