In the last few days I was trying to make some BPF scripts work and for that I tought I needed to upgrade my Debian to a new kernel. The original version is 4.9 with all the debian patches, and I’ve decided to go for the latest one available, which was 4.18.
$ apt-cache search linux-image
got me a lot of options, like these
... linux-image-amd64 - Linux for 64-bit PCs (meta-package) ... linux-image-4.9.0-7-686 - Linux 4.9 for older PCs linux-image-4.9.0-7-686-dbg - Debug symbols for linux-image-4.9.0-7-686 linux-image-4.9.0-7-686-pae - Linux 4.9 for modern PCs linux-image-4.9.0-7-686-pae-dbg - Debug symbols for linux-image-4.9.0-7-686-pae ... linux-image-4.18.0-0.bpo.1-686 - Linux 4.18 for older PCs linux-image-4.18.0-0.bpo.1-686-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-686 linux-image-4.18.0-0.bpo.1-686-pae - Linux 4.18 for modern PCs linux-image-4.18.0-0.bpo.1-686-pae-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-686-pae linux-image-4.18.0-0.bpo.1-amd64 - Linux 4.18 for 64-bit PCs linux-image-4.18.0-0.bpo.1-amd64-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-amd64 linux-image-4.18.0-0.bpo.1-cloud-amd64 - Linux 4.18 for x86-64 cloud linux-image-4.18.0-0.bpo.1-cloud-amd64-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-cloud-amd64 linux-image-4.18.0-0.bpo.1-rt-686-pae - Linux 4.18 for modern PCs, PREEMPT_RT linux-image-4.18.0-0.bpo.1-rt-686-pae-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-rt-686-pae linux-image-4.18.0-0.bpo.1-rt-amd64 - Linux 4.18 for 64-bit PCs, PREEMPT_RT linux-image-4.18.0-0.bpo.1-rt-amd64-dbg - Debug symbols for linux-image-4.18.0-0.bpo.1-rt-amd64 ...
I know my machine is amd64 (like most home computers) and I assumed bpo stanted for backport.
Ultimately i’ve fired this:
$ sudo apt-get install linux-image-4.18.0-0.bpo.1-amd64
But bcc (https://github.com/iovisor/bcc) didn’t like it, issuing this error:
chdir(/lib/modules/4.18.0-0.bpo.1-amd64/build): No such file or directory
So I’ve tried to install the headers in order to build the kernel modules but the linux-headers-4.18.0-0.bpo.1-amd64
package was complaining the the installed linux-compiler-gcc-6-x86
was not the correct one, with this message:
The following packages have unmet dependencies: linux-headers-4.18.0-0.bpo.1-all : Depends: linux-headers-4.18.0-0.bpo.1-all-amd64 (= 4.18.6-1~bpo9+1) but it is not going to be installed E: Unable to correct problems, you have held broken packages.
Nice, don’t you love when apt
tells you that you’ve held broken packages?
So, I’ve looked up and found out that I had 3 different versions available
$ apt-cache show linux-compiler-gcc-6-x86 | grep Version Version: 4.18.6-1~bpo9+1 Version: 4.9.130-2 Version: 4.9.110-3+deb9u6
And, of course, the one I had installed was for the 4.9 kernel
$ dpkg -l | grep linux-compiler-gcc-6-x86 ii linux-compiler-gcc-6-x86 4.9.130-2 amd64 Compiler for Linux on x86 (meta-package)
Installing the correct one was simple:
$ sudo apt-get install linux-compiler-gcc-6-x86=4.18.6-1~bpo9+1
Then installing the headers was just a matter of issuing the apt command
$ sudo apt install linux-headers-4.18.0-0.bpo.1-amd64
Afterwards, as I was trying to use some new BPF features, I needed the userland headers properly installed, and upgraded the linux-libc-dev package as well.
sudo apt-get install linux-libc-dev=4.18.6-1~bpo9+1
Update:
This guy’s post is way better:
http://jensd.be/818/linux/install-a-newer-kernel-in-debian-9-stretch-stable