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
以下のシェルスクリプトを書きました。
#!/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
以下のシェルスクリプトを書きました。
#!/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日 初出