Raspberry PI のカーネルクロスコンパイル環境を作る

Volumio という音楽再生サーバがあるのです。Rasperry PI でUSBメモリーとか、NASに入ってる音楽データを、Web GUIで操作して、音楽を再生しようっていうもので、Linux Kernel を含むOSイメージとして配布されています。

で、こんなのあるんなら、Kernel からいじって、音質改善みたいなことをやりたいなぁと思うわけですが、そーなるとまずは開発環境をつくらないといけない。Rasperry PI は全うに Linux 環境なので、実機上でコンパイルしても良いんですが、時間がどれだけかかるかわかったものじゃない。

というわけで、x86(64)マシン上にクロスコンパイル環境を作ってしまおう!というお話です。


クロスコンパイル環境を作る手順は、大まかにこんな感じ

  1. ホストとなるマシンにOSをインストールする
  2. ホストに開発環境に必要なパッケージをインストールする
  3. Linux KernelのSoruceセットを取ってくる
  4. クロスコンパイラをとってくる
  5. コンパイルする
  6. コンパイルしたバイナリを実機にコピーする

参考にしたサイトも並べておきましょう。私の二次記憶もぐてっくRaspberry Piのカーネルをクロスコンパイルするひまじめ


ホストOSとしては、おそらく Linux だったらなんでもいいんだと思います。たぶんw Raspberry PI の Linux は、Raspbian という名前のディストリビューションで、名前からも分かるとおり Debian 系です。たぶん、Debian をそのままホストにするほうがいいんじゃないかなぁ、と思いつつ、私は Ubuntu にしました。Ubuntu は、Desktop OSとしての色合いが強いのですが、どーせtelnet して使うんだから、Ubuntu Server にします。

OSをインストールしたら、これを入れなきゃ話にならない!っていうものからインストール

apt-get -y install tcsh
apt-get -y install telnetd xinetd
apt-get -y install nfs-client

次に、開発環境に必要なものをインストール

apt-get -y install git
apt-get -y install build-essential libncurses5-dev

いよいよ Linux のソースを取ってきます

git clone https://github.com/raspberrypi/linux.git
git clone https://github.com/raspberrypi/tools.git

Kernel Source と、クロスコンパイルツールを持ってきます。以上で、クロスコンパイルを実行するための準備は完了。


さぁ、コンパイルしましょう。一番気になるのが、クロスコンパイラの使い方。これは make コマンドが CROSS_COMPILE 環境変数を指定しておけば、make コマンドがいい具合に使ってくれるらしい。よって、こんな感じ

CCPREFIX=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=${CCPREFIX}
make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules

なおこれは、64bit 環境でやったから、こうなったもの。ホストの環境で arm-linux-gnueabihf-raspbian-x64 は各々の環境にあわせないといけない。

CCPREFIX は .cshrc あたりで環境変数として設定してあげたほうがいいんだろうな。ついメンドクサクなって、この環境変数を設定したShellを開きっぱなしでつかっちゃってるけど。


けっこーな時間がかかりますが、これでコンパイル完了です。バイナリーができました。あとはKernelファイルを実機にコピーして起動するだけ!!・・・・・・と思いきや、ここでLinuxであることが仇になります。いまどきのLinuxは、もはやモノリシックカーネルと言っていいのか?というレベルにKernel Moduleを使いまくる。

NetBSD だったら、Kernelというファイルを一個、実機にコピーすれば、それでKernelの入れ替えが完了するんですが、Linux の場合、.ko ファイルという、Kernel Moduleファイルを、どっさりと正しいディレクトリにコピーしないといけない。

ちうわけで、Kernel Moduleファイルを実機にコピーします

mkdir ../install
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../install modules_install

これでコピーするべき .ko ファイルが、../install ディレクトリにあつまるわけです。あとは分かりますね?このディレクトリの構造を、そのまんま実機にコピーしてあげましょう。

いよいよ、本当に最後

arch/arm/boot/zImage

これが出来上がった Kernel ファイルです。このファイルを実機の

/boot/kernel.img

としてコピーしてあげれば、インストール完了。正常に起動することを祈りながら、再起動しましょう

このブログ記事について

このページは、ほーりーが2015年2月23日 20:50に書いたブログ記事です。

ひとつ前のブログ記事は「Volumio で無理やり I2S MCLK を出力してみる」です。

次のブログ記事は「Volumioの構造」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。