Overview
The BeagleBone Black (BBB) uses an ARM Cortex-A8 32 bit processor, so the kernel must be cross-compiled on an x86 machine and then deployed to the board. This blog will assume that you already have a os[debian/ubuntu] installed on your sd card.
We’ll:
- set up toolchain
- fetch kernel source
- configure for BBB
- build kernel + modules
- deploy to SD card / board
1. Prerequisites
Make sure you have:
- Ubuntu (or any Linux host)
- Cross compiler for ARM (arm)
Install required tools:
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf build-essential bc bison flex libssl-dev u-boot-tools
2. Get Linux Kernel Source
You can use mainline or TI’s kernel. For stability on BBB, We will use beagleboard/linux Kernel, since it already includes the board-specific patches and fixes.
git clone https://github.com/beagleboard/linux.git
cd linux
mkdir build
Checkout a stable branch: git checkout 6.6.20-ti-arm64-r3
Note: Choose the kernel repository based on your board’s processor architecture. Since the BeagleBone Black uses a 32-bit ARM processor, we’ll use the corresponding ARM (armhf) kernel.
3. Set Cross Compilation Environment
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
4. Configure the default Board’s config file
make bb.org_defconfig
Optional: Customize configuration: make menuconfig
5. Build the Kernel
make O=build LOADADDR=0x82000000 -j$(nproc) | tee build.txt
We use LOADADDR=0x82000000, the load address expected by U-Boot on the BeagleBone Black, so the kernel boots correctly.
This will Build the zImage, modules, and device tree blobs:
6. Connect the sd card with host machine.
check whether it mounted or not. lsblk sda 8:0 1 29.7G 0 disk ├─sda1 8:1 1 36M 0 part /run/media/ankit/BOOT ├─sda2 8:2 1 512M 0 part └─sda3 8:3 1 29.2G 0 part
In our case sda3 has rootfs partition, mount it.
sudo mkdir -p /mnt/rootfs
sudo mount /dev/sda3 /mnt/rootfs
7. Install Modules
make O=build INSTALL_MOD_PATH=/mnt/rootfs/ -j$(nproc)
➜ $ ls /mnt/rootfs/lib/modules/6.6.6
build modules.dep modules.weakdep
config modules.dep.bin source
kernel modules.devname symvers.xz
modules.alias modules.drm System.map
modules.alias.bin modules.modesetting systemtap
modules.block modules.networking updates
modules.builtin modules.order vdso
modules.builtin.alias.bin modules.softdep vmlinuz
modules.builtin.bin modules.symbols weak-updates
modules.builtin.modinfo modules.symbols.bin
Note: build is symlink that points to build directory of kernel source. copy that build/ dir inside it. If you want to compile module on BBB itself or maybe keep this as backup.
cd /mnt/rootfs/lib/modules/6.6.6
rm build # dont add the /, it can delete the files in build/ dir.
mkdir -p build
sudo cp -r linux-src/build .
8. Copy the zImage and dtb blob files
Get the Kernel release Version
# make O=build/ kernelrelease
make[1]: Entering directory '~/linux-src/build'
6.6.20
make[1]: Leaving directory '~/linux-src/build'
Use this kernel Build verison while copying the zImage file.
Copy the zImage file
cd linux-src/build/arch/arm/boot/
sudo cp zImage /mnt/rootfs/boot/vmlinuz-6.6.20
Copy the dts file
sudo mkdir -p /mnt/rootfs/boot/dtbs/6.6.20/
cd linux-src/build/arch/arm/boot/dts/ti/omap/
sudo cp * /mnt/rootfs/boot/dtbs/6.6.20/
9. Build the Initramfs File
Boot the BBB
Install dracut
sudo apt install dracut
sudo dracut -v -f --kver 6.6.20 /boot/initrd.img-6.6.20
this cmd will build Initramfs inside /boot.
10. Update /boot/uEnv.txt file
diff --git a/uEnv.txt b/uEnv.txt
index b79d3c4..b88f904 100644
--- a/uEnv.txt
+++ b/uEnv.txt
@@ -1,6 +1,6 @@
#Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0
-uname_r=6.19.11-bone14
+uname_r=6.6.20
#uuid=
#dtb=
11. Reboot the BBB
$ sudo reboot
$ uname -r
6.6.20
$ echo Voilà
Voilà