Raspberry Pi 2のカーネルをビルドしてみた

Raspberry Pi 2でセルフビルド

Raspbianの入ったRaspberry Pi2には最初からgitやgccが入っています。コアも4つあることだし、カーネルでもビルドしてみるかと軽い気持ちで始めてみましたが、やはり無謀でした。
そもそもカーネルのソースリポジトリをgit clone するだけで、やたらと時間がかかります。測っていませんでしたが30分以上。
そして make -j4 でビルドしましたが、2時間以上かかりました。
これではconfigをちょっと変更して再ビルドするのも大変です。おすすめしません。負荷テストとして実行する以外は。

クロスビルド

やはり組み込みLinuxはクロスビルドが基本です。
いくつかつまづいたのですが、結局は以下のページの通りやればビルドして動かすことができました。
https://www.raspberrypi.org/documentation/linux/kernel/building.md

6コア12スレッドのマシンでmake -j12 としたときのビルド時間は約3分半でした。
つまづいたポイントは以下の2つ。

  • ビルド後にコピーするファイルとして、kernel7.imgと/lib/modulesの他にdtbファイルも更新が必要。
  • .configファイルとしてv3.18.11の/proc/config.gzから持ってくるのでなくmake bcm2709_defconfig する。

.configファイルにv3.18.11のを使用したらEthernetとUSBが使えませんでした。

リモートログインしてビルドしたときには、以下のスクリプトでコピーするべきファイルをひとつにまとめることができます。

set -x
export KERNEL_RELEASE=`cat include/config/kernel.release`
export INSTALL_MOD_PATH=../$KERNEL_RELEASE
mkdir -p ../$KERNEL_RELEASE/boot/overlays
make modules_install
scripts/mkknlimg arch/arm/boot/zImage ../$KERNEL_RELEASE/boot/kernel7.img
cp arch/arm/boot/dts/*.dtb ../$KERNEL_RELEASE/boot/
cp arch/arm/boot/dts/overlays/*.dtb ../$KERNEL_RELEASE/boot/overlays/
cd ..
tar cvjf $KERNEL_RELEASE.tar.bz2 $KERNEL_RELEASE/

Raspberry Piカーネルのgitリポジトリはタグ付けが適切にされておらず、現在動いていたv3.18.11のソースがどのコミットなのか見つけることができませんでした。
私がビルドして動かしてみたのは、rpi-4.1.yブランチの以下の時点のものです。

59e76bb dwc_otg: Force host mode to fix incorrect compute module board

(今みたら4.1.8がマージされてました。)

ブートログをgistに貼りました。
Raspberry Pi 2 カーネルv4.1.7のブートログ