Raspberry Pi Linuxカーネルクロスビルド方法備忘録

現在位置のナビ

トップコンピュータの国雑記帳 → Raspberry Pi Linuxカーネルクロスビルド方法備忘録

説明

Raspberry Pi 4B向けに64bit Linuxカーネルをクロスビルドしました。 ビルド環境を作るところから実行したので、備忘録として記録しておきます。

CQ出版社の『インターフェース』誌2024年10月号に、Intel Linuxでクロスコンパイルする手順がかかれていましたが、webmasterの環境ではエラーになります。 Linuxのバージョンが違うからでしょう。 Yoctoを利用するのはあきらめました。

以下のサイトを参考にしました。 32bitカーネルはビルドしていませんが、64bitと違うとわかっているところを説明します。

カーネルの違い

Raspberry PiのLinuxをブートすると/bootにカーネルイメージがいくつか現れます。

こういうことみたいです。 ネットの説明を鵜呑みにしたので、Raspberry Pi 2以前とか5はどうなっているのかわかりません。

コマンドインストール

カーネルをビルドするのに必要なパッケージをインストールします。 Ubuntu 24.04 カーネルのセルフビルドができる環境に、以下のパッケージを追加インストールしました。

apt install diffstat texinfo chrpath socat python3-pip python3-git python3-subunit libsdl1.2-dev xterm mesa-common-dev liblz4-tool

ARM 64bit 用コンパイラはこちらです。

sudo apt install g++-aarch64-linux-gnu qemu-user-binfmt
sudo ln -s /usr/aarch64-linux-gnu/lib/ /lib/aarch64-linux-gnu
sudo ln -s /lib/aarch64-linux-gnu/ld-2.23.so /lib/ld-linux-aarch64.so.1

ARM 32bit 用コンパイラはこちらです。

sudo apt install g++-arm-linux-gnueabihf

カーネルソースコード取得

以下のコマンドを実行します。

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

64bit カーネルビルド

以下のシェルスクリプトを書きました。

#!/bin/bash
export ARCH=arm64
export KERNEL=kernel8 
export CROSS_COMPILE=aarch64-linux-gnu-
export MODULES=../../libmodules

make bcm2711_defconfig
make menuconfig
make -j11 Image.gz modules dtbs
rm -rf ${MODULES}/lib
make INSTALL_MOD_PATH=${MODULES} modules_install
exit 0

MODULESディレクトリは、ダイナミックリンクするドライバ類を一時的に保存する場所です。 makeを4回実行します。 1回目で規定の.configファイルを持ってきます。 .configファイルについては説明しないので、わからない人はググってください。 2回目のmakeでカーネルのコンパイル設定を決めます。 名前をつけたり、モジュールの切り離しなどができます。 3回目のmakeで、実際にカーネルソースコードをコンパイルします。 12スレッドのCPUを使っているので、-j11オプションをつけています。 4回目のmakeで、ダイナミックリンクするドライバを一時ディレクトリに移動します。

以下のシェルスクリプトでマイクロSDカードにインストールします。 マイクロSDカードはUSBアダプタにつながっている想定です。

#!/bin/bash
export MEDIA=/media/`/usr/bin/whoami'
export MODULES=../../libmodules/lib/modules

if [ ! -d ${MEDIA}/bootfs ] ; then
	echo ${MEDIA}/bootfs directory not found.
	exit 1
fi
if [ ! -d ${MEDIA}/rootfs ] ; then
	echo ${MEDIA}/rootfs directory not found.
	exit 1
fi
if [ ! -d ${MODULES} ] ; then
	echo ${MODULES} directory not found.
	exit 1
fi

sudo cp arch/arm64/boot/Image.gz ${MEDIA}/bootfs/kernel8.img 
sudo cp arch/arm64/boot/dts/*.dtb ${MEDIA}/bootfs/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* ${MEDIA}/bootfs/overlays/
sudo cp -r ${MODULES}/ ${MEDIA}/rootfs/lib/modules/*
exit 0

32bit カーネルビルド

以下のシェルスクリプトを書きました。

#!/bin/bash
export ARCH=arm
export KERNEL=kernel7l
export CROSS_COMPILE=arm-linux-gnueabihf-
export MODULES=../../libmodules

make bcm2711_defconfig
make menuconfig
make -j11 zImage modules dtbs
rm -rf ${MODULES}/lib
make INSTALL_MOD_PATH=${MODULES} modules_install
exit 0

MODULESディレクトリは、ダイナミックリンクするドライバ類を一時的に保存する場所です。 Raspberry Pi 3向けにビルドするときはkernel7lをkernel7に変更してください。 makeを4回実行します。 1回目で規定の.configファイルを持ってきます。 .configファイルについては説明しないので、わからない人はググってください。 2回目のmakeでカーネルのコンパイル設定を決めます。 名前をつけたり、モジュールの切り離しなどができます。 3回目のmakeで、実際にカーネルソースコードをコンパイルします。 12スレッドのCPUを使っているので、-j11オプションをつけています。 64bitカーネルはImage.gzでしたけど、32bitはzImageです。 4回目のmakeで、ダイナミックリンクするドライバを一時ディレクトリに移動します。

以下のシェルスクリプトでマイクロSDカードにインストールします。 マイクロSDカードはUSBアダプタにつながっている想定です。

#!/bin/bash
export MEDIA=/media/`/usr/bin/whoami'
export MODULES=../../libmodules/lib/modules

if [ ! -d ${MEDIA}/bootfs ] ; then
	echo ${MEDIA}/bootfs directory not found.
	exit 1
fi
if [ ! -d ${MEDIA}/rootfs ] ; then
	echo ${MEDIA}/rootfs directory not found.
	exit 1
fi
if [ ! -d ${MODULES} ] ; then
	echo ${MODULES} directory not found.
	exit 1
fi

sudo cp arch/arm64/boot/zImage ${MEDIA}/bootfs/kernel7l.img 
sudo cp arch/arm64/boot/dts/*.dtb ${MEDIA}/bootfs/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* ${MEDIA}/bootfs/overlays/
sudo cp -r ${MODULES}/* ${MEDIA}/rootfs/lib/modules/
exit 0

掲載日

2025年2月11日 初出


back button 雑記帳へ