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 learning more about Linux.
In this case, we are going to compile a newly released kernel on Debian systems that includes several new features, such as new drivers for the graphics cards, and offers significant improvements to the filesystem.
How to Compile Kernel in Debian
To get started, we are going to need some packages, namely build-essential and kernel headers.
sudo apt update sudo apt install build-essential linux-headers-$(uname -r)
Now, visit the official kernel website to download the desired kernel version. Alternatively, you can use the following commands to download the source directly.
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.7.tar.xz tar -xvf linux-6.7.tar.xz cd linux-6.7/
Now, we will need to configure the kernel, it is advisable to begin with the configuration currently in use and build upon it. To accomplish this, we’ll copy the existing 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 process, 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
, but it will need the libncurses5-dev package installed to use it.
If you are going with a cli environment, make sure to install the libncurses5-dev package to start the kernel configuration process as shown.
apt install libncurses5-dev make menuconfig
As you will see, once you are in the configuration of your choice, 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, which 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.
Now initiate the kernel compilation process using the following commands, which will compile the kernel, install modules, and copy the necessary files to the boot directory.
make make modules_install make install
Once installed, you simply reboot, and select the new kernel from your GRUB menu.
Be sure to pay close attention to any error messages during the boot process so you can troubleshoot any issues.
To check the new kernel version in Debian, you can use the following command in the terminal.
uname -r
If you want to see a list of installed kernels, you can check the contents of the /boot directory:
ls /boot
Remove Old Kernel in Debian
To remove old kernels in Debian, first you need to list the installed kernels to identify the ones you want to remove using the dpkg command.
dpkg --list | grep linux-image
To remove an old kernel, use the following apt command and make sure to replace linux-image-OLD_VERSION with the version number of the kernel you want to remove.
sudo apt purge linux-image-OLD_VERSION
After removing the old kernels, update GRUB to reflect the changes.
update-grub
In conclusion, compiling a kernel in Debian is a valuable skill that allows users to tailor their operating system to specific needs, incorporating the latest features and optimizations.
try “ls /boot/”
there’re one or more config files.
Copying previous config into new kernel build directory for your convenience.
please!! describe “cp /boot/config-`uname -r` .config”
Thank you! I installed kernel 3.12.18 and is working perfectly. Again, thank you!
Its working, i now have linux-3.14 installed in my system. Thanks.
Working fine for me, good post, thx
it work for me,: cp /boot/config-3.2.0-4-amd64 ./.config
make-kpkg has been deprecated for years. Linux includes a debian package target in their stock makefile since 2.6.3x at least. Everything up to that point is fine, but tell your readers to ‘make deb-pkg’ instead. That also makes the concurrency easier since it’s just make, and it takes standard make options like -j.
for more information: http://kernel-handbook.alioth.debian.org/
The error with command “# cp /boot/config-`uname –r`.config” is in “-r” part. Delete the “-” before the “r” and write it again. You will see the diference.
Thanks!
I found your guide ~2 months ago and it was the trigger for me to build my first kernel, since it looked so easy. Before, I refrained from trying it simply because I was afraid I could not use apt to manage my homebrew kernel mess. ;-)
I keep my kernel updated this way ever since, using a simple scriptified version of your guide:
https://gist.github.com/VolMi/8594823
So, thank you alot!
Michael
`/boot/config-uname -r*.config’ is not working
you have latest working config copy to the sources like this:
cp /boot/config-3.blabala /your/linux/sources/folder .config
Thank you for this guide!
it´s very helpfull and save a lot of nerves ;)
btw: if you have trouble with error timestamp errorcode 2
apt-get install bc
;)
Norman
Thanks a million for this guide. Clear, concise, easy to understand. After browsing thorugh “Devian handbooks” and whatnot, I finally managed to compile my custom Kernel after reading this!
hello.
i wanted to install libraries using apt-get install command but its showing command not found. could just tell me which software package to be downloaded…
Can you post the output error here..so we could trace out why such command not found error you getting.
Great article,
Easy to follow.
Rob Krul, You said you would write a how to with the Nvidia driver.
I cannot seem to find it?
I get the following message.
root@debian:/home/bill# cd linux-3.12
root@debian:/home/bill/linux-3.12# cp /boot/config-‘uname -r’*.config
cp: missing destination file operand after `/boot/config-uname -r*.config’
Try `cp –help’ for more information.
root@debian:/home/bill/linux-3.12#
Can you help?
Bill
Hi
I am getting errors when install debs. Any recommendations?
Error! Bad return status for module build on kernel: 3.12.2-customkernel (i686)
Thanks, great article.
My first kernel compilation was on 1999…. (on a RedHat 6.0..a lot on time since that days), but the process and some concepts behind has not changed too much.
I’m a Debian user since 2001 and currently using a custom (and optimized) kernel 3.11 for an Asus A45VJ.
thanks again and greetings from Chile.
hi!
I’ve run the make menuconfig but get an error:
HOSTCC scripts/basic/fixdep
/bin/sh: 1: scripts/basic/fixdep: Permission denied
make[1]: *** [scripts/basic/fixdep] error 126
make: *** [scripts_basic] error 2
I am running with ‘su’ command and in the /dev/shm directory
Thanks a lot!
Try
# chown -R user:group /path
and log in “user”.
Hi!
Thanks for the guide, it’s great, but i have a question.
I use LMDE with 3.10 kernel and it’s not works perfectly. Sometimes couldn’t boot. So if I compile the 3.12 kernel I should copy the previous config from the /boot or I configure it with the menuconfig?
@Lars
The Nvidia driver itself is not included with the kernel source. You have to get the driver from Nvidia and install it. I’m going to write a how to for this tonight, and it should be published tomorrow or the next day.
The article was a little unclear with this. It was supposed to read “support for Nvidia Optimus” but I forgot to add “support”. I will let the editor know.
The new kernel allows you to run the Optimus driver natively, without having to rely on Bumblebee for added functionality. With the new kernel, you have access to things like GPU switching and so forth.
Sorry if I created any confusion.
Thanks for the neat guide!
I think there is a typo in the line “cp /boot/config-`uname -r` .config”.
Doesn’t that have to be “cp /boot/config-`uname -r`* .config” instead?
Anyway, many thanks for putting it together and publishing.
cheers,
Chris
Thanks that was typo corrected now..
I get the following message. Can you help?
root@debian:/home/bill# cp /boot/config-`uname -r`*.config
cp: missing destination file operand after `/boot/config-3.2.0-4-amd64*.config’
Try `cp –help’ for more information.
cp /boot/config-`uname –r`.config
Error: miss operand
you need a space between the * and the .
you’re copying from “/boot/config-`uname -r`*” to destination file “.config”
cp -vi /boot/config-`uname -r` .config
Could you complite this nice guide with:
How to compile/ path with the latest stable nvidia driver ?
That would bee great