Volumio という音楽再生サーバがあるのです。Rasperry PI でUSBメモリーとか、NASに入ってる音楽データを、Web GUIで操作して、音楽を再生しようっていうもので、Linux Kernel を含むOSイメージとして配布されています。
で、こんなのあるんなら、Kernel からいじって、音質改善みたいなことをやりたいなぁと思うわけですが、そーなるとまずは開発環境をつくらないといけない。Rasperry PI は全うに Linux 環境なので、実機上でコンパイルしても良いんですが、時間がどれだけかかるかわかったものじゃない。
というわけで、x86(64)マシン上にクロスコンパイル環境を作ってしまおう!というお話です。
クロスコンパイル環境を作る手順は、大まかにこんな感じ
- ホストとなるマシンにOSをインストールする
- ホストに開発環境に必要なパッケージをインストールする
- Linux KernelのSoruceセットを取ってくる
- クロスコンパイラをとってくる
- コンパイルする
- コンパイルしたバイナリを実機にコピーする
参考にしたサイトも並べておきましょう。私の二次記憶/もぐてっく/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
としてコピーしてあげれば、インストール完了。正常に起動することを祈りながら、再起動しましょう