前記事で新バージョン(2015-02-16-raspbian-wheezy)の Raspbian をインストールしたので、Linuxカーネルも差し替えたいと思います。
以下、以前に書いた、この辺を見ながらクロスビルドしました。
微妙に手順変わってます。。。
◆カーネル/ローダブルモジュールのビルド
カーネルのクロスビルドには以前作った環境を使います。
以下、ホスト環境での操作になります。
git からLinuxカーネルのソースを取得します。
Raspberry Pi 実機上から取得したカーネルコンフィグをベースに、デバッグ関連、プロファイル関連のコンフィグを無効化したカーネルコンフィグ(これ)を使用します。(機能的にはデフォルトを維持してます。圧縮形式は lz4 に変更してますが。)
上記のカスタマイズしたコンフィグを.config として linux ディレクトリ直下に置きます。
カーネルをビルドします。(コア数に応じて -j2 とかお好みで付けてあげてください)
前までは zImage を kernel.img にリネームするだけで問題ありませんでしたが、
dtb 使うようになってから、もう一工程、下記作業が必要になったようです。
(ここめっちゃ悩みました。詳細は↓おまけ1参照。
mkknlimg は "git clone https://github.com/raspberrypi/tools.git" で取ってきた中にあります。)
dtbファイルとkernel.img とローダブルモジュール郡を圧縮し、Raspberry Pi に持っていきます。
(まあ、このあたりは好きな方法で持っていってもらえればいいんですが。)
◆クロスビルドしたLinuxカーネルへの差し替え
以下、Raspberry Pi 側での操作になります。
dtbファイルとカーネルイメージを差し替えます。
もはや不要になったファイルは削除しておこうと思います。(必須ではないです)
使用しない dtb ファイルや カーネルイメージファイルも削除していいですよね?
(自分が使用しているのは Raspberry Pi Model B+ モデルですので、下記ファイルは使用していません。)
◆おまけ1
以前のように、クロスビルドしたlinuxカーネルの zImage ファイルを kernel.img とリネームだけして、Raspberry Pi のカーネルを差し替えてみたんですが、どうも dtb ファイルを認識していないように思います。
ブートログにちらほらエラーも見えますし。
/boot/bcm2708-rpi-b-plus.dtb ファイルは確かに存在するのですが。
(ブートログは /var/log/messages で確認できます。)
試しに、/boot/config.txt の末尾に
どうして、デフォルトのカーネルイメージは config.txt に何も記載がなくても、ちゃんと正しい dtb ファイルを認識できてるんでしょうか?
カーネルバージョンの差か、コンフィグ変えたからか、とか考えていろいろ試してみたんですが、どうも関係なさそうです。
カーネルイメージに何か情報を付与してんじゃねーの?と思って、オリジナルのkernel.imgをバイナリエディタで開いてみると、、、
末尾に何か付いてますね。。。文字列が読めます。
圧縮イメージなのに読める文字列があるって事は、圧縮後に付与されたって事です。
zImageファイルはImageファイルを圧縮して自己展開プログラムを先頭にくっつけたファイルで、自分が知る限り末尾にこんな情報はくっつかないので、外部ツールなりでzImageにこの情報を付与する加工を加えているように思います。
カーネルイメージ生成手順、何か増えてんのか?と思って https://github.com/raspberrypi/tools の中をいろいろ見てると mkknlimg とかいうそれらしいのがありました。
で、コレ使って kernel.img 作ってみると、、、
◆おまけ2
CONFIG_KALLSYMS を無効化しようとして毎回、迷子になるのでメモ。
[1] CONFIG_LATENCYTOP と CONFIG_FTRACE を無効化
[2] CONFIG_KPROBES を無効化
[3] KALLSYMS_ALL がようやく変更可能になるので無効化
◆おまけ3
dtb (device tree blob)ファイルは dts (device tree source)ファイルから生成されますが、dtb ファイルから dts ファイルに戻す事もできます。
Linux ツリーの中に dtc (device tree compiler)が入っています。
下記、コマンドで dtb ファイルから dts ファイルを取得できます。
以下、以前に書いた、この辺を見ながらクロスビルドしました。
微妙に手順変わってます。。。
◆カーネル/ローダブルモジュールのビルド
カーネルのクロスビルドには以前作った環境を使います。
以下、ホスト環境での操作になります。
git からLinuxカーネルのソースを取得します。
$ cd /home/mint/raspi/現時点の最新カーネルバージョンは 3.19.1 でした。(もうすぐ 4.0 になりますね。)
$ git clone https://github.com/raspberrypi/linux.git
$ cd linux/
$ git checkout -b rpi-3.19.y remotes/origin/rpi-3.19.y
Raspberry Pi 実機上から取得したカーネルコンフィグをベースに、デバッグ関連、プロファイル関連のコンフィグを無効化したカーネルコンフィグ(これ)を使用します。(機能的にはデフォルトを維持してます。圧縮形式は lz4 に変更してますが。)
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ cd /home/mint/raspi/linux/
上記のカスタマイズしたコンフィグを.config として linux ディレクトリ直下に置きます。
$ curl http://sstea.blog.jp/raspi/kbuild/kconfig-rpi-3.19.1 > .configデフォルトのコンフィグを使用する場合は↓のようにしてもいいです。
$ make bcmrpi_defconfig
カーネルをビルドします。(コア数に応じて -j2 とかお好みで付けてあげてください)
$ make dtbs zImage modules
$ make modules_install INSTALL_MOD_PATH=../out/ INSTALL_MOD_STRIP=--strip-unneeded
前までは zImage を kernel.img にリネームするだけで問題ありませんでしたが、
dtb 使うようになってから、もう一工程、下記作業が必要になったようです。
(ここめっちゃ悩みました。詳細は↓おまけ1参照。
mkknlimg は "git clone https://github.com/raspberrypi/tools.git" で取ってきた中にあります。)
$ cd /home/mint/raspi/dtb ファイル(bcm2708-rpi-b-plus.dtb)もコピーしておきます。
$ tools/mkimage/mkknlimg --dtok linux/arch/arm/boot/zImage out/kernel.img
$ cp -p linux/arch/arm/boot/dts/bcm2708-rpi-b-plus.dtb out/
dtbファイルとkernel.img とローダブルモジュール郡を圧縮し、Raspberry Pi に持っていきます。
(まあ、このあたりは好きな方法で持っていってもらえればいいんですが。)
$ tar cvjf new.tar.bz2 out/# IPアドレス部分は Raspberry Pi のIPアドレスを指定
$ scp -p new.tar.bz2 pi@192.168.0.100:~
◆クロスビルドしたLinuxカーネルへの差し替え
以下、Raspberry Pi 側での操作になります。
dtbファイルとカーネルイメージを差し替えます。
$ tar xvjf new.tar.bz2新しいカーネルバージョンのローダブルモジュールを展開します。
$ sudo cp out/bcm2708-rpi-b-plus.dtb /boot/
$ sudo cp out/kernel.img /boot/
$ sudo cp -a out/lib/firmware/* /lib/firmware/リブートし、新しいカーネルの起動確認を行ないます。
$ sudo cp -a out/lib/modules/3.19.1+/ /lib/modules/
$ reboot
もはや不要になったファイルは削除しておこうと思います。(必須ではないです)
$ sudo rm -rf /lib/modules/3.18.9+/ /lib/modules/3.18.9-v7+/
$ sudo rm -rf /boot.bak/
使用しない dtb ファイルや カーネルイメージファイルも削除していいですよね?
(自分が使用しているのは Raspberry Pi Model B+ モデルですので、下記ファイルは使用していません。)
$ sudo rm /boot/bcm2708-rpi-b.dtb /boot/bcm2709-rpi-2-b.dtb /boot/kernel7.img
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 3671884 1723412 1749112 50% /
devtmpfs 219996 0 219996 0% /dev
tmpfs 44836 452 44384 2% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 89660 0 89660 0% /run/shm
/dev/mmcblk0p1 57288 10200 47088 18% /boot
◆おまけ1
以前のように、クロスビルドしたlinuxカーネルの zImage ファイルを kernel.img とリネームだけして、Raspberry Pi のカーネルを差し替えてみたんですが、どうも dtb ファイルを認識していないように思います。
ブートログにちらほらエラーも見えますし。
/boot/bcm2708-rpi-b-plus.dtb ファイルは確かに存在するのですが。
(ブートログは /var/log/messages で確認できます。)
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.19.1+ (mint@Mint) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Sat Mar 14 22:50:58 JST 2015
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: BCM2708
[ 0.000000] cma: Reserved 8 MiB at 0x1b800000
[ 0.000000] Memory policy: Data cache writeback
:
試しに、/boot/config.txt の末尾に
device_tree=bcm2708-rpi-b-plus.dtbと追加し、リブートしてみたところ、
[ 0.000000] Booting Linux on physical CPU 0x0dtb ファイル認識してますね。。。
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.19.1+ (mint@Mint) (gcc version 4.8.3 20140106 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2014.01 - Linaro GCC 2013.11) ) #1 PREEMPT Sat Mar 14 22:50:58 JST 2015
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine model: Raspberry Pi Model B Plus
[ 0.000000] cma: Reserved 8 MiB at 0x1b800000
[ 0.000000] Memory policy: Data cache writeback
:
どうして、デフォルトのカーネルイメージは config.txt に何も記載がなくても、ちゃんと正しい dtb ファイルを認識できてるんでしょうか?
カーネルバージョンの差か、コンフィグ変えたからか、とか考えていろいろ試してみたんですが、どうも関係なさそうです。
カーネルイメージに何か情報を付与してんじゃねーの?と思って、オリジナルのkernel.imgをバイナリエディタで開いてみると、、、
末尾に何か付いてますね。。。文字列が読めます。
圧縮イメージなのに読める文字列があるって事は、圧縮後に付与されたって事です。
zImageファイルはImageファイルを圧縮して自己展開プログラムを先頭にくっつけたファイルで、自分が知る限り末尾にこんな情報はくっつかないので、外部ツールなりでzImageにこの情報を付与する加工を加えているように思います。
カーネルイメージ生成手順、何か増えてんのか?と思って https://github.com/raspberrypi/tools の中をいろいろ見てると mkknlimg とかいうそれらしいのがありました。
で、コレ使って kernel.img 作ってみると、、、
$ mkknlimg --dtok zImage kernel.imgconfig.txt を弄らなくても、いけましたー。
◆おまけ2
CONFIG_KALLSYMS を無効化しようとして毎回、迷子になるのでメモ。
[1] CONFIG_LATENCYTOP と CONFIG_FTRACE を無効化
Kernel hacking --->
[ ] Latency measuring infrastructure
[ ] Tracers ----
[2] CONFIG_KPROBES を無効化
General setup --->
[ ] Kprobes
[3] KALLSYMS_ALL がようやく変更可能になるので無効化
General setup --->
-*- Configure standard kernel features (expert users) --->
[ ] Load all symbols for debugging/ksymoops
◆おまけ3
dtb (device tree blob)ファイルは dts (device tree source)ファイルから生成されますが、dtb ファイルから dts ファイルに戻す事もできます。
Linux ツリーの中に dtc (device tree compiler)が入っています。
下記、コマンドで dtb ファイルから dts ファイルを取得できます。
$ cd /home/mint/raspi/
$ linux/scripts/dtc/dtc -I dtb -O dts ./bcm2708-rpi-b-plus.dtb > ./out.dts