Build an RPi4 64bit Kernel on the RPi - sakaki-/gentoo-on-rpi-64bit GitHub Wiki
This is just a quick guide on building the same kernel sources used for gentoo-on-rpi-64bit
For the rpi4
For the rpi3
Downloading the kernel source from github
First we're going to download the source At the time of writing gentoo-on-rpi-64bit is using the official rpi sources 5.4 branch for the pi4
Now we could do a git clone and download the git repo, but that could take a while so as a shortcut lets just download the sources for the version we want instead.
- First lets go to https://github.com/raspberrypi/linux
- Next select the rpi-5.4.y from the list of branches on the left hand side
- Select Commits, and click on the specific commit as a marker for the date time of the source we want to use
At the time of writing the latest commit in use by bcm2711-kernel-bis is 3b41649ff96d but this appears to be an orphaned commit, for the 5.4 branch this appears to be https://github.com/raspberrypi/linux/commit/dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c with the same description
- Next click on Browse Files
- This will take you to somewhere like https://github.com/raspberrypi/linux/tree/dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c
- Select Clone or Download
- Right click on the Download Zip Url and copy that to the clipboard
Lets use that url we've copied
cd /usr/src
wget https://github.com/raspberrypi/linux/archive/dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c.zip
unzip dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c.zip
mv linux-dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c 5.4.47-v8-p4-bis-gbd1
rm dec0ddc506ab5d93a7de4b8a7c8dc98e0a96f85c.zip
For the version number 5.4.47 we can see what this is by looking at the top of the Makefile. The name of the directory can be anything you want In this case I'm making sure to use a version string different from the default one provided with gentoo-on-rpi-64bit. This copy won't include any of the git history so should be a lot quicker to download.
Patching Sources
There's a custom script within bcm2711-kernel-bis, we can use this to patch the sources Currently I don't think it does anything, although it looks like it can be set to pull in pull requests from github and patch them in.
cd /usr/src/5.4.47-v8-p4-bis-gbd1
wget https://raw.githubusercontent.com/sakaki-/bcm2711-kernel-bis/master/patch_kernel.sh
chmod +x patch_kernel.sh
./patch_kernel.sh
Configuring Source
There is a script called conform_config.sh we could use to alter the default rpi config although instead I'm just going to use the kernel config from the bcm2711-kernel-bis repo
# Assume we're already inside the linux source directory
wget https://raw.githubusercontent.com/sakaki-/bcm2711-kernel-bis/master/config
mv config .config
At this point you can change any setting you want. typically I use
make menuconfig
Setting the Config local version
Next one change that's good to make is to call the new kernel something different from the old one. This way the modules directory / kernel names won't clash and overwrite one another. In this case I'm going to try and get it to match the name of the directory. so edit the .config file and change the setting of CONFIG_LOCALVERSION
# from
-v8-3b41649ff96d-p4-bis
# to something different
-v8-p4-bis-gbd1
Building / Installing the kernel
The rpi4 is quad core, so lets build everything Note there's no zImage for arm64
make -j4 Image modules dtbs
Lets install the kernel and modules
make modules_install
cp arch/arm64/boot/Image /boot/kernel-5.4.47-v8-p4-bis-gbd1.img
Switch over the kernel
To switch across to the new kernel Edit /boot/config.txt and switch across the kernel option to point to the new file
kernel=kernel-5.4.47-v8-p4-bis-gbd1.img
Finally reboot and check which kernel is in use
uname -r
Creating an initrams with dracut
I've found dracut to be a little easier to use than genkernel for generating a initramfs file
# install dracut
emerge dracut
# lets enable gzip compression
# add the following to a file such as /etc/dracut.conf.d/user
compress="gzip"
# run dracut
dracut
At this point we should have a file within our /boot directory something like /boot/initramfs-5.4.47-v8-p4-bis-gbd1.img By default gzip compression will be used inside the cpio image
Lets add that to the config.txt file
initramfs initramfs-5.4.47-v8-p4-bis-gbd1.img followkernel
One of the advantages to an initramfs image is an emergency shell that can be used in the event something goes wrong. Although it may be easier to just switch to the OS on the SD card in the event this happens.
Note to run dracut and overwrite an existing initramfs file already present
dracut --force
To generate an initramfs for a kernel version which is not currently running (one you may have just built)
dracut --kver 5.4.65-v8-p4-bis