サーバいじくり雑記

2013年2月7日

Raspberry Pi(Raspbian)用カーネルをクロスコンパイル

Filed under: ソフト, 開発技術, Linux — bompopo @ 3:31 午後

Raspberry Pi上ではカーネルはもちろん色々なもののコンパイルは超遅い!カーネルコンパイルだけで4〜6時間くらいかかります。そういう重い処理はパワーのあるマシンにやらせましょう。

今回はクロスコンパイル環境としてcrosstool-NGを使います。基本的に以下リンク先の通りやればOKです。
How to:Raspberry Pi(Raspbian”Wheezy”)用にクロスコンパイル環境を構築する

変更点としては3つ。
・上記リンク先ではlinuxカーネルをbootcを使っていますがRaspbian公式リポジトリ「https://github.com/raspberrypi/linux.git」のを使います。
・kernel configは現在使用中のconfigを取得して利用
・crosstool-NGのインストール先が/opt/cross/となっていますが、私は/home/以下のユーザ領域にインストールし作業領域も同じディレクトリにしました。ベース汚したく無い今回だけのただのこだわりです。

1.crosstool-NGのインストール

$ mkdir -p ~/src/crosstool-NG
$ mkdir    ~/raspberrypi-cross
$ cd ~/src/crosstool-NG
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.18.0.tar.bz2 # 最新版をダウンロード
$ tar zxf crosstool-ng-1.18.0.tar.bz2
$ cd crosstool-ng-1.18.0
$ ./configure --prefix=~/raspberrypi-cross/
$ make
$ sudo make install

~/.bashrcに以下を記述してクロス環境のパスを通します。もしくはcrosstool-NG使うときだけコマンド実行してもOKです。

export PATH=${HOME}/raspberrypi-cross/bin:${HOME}/raspberrypi-cross/x-tools/arm-unknown-linux-gnueabi/bin/:${PATH}

2.Raspberry Pi用クロスコンパイル環境構築

$ sudo apt-get install bison flex texinfo libtool automake libncurses5-dev subversion
$ cd ~/raspberrypi-cross/
$ wget  http://www.raspberrypi.org/phpBB3/download/file.php?id=589 -O config.tar.gz
$ tar zxf config.tar.gz
$ rm config.tar.gz
$ ct-ng menuconfig
  # メニューからたどっていき Operating System –> Linux kernel version -> 3.6.11 へ変更
$ ct-ng build

足りないコマンドは注意されるので適宜いれて再実行しましょう。確か足りないコマンドあったんですが忘れたw

3.Raspbian linuxカーネルをクロスコンパイル

$ sudo apt-get install git fakeroot kernel-package
$ cd ~/raspberrypi-cross/
$ git clone https://github.com/raspberrypi/linux.git --depth 1
  # git cloneは時間がかかります
$ cp /tmp/.config ~/raspberrypi-cross/linux/.config # 現行kernel configが/tmp/.configへ保存してあると想定
                                                    # 簡単には実機で $ zcat /proc/config.gz > .config で取得できる
$ cd ~/raspberrypi-cross/linux/
$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf \
 --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --config oldconfig configure
  # 新しいオプションをどうするか聞かれますがだいたいデフォルトでOK。問題あったときだけ気にしよう。
$ 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
  # コンパイルされるので待ちます
$ ls ../*.deb
../linux-image-3.6.11+_0.1_armhf.deb  # 成功すればdebパッケージが作成されています。

本当に中身がちゃんとしてるのか気になる場合は展開してみましょう。

$ mkdir /tmp/linux-image/
$ dpkg -X ~/raspberrypi-cross/*.deb /tmp/linux-image/

あれ?現在のカーネルよりずっと小さいと思った人いるかもですが大丈夫です。圧縮タイプのカーネルでもちゃんとブートするのです。

4.カーネルのインストール
scp等でRaspberry Piに転送してインストールします。

$ dpkg -i /tmp/linux-image-3.6.11+_0.1_armhf.deb
  # バックアップシンボリックリンクが作成できません等のエラーは現在のイメージファイルをmvでリネームしてから再実行します。

インストールカーネルを使う設定を「/boot/config.txt」に記述します。もしくはvmlinuz-3.6.11+をkernel.imgにコピーでもOKです。

kernel=vmlinuz-3.6.11+

※ 今回は使ってませんがinitramfsを使う場合も以下のようにこのファイルに記述しますよ。

initramfs initrd.img-3.6.11+

リブートしuname -aして確認して新しくなっているのを確認^^

※ クロスコンパイラをemdebian(http://www.emdebian.org/debian/)から取得したもので代用はエラー多発でできませんでした。
※ crosstools-NGで作られたクロスコンパイラ名にhf(hard float)が付いてないが大丈夫?と思った人も居るかもですが結論からいうと大丈夫。
どうしても気になるって人はこのリンク先(arm-linux-gnueabihf-gcc (Hard Float)の生成コードを見てみる)に確認方法が。

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す