がぶさんず Cafe

SBCとか、写真とかのこと。

Raspberry Piのカーネルビルドをまとめたやつの2021/5/24版

Raspberry Piシリーズのクロスコンパイルでのカーネルビルド

がぶさんちの覚書


1.最初に必要なやつら

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

2.ツールチェイン

32bit
sudo apt install crossbuild-essential-armhf
64bit
sudo apt install crossbuild-essential-arm64

3.ソースげっちゅー

git clone --depth=1 https://github.com/raspberrypi/linux

4.環境変数設定
32bit

Pi 1, Pi Zero, Pi Zero W, or Compute Module:

export KERNEL=kernel

For Pi 2, Pi 3, Pi 3+, or Compute Module 3:

export KERNEL=kernel7

For Raspberry Pi 4:

export KERNEL=kernel7l

64bit
For Pi 3, Pi 3+ or Compute Module 3:

export KERNEL=kernel8

For Raspberry Pi 4:

export KERNEL=kernel8

5. EXTRAVERSIONを設定

cd linux
vim Makefile
EXTRAVERSION = -mod

カーネルのバージョンのあとにひっつけて識別します。

6..configをつくろー
32bit
Pi 1, Pi Zero, Pi Zero W, or Compute Module:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

For Pi 2, Pi 3, Pi 3+, or Compute Module 3:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

For Raspberry Pi 4:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

64bit
For Pi 3, Pi 3+ or Compute Module 3:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig

For Raspberry Pi 4:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

6.ビルドします
32bit

make -j$(nproc)  ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

64bit

make -j$(nproc)  ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

7.インストールするMicroSDをマウント

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4

sdb1 は FAT (boot) パーテーション
sdb2 は ext4 filesystem (root) パーテーション
間違えたら悲しい気持ちになります。
sdb1,sdb2は環境により異なります。

8.カーネルモジュールのインストール
32bit

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

64bit

sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install

9.カーネルのコピー
32bit

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

64bit

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

おつかれやんした。
KERNEL以外のコンパイルオプションは、
環境変数に登録してもうまく参照してくれない可能性があるので、
参考にした(ぱくった)Raspberry Pi Documentation - The Linux kernelこちらのサイトにあるようにしときました。

カーネルが5.xになってえらい変わりましたが、
Zeroと3のコンパイルはでけました。


当方の環境は
Mac mini Late 2012 i7 2.6GHz
RAM 16GB
VirtualBox6.1
ubuntu 20.04 64bit

詳しくはそのうち加筆します。

とりあえず
コンパイルが終わったやつどうしよう。

そんなかんじ。