前回NanoPi NEOのルートファイルシステムをBuildrootで作る(1)の続き。
#カーネルをベンダー提供の4.11.2に入れ替える
前回はBuildrootにすでに用意されているdefconfigを使ってNanoPi NEO用のブートイメージをビルドしました。これにはメインラインのソースコードが使用されていました。
NanoPi NEOの機能のうちのいくつかはまだメインラインにマージされていません。EthernetのMACアドレスを取得する機能もまだでした。これがないとEthernetが使用できないわけではないのですが、MACアドレスが起動するたびに異なるランダム値になります。
今回はMACアドレスをユニークな個体識別のIDとして使用したいので、ベンダーの提供するカーネルに入れ替えたいと思います。
ベンダー提供のソースコードはここにあるものを使いました。
https://www.mediafire.com/folder/n5o8ihvqhnf6s/Nanopi-NEO
苦労話
カーネルを差し替えるくらいすぐにできるだろうと思ったのですが、実際にやってみるとカーネルが正しく起動できません。
通常はmmc0として認識されるマイクロSDカードのデバイスがなぜかmmc1となり、そのためにmmcblk0p2 にあるrootfsを見つけることができません。
なぜそうなるかわからないけど、それに合わせてブートパラメータの root=/dev/mmcblk0p2 の部分を mmcblk1p2 に変更して試してみました。
するとrootfsを見つけて先まで進むようになるのですが、途中でハングアップしてプロンプトが出るとこまで到達しません。
カーネルが正しくビルドできていないのか確認するために、それをベンダー提供のブートイメージのものと入れ替えてみるとそっちでは正しく起動しました。なのでカーネルは正しくビルドできていそう。
ubootのスクリプトファイルやinitrdなど、いろいろ差し替えて切り分けをして1日つぶしてしまいました。
結局わかったことは、「ベンダー提供のLinuxカーネルを使うときには、ubootもベンダー提供のものにしなければいけない。」
こんな依存性があるとは。
変更点
kernelはcustom tarballを使用する。
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="http://www.mediafire.com/file/57urrfmb7irxlbb/linux_4.11.2_20170707.tar.gz"
それに合わせて使用するLinuxヘッダーファイルも4.11.x にする
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_11=y
ubootもcustom tarball を使用する
BR2_TARGET_UBOOT_CUSTOM_TARBALL=y
BR2_TARGET_UBOOT_CUSTOM_TARBALL_LOCATION="http://www.mediafire.com/file/wessj3k3974nep1/u-boot_2017.05_20170707.tar.gz"
rootfsのサイズが32MBで足りなかったので、128MBに変更する
BR2_TARGET_ROOTFS_EXT2_SIZE="128M"
それに合わせて、board/friendlyarm/nanopi-neo/genimage.cfg
に書かれているパーテションサイズも32MB -> 128MB に変更する
Ubootのスクリプトファイル board/friendlyarm/nanopi-neo/boot.cmd
はベンダー提供のものをベースにramdiskを使用しないように修正する
ついでに、board/friendlyarm/nanopi-neo/post-image.sh
でsdcard.img を作成した後にそれをzipで圧縮する
これらの修正したファイルはgistに貼っておきました。
https://gist.github.com/tetsu-koba/0123aeda3298fc07fb79128dbb889f44