Raspberry Pi用のOpenWrtをビルドする

概要

Raspberry Piで動くOpenWrtをDebian 8.0でビルドする手順を概説する。

OpenWrt は主にアクセスポイントなどを対象とした組込みLinuxディストリビューション。 FONのAPなどで使われているらしい。 Raspberry PiではRaspbianを動かすのが主流みたいだが、重いしSDの容量も大きくないとダメなのでちょっと使いたいときに不便。 なのでOpenWrtを入れることにした。 パッケージ類を入れまくらない限り、OpenWrtなら100Mもあれば動作させることが可能。 あんまり小さい容量のSDカードは入手できない時代なので、自分は2GBのSDカードに書き込んだ。

別にビルドしなくてもバイナリは公開されているのだが、自分の欲しいパッケージを組み込んだり、設定をした状態のバイナリが欲しい場合はビルドが必須になるのでメモ。 ImageBuilderを使えば上記のことは可能なような気もするが、まぁ気にしないことにする。

前提

  • Debian機はすでに用意してあるものとする。 本記事執筆時点では8.0(jessie)が最新の安定版リリース。
  • ディスクの空き容量は少なくとも50GBくらい用意しておいた方が良い。 カーネルをビルドすると意外と食う。 ビルド完了時点でソースディレクトリは33GBを消費していた。 この他にも必要なツール類を導入しないといけないため、ディスク容量は結構必要となる。

手順

ツールのインストール

まず必要ツールをインストールする。 Debianなので apt-get すればOK。

% sudo apt-get update
% sudo apt-get install git-core build-essential libssl-dev \
libncurses5-dev unzip subversion gawk python gettext pkg-config \
zip openjdk-7-jdk openjdk-7-jre libxml-parser-perl mercurial \
zlib1g-dev sdcc bzr

OpenWrtのビルド

何はともあれソースを取得する。 今回はこの記事執筆時点での最新版を入れることにする。 意外と時間がかかるので注意。 自分が取得したのは

% git clone git://git.openwrt.org/openwrt.git

安定版リリースを使いたい場合には OpenWrtのドキュメント を参照のこと。

パッケージ類のソースはfeedで管理されているので、これを使って最新のソースを取得してくる。 feeds.conf を編集すればfeedを追加できる。 feeds.conf は最初は存在しないので、 feeds.conf.default をコピーして使う。

% cd openwrt
% ./scripts/feeds update -a
% ./scripts/feeds install -a

Raspberry Pi用のconfigを取得する。 この記事執筆時点では14.07のものが最新なので、これを取得して足りない設定は自分で施す。 元から .config がある場合にも上書きしてしまう。 gitから取ってきているので、復活させたければ git checkout すればいい。

% wget http://downloads.openwrt.org/barrier_breaker/14.07/brcm2708/generic/config.brcm2708_generic
% cp config.brcm2708_generic .config

必要となるパッケージのチェック。 足りないパッケージがあったら適宜インストールすること。

% make prereq

カーネルコンフィグを変更する。 特に、Raspberry Pi2を使っている場合は SubtargetBCM2709 に変更しないと動かない(手元にRaspberry Pi2がないから未検証)。 コンフィグを変更したら保存して終了すること。 自分の好きなように変更して良い。 当然のことだが、パッケージを減らせばビルドが速くなる。 イメージサイズは組み込むパッケージ数に依存するので、ビルドしたから必ず大きくなるとは限らない。 ImageBuilderをビルドしておくと単一のパッケージをビルドしたり組み込むパッケージや設定を変更してイメージを作成したりできるので便利。

% make menuconfig

あとはmakeするだけなのだが、configファイルを配置したイメージをビルドしたい場合には package/base-files/files/ に配置しておく。 個人的には、設定ファイルを配置したイメージはImageBuilderをビルドしてから作る方が良いように思う。

makeする。 CPU数が分かっている場合は -j オプションで指定するとmakeが速くなるかも。 エラーが出た場合は make -j1 V=s とするとエラーを見ることができる。 もちろん最初から指定しておいてもOK。

% make -j5

初めてmakeするときは色々なソースコードを取得してくるのでとてつもなく時間がかかる。 ネットワーク(特に相手側)の速度に依存するため、マシンが速くても速くはならない。

make -j5 などとしているとビルドに失敗するときがある。 make -j1 V=s で試せばエラーが分かる、と表示されるので実行してみると今度はエラーが起きなくなる。 謎だ。

ソースコードの取得に失敗してエラー終了した場合には、時間を空けてトライするとmakeに成功するかも。 時間を空けてトライしてもダメなら当該パッケージを除外するのが楽な解決方法だ。 自分の場合は依存関係が間違っている場合も何度かあった。 その場合は当該パッケージのMakefileを修正してしまった。 ビルドするパッケージによって他にもツールが必要となる場合があるので、エラーメッセージをよく見て足りないものを導入しながらmakeしていく。

この記事を書いている時点では、新しいリリースに向けてパッケージ類も変更中なのかたくさんのエラーに遭遇した。 というわけで、現時点ではややハードルが高いかもしれない。