2 min read

Building the Raspberry Pi Kernel for eBPF (Beyla)

Building the Raspberry Pi Kernel for eBPF (Beyla)
Photo by Jainath Ponnala / Unsplash

So I wanted to run Beyla on my Raspberry Pi 5 which is part of my home lab. But the stock kernel that ships doesn't really have all the eBPF features required for Beyla, and it fails with the following error:

time=2024-11-15T16:03:32.999Z level=ERROR msg="couldn't trace process. Stopping process tracer" component=ebpf.ProcessTracer path=/usr/local/bin/cephcsi pid=2675 error="loading and assigning BPF objects: field UprobeServeHTTP: program uprobe_ServeHTTP: apply CO-RE relocations: load kernel spec: no BTF found for kernel version 6.6.51+rpt-rpi-2712: not supported"

This guide walks you through all the steps required to make Beyla work on the Pi.

Requirements

We need the kernel to have the following capabilities when being compiled:

CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_UPROBES=y
CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
# CONFIG_STATIC_KEYS_SELFTEST is not set
CONFIG_UPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
CONFIG_DEBUG_INFO_BTF=y

Building the kernel

We need to follow this excellent guide: https://www.raspberrypi.com/documentation/computers/linux_kernel.html

git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
export KERNEL=kernel_2712
make bcm2712_defconfig

This will generate the default .config file which we need to extend.

I like to use menuconfig to then configure it.

sudo apt install libncurses5-dev
make menuconfig

Step 1: Add a custom version to the kernel

In General setup > Local version - append to kernel release, set the local version name to: -v8-beyla-compatible. This will help us separate the kernel from the stock kernel later.

Step 2: Enable BTF

In Kernel Hacking > Compile-time checks and compiler options > Debug information (Disable debug information), select the following:

It will then enable the BTF option in Kernel Hacking > Compile-time checks and compiler options. Enable that:

Exit menuconfig to save the current state. For some reason, it blanks out in the next step if I don't exit it here.

Step 3: Enable Uprobes

Run make menuconfig again to enable Uprobes.

In Kernel hacking > Tracers, enable the Enable uprobes-based dynamic events option:

Step 4: Compile the kernel

Now you're all set to compile the kernel.

make -j6 Image.gz modules dtbs

Step 5: Install the kernel

sudo make -j6 modules_install

sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/

Finally, reboot by running sudo reboot. You should now have a kernel that can run Beyla.