Helen Koike
March 12, 2019
Reading time:
With just a few simple steps, you can compile and boot a Raspberry Pi using the Linux kernel mainline source code. Here's a quick tutorial on how to do just that.
This post uses Raspberry Pi model B rev2 as a base, however you can easily adapt it to your board.
Download any Raspbian image from https://www.raspberrypi.org/downloads/raspbian/
unzip 2018-11-13-raspbian-stretch-lite.zip # Check with lsblk what is the device path of your sdcard, using /dev/mmcblk0 just for this example sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/mmcblk0 bs=512M
Insert your SD card into the Raspberry Pi and turn it on. Raspbian will finish its installation.
Once the boot process is complete, turn it off and insert the SD card into your computer again.
sudo apt install gcc-arm-linux-gnueabihf
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git cd linux make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 zImage modules dtbs
# Mount the sdcard partitions mkdir -p ../rpi-boot mkdir -p ../rpi-rootfs sudo mount /dev/mmcblk0p1 ../rpi-boot sudo mount /dev/mmcblk0p2 ../rpi-rootfs # Install the modules to the rootfs sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../rpi-rootfs modules_install # Copy the kernel and the device tree files to the sdcard sudo cp arch/arm/boot/zImage ../rpi-boot sudo cp arch/arm/boot/dts/*.dtb ../rpi-boot # Inform to the firmware which kernel image and device tree to use # You might need to change the device tree according to you board model echo "kernel=zImage" >> ../rpi-boot/config.txt echo "device_tree=bcm2835-rpi-b-rev2.dtb" >> ../rpi-boot/config.txt # Unmount sudo umount ../rpi-boot sudo umount ../rpi-rootfs
That's it! Remove the SD card, plug it in your Raspberry Pi and boot!
Now, just put the previous commands in a bash script (just remember to remove the lines that modifies config.txt as this is only required once), and execute it whenever you want to re-build and re-install the kernel on your sdcard.
If you need to revert to the original kernel, you can always do so by inserting the SD card into your computer, mounting the boot partition and commenting the kernel and device_tree lines from your config.txt
# Uncomment these lines to boot custom kernel #kernel=zImage #device_tree=bcm2835-rpi-b-rev2.dtb
Happy hacking!
Visit Helen's blog.
08/10/2024
Having multiple developers work on pre-merge testing distributes the process and ensures that every contribution is rigorously tested before…
15/08/2024
After rigorous debugging, a new unit testing framework was added to the backend compiler for NVK. This is a walkthrough of the steps taken…
01/08/2024
We're reflecting on the steps taken as we continually seek to improve Linux kernel integration. This will include more detail about the…
27/06/2024
With each board running a mainline-first Linux software stack and tested in a CI loop with the LAVA test framework, the Farm showcased Collabora's…
26/06/2024
WirePlumber 0.5 arrived recently with many new and essential features including the Smart Filter Policy, enabling audio filters to automatically…
12/06/2024
Part 3 of the cmtp-responder series with a focus on USB gadgets explores several new elements including a unified build environment with…
Comments (5)
wb666greene:
Mar 14, 2019 at 03:29 PM
What is the point? What is wrong with the kernel that comes with Raspbian? How long does it take to compile? Took over five hours to compile openCV on my Pi2.
Reply to this comment
Reply to this comment
Helen Koike:
Mar 14, 2019 at 06:01 PM
There are several reasons someone may want to use mainline kernel:
* You want to contribute back to the community by fixing a bug, helping with testing and reporting the bugs you find, helping to develop a new feature or optimization.
* You need a feature that was recently added to the kernel but it is not in Raspbian kernel yet
* You want compile the kernel with some optimizations, or leave out some parts of the kernel that you don't use to make a smaller footprint.
Regarding the compilation time, it depends on your machine, I have an XPS15 (i7-6700HQ CPU @ 2.60GHz) and compiling with 8 threads (the -j8 option) took me 4 minutes:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
...
$ time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 zImage modules dtbs
...
real 3m6.684s
user 19m0.466s
sys 1m35.912s
Reply to this comment
Reply to this comment
Alex:
Dec 29, 2019 at 03:36 PM
I think you're missing the point of mainlining the kernel; yes, the kernel coming with raspbian works fine, but the goal is to get the latest features (there are rare programs that require specific kernel version), performance patches etc
Reply to this comment
Reply to this comment
chaitanya:
Oct 16, 2020 at 10:01 AM
I tried this procedure on raspberry pi, but the modules(USB, ETHERNET, WIFI, BLUETOOTH ) modules are not working.
Reply to this comment
Reply to this comment
Helen Koike:
Oct 16, 2020 at 07:18 PM
Hi chaitanya,
I'm sure there are several things that aren't well supported on mainline yet, I hope that this post would give a starting point for those who want to start contributing.
You can find all the drivers in the Raspbery Pi downstream kernel on github[1], and if you are interested in starting upstreaming those, it would be even better ;)
[1] https://github.com/raspberrypi/linux
Reply to this comment
Reply to this comment
Add a Comment