How to:Raspberry Pi(Raspbian"Wheezy")用にクロスコンパイル環境を構築する

Intro.

bootc kernelのサイト(http://www.bootc.net/projects/raspberry-pi-kernel/)を見ていると、"hogehogeのカーネルモジュールを追加して欲しい"といったコメントが多いですね。また、自分用にRaspberry Piで動くリアルタイムカーネルを作りたい、という必要性もありました。 こうなったら、自分でカーネルの再構築するしかないですよね。 最初は、Raspberry Pi上でコンパイルしようかなと思ったのですが、5~6時間かかるということでNG。それならWindows上でQEMUコンパイルすればいいんじゃね?と思ってQEMUを使ってみたら、Raspberry Piより動作が遅いのでNG。 というわけで、Debian GNU/Linux squeezeで、クロスコンパイル環境を作り、カーネルの再構築をしてみました。

0.このエントリーは”電脳あざらしの泳ぎ”(このサイトの本館)の記事”How to:クロスコンパイル環境を作り、カーネルの再構築をする(Raspberry Pi)”を再検証がてら書いたものです。

本館の記事では、Debian GNU/Linux Wheezyを使っていますが、こちらの記事では、Debian GNU/Linux squeezeを使っています。 1.前提となる環境

ロスコンパイル環境の作成については、Linuxさえ動いていれば、ディストリビューションアーキテクチャーは基本的に関係ないはずです(むしろCPU性能が大事)。カーネルの再構築についてはmake-kpkgなどを使うのでDebianディストリビューションがいいでしょう。(多分、ubuntuでも同じ手順でできるのではないかと、未検証ですが) また、LinuxCUI環境に慣れている方向けです。

2.クロスコンパイル環境の構築

例のごとく、bootc kernel作者のサイト"Chris's Digital Realm"の、http://www.bootc.net/archives/2012/05/26/how-to-build-a-cross-compiler-for-your-raspberry-pi/ を参考に進めていきます。

http://crosstool-ng.org/から、現時点での最新版のcrosstool-NG 1.17.0をダウンロードし、適当なところに展開します。私は/usr/local/srcにしました。

展開したディレクトリにcdし、

$ ./configure --prefix=/opt/cross

 

で、configureします。 /opt/cross配下に自分のユーザー権限でread/writeできるようにします。

$ make $ sudo make install

$PATHに/opt/cross/binを追加します。 最後に、crosstool-NGの作業ディレクトリーを作ります。 $ mkdir ~/cross (自分が読み書きできるところであれば、どんな場所、名前でもいいですが、amd64環境でディスク容量を3.5GBほど使用するので注意して下さい。以下、~/crossが作業ディレクトリーとして進めます)

この後必要になる、tool類をインストールします $ sudo apt-get install bison flex texinfo libtool automake libncurses5-dev subversion

"Chris's Digital Realm"では、このあと、crosstool-NGのmenuconfigに関する説明がだーっとありますが、ちょっと古いのと、Raspberry PiのARMアーキテクチャーに正確に一致していないために、Raspberry Piのforumにアップロードされている.configを拝借します。 wgetlynxなどで、http://www.raspberrypi.org/phpBB3/download/file.php?id=589のファイルをダウンロードしてきます。 (http://www.raspberrypi.org/phpBB3/viewtopic.php?t=11315&p=129461にあるファイルです) tar.gz形式のファイルですので、解凍します。すると、.configが得られます。この.configを~/crossにコピーします。 crosstool-NGでどのようなクロスコンパイル環境を作るかについてconfigureします。 $ cd cross $ ct-ng menuconfig ほとんど変更する点はありませんが、Operating System --> Linux kernel versionを3.2.32にします。(現時点でのbootc kernelのソースは3.2.23ベースですが問題ありませんでした)

ロスコンパイル環境を作ります $ ct-ng build 最初にソースを取得し、あとはひたすら必要なバイナリーをコンパイルしてくれます。マシンパワーで大きく差がでますが、かなり時間がかかります。私の環境(某VPS、仮想3コア、メモリー2GB)で、30分程かかりました。 終わると、/opt/cross/x-tools/配下にクロスコンパイルに必要なバイナリー類が出来上がっていますので、パスを追加します。

3.bootc kernelのクロスコンパイル

公開されているbootc kernelはアーキテクチャーがarmelなので、試しにarmhfでコンパイルしてみます。 bootc kernelを取得します。 $ sudo apt-get git $ git clone -b rpi-3.2.23 https://github.com/bootc/linux.git (もしくは、https://github.com/bootc/linux/tree/rpi-3.2.23からzipファイルを取得。なお、gitコマンド実行時にダウンロードが始まるまで5分ぐらいかかるのでじっと我慢)

$ sudo apt-get install fakeroot kernel-package $ wget http://apt.bootc.net/debian/pool/main/l/linux-source-3.2.23-rpi1+/linux-image-3.2.23-rpi1+1_armel.deb $ dpkg -x linux-image-3.2.23-rpi1+1_armel.deb . 展開してできたディレクトリーのboot内にconfig-3.2.23-rpi1+があるので、これを取得したbootc kernelツリーに.configとしてコピー

$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --config oldconfig configure

 

oldconfigのところはconfigを変えたい場合にはconfigにすれば大丈夫

$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --us --uc kernel_image modules_image

 

bootc kernelはやたらとカーネルモジュールが多いので、コンパイルに時間がかかります。別の作業でもして時間を潰して下さい。 エラーがなければ、カーネルツリーの一つ上のディレクトリーに.debファイルが出来上がっています。

4.カーネルのインストール

出来上がったパッケージをRaspberry Piに転送します。 あとは、root権限で

dpkg -i linux-image-3.2.23+_0.1_armhf.deb

cp /boot/vmlinuz-3.2.23+ /boot/kernel.img

としてrebootすれば、新しいカーネルで立ち上がります。 $ uname -a して確認しましょう。