wiki:OpenWRTAlix

OpenWRTをPC Engines ALIXに入れる

ひさしぶりにOpenWRTをいじっています。目的はAsteriskのPBXを作ることですが、その話はまたそのうち。

ハードウェアは PC Engines ALIXです。 ちょっと非力な感じですが、Asteriskには十分な気がします。 ビルドは、Ubuntu 10.10で行いました。

ダウンロード

OpenWRTは、コードネームBackfire、10.03というのがリリースされています。

~% mkdir openwrt
openwrt% cd openwrt
openwrt% svn co svn://svn.openwrt.org/openwrt/branches/backfire

これでは、用意されているパッケージは最小限です。 その他のパッケージをビルドできるよう、パッケージの生成方法が書いてあるファイルを持って来ます。

openwrt% svn co svn://svn.openwrt.org/openwrt/packages
openwrt% cd backfire/packages
packages% ln -s ../../packages/*/* .
packages% cd ..
backfire% 

開発ツールのインストール

以下のような開発ツール、ライブラリ等が必要です(パッケージ名はUbuntuの場合です)。 インストールされていないなら、インストールしてください。 足りない場合は、makeの際にエラーが表示されるので、心配ありません。

  • g++
  • flex
  • gawk
  • libncurses5-dev
  • zlib1g-dev

目的とする環境

  • ALIXに内蔵するCFカードにLinuxをインストールする。
  • 読み出し専用ファイルシステムで動作する。
  • 変更部分だけを、別のファイルシステムに保存する。

ビルドの設定

ビルドの内容を設定します。

backfire% make menuconfig

設定の抜粋。

  • Target System (x86) *
  • Subtarget (Generic) *
  • Target Profile (PCEngines Alix) *
  • Target Images
    • [ ] ramdisk
    • [ ] cpio.gz
    • [ ] tar.gz *
    • [ ] ext2 *
    • [ ] jffs2 *
    • [*] squashfs
    • [*] Build GRUB images (Linux x86 or x86_64 host only)
    • [*] Use Console Terminal (in addition to Serial)
    • (ttyS0) Serial port device
    • (38400) Serial port baud rate
    • () Extra kernel boot options
    • [*] Pad images to filesystem size (for JFFS2) ?
    • (4) Kernel partition size (in MB)
    • (/dev/sda2) Root partition on target device
    • (250) Root filesystem partition size (in MB) *

デフォルトから変更したのは、上記の「*」の項目です。 ファイルシステムの形式の選択がややこしいです。 「squashfs」を選ぶのがいいでしょう。

ext2
普通のLinux同様、ext2のファイルシステムで構築します。 いつ電源が切れるかわからない組み込み用途にはお勧めしません。
jffs2
JFFS2。ジャーナリング機能付き、圧縮して保存、組み込み専用のファイルシステムです。 ext2よりは安全ですが、ジャーナリングがうまく行かずに壊れる可能性がゼロではありません。
squashfs
Squashfs。読み出し専用ファイルシステムです。 JFFS2で作った別のパーティションをオーバレイしてあり、設定などで変更した部分はこちらに保存されます。 設定部分が壊れる可能性はゼロではないものの、最悪の場合でもブートだけはできるはずです。

?」ってマークしてある「Pad images...」をオンにすると、その下の「Root filesystem partition size」の分だけのカラの領域が、最終的に作成されるディスクイメージに含められます。

  • オンの場合
    • ビルド環境で無駄なディスクを使ってしまう。→保存するなら圧縮しましょう。
    • 後述する、ビルド環境での設定作業が簡単。
  • オフの場合
    • 無駄なディスクを使わない。
    • 実機でなければ設定作業ができない。

あとは、欲しいパッケージを選択する。 OpenWRTのお約束として、Y、N、Mの選択肢には、それぞれ以下の意味があります。

  • Y --- ビルドし、イメージに入った状態にする。
  • N --- ビルドしない。
  • M --- 後からインストールできるパッケージとしてビルドする。

ビルド

openwrt% make

依存関係とかがおかしいときは「make clean」してみるといいかも。

選択したパッケージによっては、ライブラリが足りなくてエラーになる事があります。 このような場合は、いったん「make V=99」としてもう一度ビルドしてみてください。 詳細なエラーメッセージが表示されるので、足りないライブラリを特定して、インストールしてください。 このあと、もういちど「make」です。

できあがったファイルは、「bin」ディレクトリの下にあります。 いくつかファイルがあるのでややこしいですが、目的のファイルは「openwrt-x86-generic-combined-squashfs.img」です。

設定

ネットワーク設定などに限っては、ビルド前の設定でも行うことができます。 でも、どうせ、その他の設定もいろいろいじりたいですから、設定はビルド後に行うことにします。 このためには、上記の「ビルドの設定」で「Pad images...」をオンにしておく必要があります。

openwrt% cd bin/x86
x86% 

ちょっと裏技的ですが、QEMUを使います。 GNOMEとかのデスクトップで実行してください。 GUI無しで起動する方法もありますが、ちょっと面倒です。

x86% qemu -hda openwrt-x86-generic-combined-squashfs.img

Please press Enter to acttivate this console.」って出たら起動完了。 リターンキーを押すとコマンドプロンプトが現れます。 ただし、初回の起動の場合だけは、この表示が現れた後もJFFS2の構築が完了していません。 以下のような表示が出るまで、数分待つ必要があります。

jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
jffs2_build_filesystem(): unlocking the mtd device... done.
jffs2_build_filesystem(): erasing all blocks after the end marker... done.
mini_fo: using base directory: /
mini_fo: using storage directory: /overlay

適宜設定を行って、「halt」コマンドで終了させます。 QEMUが勝手に終わらない場合は、ウィンドウを閉じて下さい。 これで、設定済みのイメージファイルが完成です。

CFに焼く

ビルド環境上で、CFが/dev/sdbとして認識されている場合。 このCFが勝手にマウントされていないことを確認してから、以下のコマンドを実行してください。

x86% sudo dd if=openwrt-x86-generic-combined-squashfs.img of=/dev/sdb bs=10M

あ、上記のデバイス名を間違えると悲惨なことが起きるので、気をつけて下さい。

起動

あとはALIXに載せて起動してみる。

余談

JFFS2って本来はMTD(メモリ・テクノロジー・デバイス)専用のはずなんですが、CFで使えちゃうのはどうしたわけなんだろう。 OpenWRTがえらいの?

(2010/4/9 2010/12/23 - sgk)