もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

これでダメなら諦めた方が良い程度にRasberry Piのカーネルクロスコンパイル手順をまとめてみた。

(内容古いです。)

Raspberry Piのクロスコンパイルの方法は、既にいくつものサイトで解説されてるんですが、汎用のクロスコンパイラを適切なオプションでコンパイルせなあかんとかでなんか面倒かったり、手順の途中が「そんなの常識だよね〜」的に端折られててなんか面倒かった訳です。

んで、この度公式?のクロスコンパイラを触ってみたら割とあっさりと動いちゃったんで、手順をまとめとこうと思った次第です。

Ubuntu Desktop 12.10 32bitのインストール

ロスコンパイルを行うOSをインストールします。
Server版でも一向に構わないと思いますが、手元にあったので。
64bit版は不可。

必要そうなパッケージをインストール

$ sudo apt-get install build-essential libncurses5-dev openssh-server avahi-daemon

build-essentialはmakeコマンドとmenuconfig用のセルフコンパイル環境のため。多分いらんパッケージも入るけど、まぁいいかと。
openssh-serverは糞重いUnity対策。MBAのターミナルから接続出来るようにしときます。
avahi-daemonは趣味です。avahi可愛いよavahi。

カーネルソースとクロスコンパイラをもらってくる。

githubからRaspberry Piのカーネルソースとクロスコンパイラをありがたく頂きます。

$ wget --no-check-certificate https://github.com/raspberrypi/linux/archive/rpi-3.6.y.tar.gz
$ wget --no-check-certificate https://github.com/raspberrypi/tools/archive/master.tar.gz

今回は何も考えずにホームディレクトリに展開しときます。

$ tar xvzf rpi-3.6.y.tar.gz
$ tar xvzf master.tar.gz

Raspberry Piからカーネルコンフィグを取ってくる。

Raspberry Piのprocファイルシステムには現状のカーネルのコンフィグが格納されてるのでぶっこ抜きます。
ここではRaspbmcから取って来てますが、Raspbianもきっと同じカーネルコンフィグのはず。

$ cd linux-rpi-3.6.y
$ scp pi@raspbmc.local:/proc/config.gz .
$ zcat config.gz > .config

ぶっこ抜いたカーネルコンフィグの反映

make oldconfigを実行してコンフィグを反映します。
カーネルのバージョンが違ってた場合は、新規追加されたコンフィグをどうするか聞かれますが、基本デフォルトでOKです。
(今回の場合は差分はありませんでした。)

$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm oldconfig

どどど・・・ドッピオぉぉ!?

make menuconfigでお好きなフレーバーをカーネルに追加しよう!

$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm menuconfig

カーネルをコンパイル

$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm

Enterを叩いた瞬間、Raspberry Piではあり得なかった光の世界がそこに広がります。
(意訳:クロコンやばい。超やばい)

モジュールもコンパイル

$ make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm modules


一先ず/tmp/123ってディレクトリにインストールして、余計なシンボリックリンクを削除しときます。

$ sudo make CROSS_COMPILE=~/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- ARCH=arm INSTALL_MOD_PATH=/tmp/123 modules_install
$ sudo rm /tmp/123/lib/modules/3.6.11/build
$ sudo rm /tmp/123/lib/modules/3.6.11/source

出来上がったカーネルとモジュールをRaspberry Piにコピー

なぜか/tmp/だと容量不足だと怒られるので、piのホームディレクトリに置きます。

$ scp -rp /tmp/123/lib arch/arm/boot/zImage pi@raspbmc.local:~/

コピーしたカーネルとモジュールを正規場所にコピー

Raspberry Piにログインして、さっきコピーしたファイルを移動します。

$ sudo cp -rp lib /
$ sudo cp -rp zImage /boot/kernel.img

下のメッセージが出ますがFAT32ファイルシステムに起因する無害なものです。無視しましょう。
cp: failed to preserve ownership for `/boot/kernel.img': Operation not permitted

リブート

そしてリブート!

$ sudo reboot

きっとあなたは新たなRaspberry Piに出会うことでしょう!