Wednesday, September 7, 2011

fonera simpl hack: GPL source

FonからGPLソースの配付のアナウンスがあった。

http://blog.fonosfera.org/simpl-gpl-sources-now-available/

ダウンロードしてコンパイルしてみたところ途中でエラーで止まってしまった。そこで調べてみたらmakeのバージョンをダウングレードすることでコンパイルが通った。GPLなのでいろいろ弄れそうと思ったが実はそう簡単ではない。というのも肝心のralinkのカーネルモジュールがプレコンパイルなのでAPクライアントのような機能を追加できない。裏技として私のところにあるSDKで作ったモジュールを移せばおそらくバカーネルバージョンも同じなので動く可能性はある。しかしある程度.configの設定を合わせておかないと動かないだろう。それなのでfonのカーネルの.configの設定の基本部分をSDKに移し再コンパイルすればよい。それをfonのソースに移せば使えるようになる。またflashメモリが2mbしかないので、機能を詰め込むのは非常に難しい。

GPLソースだけで弄れる部分は極めて少ない。よって機能を追加しようとするなら外からソースを追加することになる。

12 comments:

  1. defaultでmakeしてopenwrt-foneraN-fonita-squashfs.imgが生成されるところまでは行きました。その後の処理の仕方をFonera Simple Hackingに従って

    RT3052 # tftpboot 8A100000 openwrt-foneraN-fonita-squashfs.img



    done

    Bytes transferred = 1819648 (1bc400 hex)

    NetBootFileXferSize= 001bc400

    までは行きましたが、この後の処理で

    RT3052 # bootm


    ## Booting image at 8a100000 ...

    Bad Magic Number,63636363

    で止まってしまいました。

    正しい処理を教えていただければ幸です。

    ReplyDelete
  2. その後、8a100000は80800000にすべきことに気づきましてbootmは実行してくれましたがCPU 0 Unable to handle kernel paging...でうまくいきませんでした。

    それで

    2: System Load Linux Kernel then write to Flash via TFTP.

    を実行したら処理が完了したようでfonの設定WEBでversionが4.0.22に変わってくれました。

    ReplyDelete
  3. 説明が不備ですみません。fonのfirmwareには2通りあってそれぞれ方法が違います。ひとつはsquashfsとしてflashメモリからブートするもの、もう一つがinitramfsとしてram上で動作するものがあります。私のfirmwareはram上で動作するものなのでtftpbootでもflashに書き込んでブートしても動きます。fonのGPLソースはデフォルトでsquashfs仕様になっているのでtftpbootでは動作できないと思います。その場合flashメモリに書き込むことで使えます。

    ReplyDelete
  4. こちらが初心者ですので、バカなことを公開で聞いたものだと後で恥じ入っています。

    Fonera Simple Hackingを読んでhottunaさんのfirmwareはRAMで動かすものと思っていましたが、flashでも動くのだとわかったのですがこの場合も

    2: System Load Linux Kernel then write to Flash via TFTP.

    を実行すれば良いということでしょうか?

    恥をしのんでの聞きついでです。

    ReplyDelete
  5. 実のところ私も初心者同然です。初代のfonのころから弄っていただけのことで多少は組み込みOSについての知識はあるのですが、まだまだ分からないことも多いのです。

    結論から言うと2:で出来ます。

    このfonera simplは特殊なというか無駄を極限まで省いた設計になっていてfilesystem自体が読み込み専用になっています。flashメモリの最後のブロックがそのfirmware設定用に割り当てられています。それなので設定するごとにflashしなければなりません。

    それでもどりますが、2つの方法、squashfsとinitramfsですが、squashfsはflashからブートするのでflashがrootfsになります。initramfsはramにロードします。つまりramがrootfsになります。squashfsは書き込みは出来ませんがinitramfsは出来ます。しかしramなので電源プラグを抜けば消えてしまいます。すなわりその両者にはそのrootfsを保存できない点においてまったく同じということになります。

    ただそのどちらも設定の保存するアドレスがあって見せかけ上どちらも振る舞いは同じになります。

    squashfs版の場合tftpbootでramにロードしてブートすると本来flashメモリにあるべきものがflashメモリにあるので動作出来ません。しかしinitramfs版の場合(例えば私が作ったFW)はtftpbootでramでブートしても、flashに書き込んでブートしてもどちらでも出来ます。

    initramfs版は一旦ramにロードするのでその分メモリを消費します。これはルータのようなramが非常に少ない機種では好ましくありません。これは欠点ではありますが、一方でtftpbootが使えたり、FWの作成が簡単だったりします。実験用としては扱いやすい方法です。

    私のFonera Simpl Hackingの記事も不備な点がまだまだ多いので改善していく予定です。不明な点がありましたら今後ともどうか遠慮なくご指摘ください。

    ReplyDelete
  6. 詳細なご説明頂きまして有難うございます。但し小生の理解を越えていることは確かでご説明を理解するには時間がかかると思います。

    それで、hottunaさんのralink-custom-20100813.imgをflashしてみまして、fonのファームとの違いを理解し始めました。時間を見ていじってみたいと思っています。

    ところで、hottunaさんのファームにOpenWrtが提供している色々な追加機能を残りのROMエリアに追加するにはどのようにすればよろしいでしょうか? 具体的にはaprxが走ればありがたいのですが。

    よろしくご指導頂ければ幸です。

    ReplyDelete
  7. fonのソースとOpenWtのソースのディレクトリ構成が同じなのでkamikazeのソース(http://downloads.openwrt.org/kamikaze/7.09/kamikaze_7.09.tar.bz2)をダウンロードしてみました。kamikaze_7.09/packageのディレクトリにいろいろファイルがありますがそれもfonのソースと同じディレクトリにコピーするだけです。あとmake menuconfigにするとメニューに現れてくると思います。ただちょっと弄って見たところ、そう簡単でないことが分かっています。一つはファイルサイズで、simplのflashメモリは2MiBなので、パッケージを追加してその上限を越えた場合、コンパイルエラーになります。それを回避するにはfonのパッケージのいくつかを外すことになります。2つめはパッケージを移植しても使えるとは限らないことです。試しにbusyboxとdropbearで試してみたところ、コンパイルは通ったものの使うすべがありません。というのも肝心のinit部分がプレコンパイルでそれを入れ替えない限りfonにはアクセスできないからです。そこでinitを入換ようとしたところ、make menuconfigすら出来ません。残念ながら私も勉強不足でそれを解決するには時間がかかりそうです。aprxも同様にkamikazeからコピーすればできると思いますが、肝心のfimrwareにアクセスできないのでそこがネックになるのではないかと思います。

    ReplyDelete
  8. 早速のご返事有難うございます。

    aprxのソースは下記のURLで入手可能でそれをhottunaさんの開発環境下でコンパイルすることは可能でしょうか?結果として2MbyteのROM制限を越えたなら「パッケージを追加してその上限を越えた場合、コンパイルエラーになります。それを回避するにはfonのパッケージのいくつかを外すことになります」は理解しています。aprxの追加で必須でない機能の削除は覚悟しています。

    http://wiki.ham.fi/Aprx.en

    ご意見頂ければ幸です。

    ReplyDelete
  9. hottunaさんのコメントを充分理解せずに勝手に質問を繰り返しているようですがお許しください。

    hottunaさんのファームを見ているうちにどうもRalink AP SDKなるものをお使いのようで、Google検索で「RALINK AP SDK 3.3 USER’S MANUAL」を見つけて読んでいますが、この中の「8 USER APPLICATION」が用意されているので、このSDKを使えばaprxを搭載することが可能なのではないかと思い始めました。

    Ralink AP SDKベースでの検討は方向性として間違っているでしょうか?

    ReplyDelete
  10. Ralink AP SDKのソースは再配布できないソースなので、ひょっとしたらどこかに落ちているかもしれなせん。1年前たまたまdd-wrtのフォーラムを見ていたらあったのでそれをDLしました。組み込みOSの場合、カーネルソースを編集してflashのアドレスを変える必要があります。具体的にはu-boot、カーネル、rootfs、設定用とこの4つに分かれてmtd0、mtd1、mtd2...とアドレスを指定します。aprxを搭載するとなると、どちらかというとfonのソースの方が簡単なような気がしますが、どちらもかなりソースを改変することになります。

    ralink SDKの方は先ほど書いた通りカーネルソースを変更しなければなりません。もしそのままSDKで作ったfirmwareをfonでブートするとシステムが壊れます。そのmtdのパーティションがまったく違っているためです。とくにu-bootのパーティションを破壊されないように注意します。システムにアクセスした時も同様です。

    以上の理由でどちらが簡単か比較は難しいのですが、先ほど書いた通りSDKは再配布できないのでfonのソースを使うのがベターではないかと思います。私もfonのソースで何か出来ないか思案中です。

    話は変わりますが、aprxというアプリケーションは無線のゲートウェイのことでしょうか?数十キロ以上離れた場所同士でネットワークがつながるなら夢も広がりますね。

    ReplyDelete
  11. 早速のご返事有難うございます。小生も再配布に関するdd-wrtでのコメントを読みました。Ralink AP SDKは(無線LAN製造メーカーへの有償)契約配布が前提なのに誰かが無許可で無償再配布しているのが現状と理解しました。でもこちらの方が子機とかMeshが使えるようなのでOpenWrtベースの現状の提供機能よりは魅力的に見えますが。

    いずれにしてもこの分野は小生にとっては不得意なのでhottunaさんのご努力待ちとするのが疲れないと判断しています。よろしくお願いします。

    aprxに関してですがこのソフトはアマチュア無線で既に10年以上前から普及している位置情報サービスAPRSのゲートウエイ機能をlinux上で実現するもので、軽量設計のために組み込み機器で動作が可能で海外では無線LAN機器に実装して実運用しているようです。小生も現在laptopに実装して運用していますが無線LANへの移行を考えています。なにもfonera simpleに固執する必要はないのですが、2個ほど手元で寝ているのモッタイナイと思っての動機です。

    APRSの運用状況は

    http://aprs.fi/

    で見るのが簡単です。歴史的にはアマチュア無線用に構築したAPRSサーバーですが、今ではiPhoneとかAndroidにも開放されているのがわかると思います。aprs.fiは船舶用の位置情報サービスも収容していますので大変賑やかです。

    ReplyDelete
  12. Ralink AP SDKにパッケージを追加するのはサイズの関係でかなり難しいと思います。というのも昨年は2MiBに収めるためかなり機能を絞り込みました。fonのgplソースでoprnwrt8.09から移植したaprx_0.99-svn121をコンパイルしてみたところ28kバイトありました。試しにRalinkのFWで動かそうとしたのですが、ライブラリが不足して動きませんでした。

    ./aprx: can't load library 'libgcc_s.so.1'

    さらにライブラリを追加するとなるとかなり厳しいと思います。RalinkのFWはralink apのカーネルモジュールがかなりのウェイトを占めてるのですが、その機能を削っていくことでスペースを空けることは可能です。しかしかなり試行錯誤しなければなりません。

    一方、fon gplソースの場合、aprxはコンパイル出来てFWとして仕上がっているので、あとはいかにして立ち上げるかという問題のみになります。このfonソースのFWを現時点でアクセスする方法はありません。シリアルは入力できず、telnetやsshなどの外部アクセスも出来ません。それさえ解決すればaprxは動くので、可能性としてはfonのソースの方が実現性が高いと思います。

    ReplyDelete