DD-WRT編 > optwareによるパッケージ追加

DD-WRT編/optwareによるパッケージ追加


WHR-G54S で稼働する dd-wrt 14896 std に、追加パッケージをインストールする


こんな古い機種でも、スペックに見合った用途を見極めれば、わりと実用的に動くという一例を、紹介します。
ルータとしての機能以外に、簡単なウェブサーバを作ったり、ファイルサーバにしたりと、可能性が広がります。


リポジトリを使うには、ソフトウェアを保存する領域が必要


まず、optwareとして公開されているリポジトリを有効にするには、パッケージ管理に必要となる基本的なツールや、ツールを動かすために必要となるライブラリ、インストールしたバイナリファイルを保存する領域が必要になる。

保存する場所は、標準では /jffs や /opt というディレクトリが使われる。
これを、いかに確保するかがポイントとなる。

dd-wrtのファームウェアイメージが3MBで、4MBのフラッシュメモリの機種に書き込むことで、残り1MB(実際にはjffs2ファイルシステムの管理領域として300KBほど差し引かれるので、自由に使えるのは700KB程度)を、/jffsとして使うことができる。
しかし、この容量ではぜんぜん足りない。ここ最近の多機能型ルータを除いて、ほとんどの旧機種はフラッシュメモリ容量が4MBか8MBで、総じて空き領域は1MB~数MBしか得られない。機能を削ってファームウェア容量をちょっと少なめにしたバージョンも数多く公開されているが、それを頑張って探したところで、焼け石に水である。
それならば、もともと付いてるフラッシュメモリを張り替えて、容量を増やせたら解決だが、それは厳しい。上位容量のフラッシュメモリの部品調達が困難な上、単純に張り替えただけではダメで、ブートローダの移植が必要など、多くの課題を解決しなければならないからである。

保存領域を簡単に増やすために、SDcardを取り付ける改造がおすすめである。
どこの家にも、低容量のSDcardの1枚や2枚、余ってるはず。これを生かせば世界が拡がる。


SDカードを取り付ける


半田付け必須ですが、なんとかググって、改造しましょう。
幸いなことに、実践している先輩様たちが、やり方を全て公開してくれている。
「dd-wrt sdcard mod」でググれば、動画も画像も事例が沢山出てくる。

改造と言っても、SDカードと本体基板とをケーブルでつないで、引き回すだけ。
ICや電子部品を空中配線したり、基板を作成する必要はなく、電子工作のレベルとしては、かなり初級な領域である。コツさえ掴めば、さほど難しくもないはず。

SDカードのソケット調達


100均ショップのカードリーダを購入して解体するとか、これまた家に数枚余ってるであろう「microSDcard → 標準SDcard 変換アダプタ」を流用するなど、正規のソケットを購入する以外に、いろいろな方法がある。


SDカードの取り付けが成功していることを確認


dd-wrtの標準的なバージョンでは、SDcardを読み書きするプログラムが同梱されている。
取り付けが成功すれば、/mmcというディレクトリを自由に使えるようになる。

こんな感じで、管理画面にSDカードの容量が出たら成功している

Total / Free Size
387.33 MB / 387.31 MB
Card Info
 Card Type : SD
 Spec Version : 1.00 - 1.01
 Card Size : 491 MB

(上記は512MBのSDカードを、400MBのデータ領域と、100MBのswapに区切ってあり、
 400MBのほうが容量として出ている)

なお、SDcardを経由した読み書きは、およそ2.5MB/secほどの速度が出る。

SDHCカードも正常に使える


自分は16GBのカードを挿して、本番用として固定設定した。

ルータのログを詳細に長期間保存したり、LAN内の端末に、ファイルを配布したり、
FTPサーバやウェブサーバを立ち上げて、自分用のアップローダや倉庫を設置する程度の使い方なら、
問題なく使える。むしろこんな広い空間を何に使うか、用途に合わせてよく考える必要がある。

SDカードをあとから交換したくなったら、tarコマンドやddコマンドで一括転送するだけで、新旧の置き換えは可能。


ipkgコマンドは標準で入っているが、そのままでは使えない


標準状態だと、jffsがない(or 少ない)ので、ipkgは使えない。

ipkg update

please enable jffs first, you can't use IPKG without jffs support

これは、jffsディレクトリがないよ、というエラーメッセージだが、
たとえjffs領域が少しあっても、おそらくほとんどの機種で、jffsの余剰領域だけでは
容量不足に陥る。なので標準搭載のipkg updateは、使わない(と自分は理解した)

広大な/jffs領域を作る


多くの先駆者様たちの情報を見た結果、/mmc配下を土台にし、jffsを作ればよいと判明

mount -o bind /mmc /jffs

これで、SDcardとファイルをやりとりする出入り口が増える形になり、/mmcのほか、/jffsディレクトリが、あたかも存在しているかのように使えるようになる。

さらに/optを作る。ここに実行ファイル等がインストールされる。
mkdir /jffs/opt
mount -o bind /jffs/opt /opt

リポジトリを有効にするインストーラをダウンロード


今回の対象となるリポジトリはこれ
http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/

2chのかたのご指摘により、このページに示す方法は、配布されたスクリプトの仕様により、
mips機のみで使える方法とのこと。古めの白い筐体、銀の筐体の機種は、mips機であることが多い。

USBのついたWZR-HP-G300NHなど黒いツヤツヤした筐体の多くは、SoCのアーキテクチャが異なる可能性が高いので、要確認。


リポジトリを有効化するための、dd-wrt用シェルスクリプトが公開されてるので、wgetする

wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh
↑長いけど、ここは1行なので注意。1行にまとめて実行する。
 Connecting to www.3iii.dk (46.30.212.129:80)

ダウンロードしたスクリプトを実行

sh /tmp/optware-install.sh

Installing package uclibc-opt_0.9.28-13_mipsel.ipk ...

待ってるだけで、さまざまな環境設定を自動でやってくれる、大変ありがたいスクリプトである。

パッケージの一覧を表示


インストールが終わったら

ipkg-opt list

でパッケージ一覧が出る。

パッケージのインストール


使いたいパッケージを見つけたら、

ipkg-opt install php

などと実行すれば、インストールが実行される。

これ以降はOpenWrtのパッケージ導入と全く変わらなくなるので、OpenWrtについて言及されたページなどを参考に、パッケージの使い方等を学べばよい。

OpenWrtと1つ違うところは、設定ファイルのインストール先の/etcが/opt/etcになったりと、必ず先頭に/optが付く。けど問題なく動くので、慣れるだけ。


おまけ lighttpd + php を動かしてみた


本来はルータなので、ルータとしての基本動作を維持しつつ、ルータ以外の余剰能力というか限界点を探ってみる。phpを扱えるウェブサーバを動かし、試しに動かしてみた。

ファイル倉庫、アップローダの設置


アップローダを設置した動機は、Android端末のGoogleアカウントを設定していない端末用に、apkファイルの置き場所が欲しかったため。インターネットが繋がってるかどうかは関係なく、ルータの電源さえ入っていれば、Android端末のブラウザ操作だけで、ダウンロードからインストール完了まで完結できる。

Android端末を初期設定する際、ふつうはGoogleアカウントを設定すれば済むのだが、なんらかの理由でアカウントなど個人設定をしたくない端末もある。汎用のファイラや、よく使うアプリを導入するところまで提供できれば、あとは端末側でなんとでも出来る。その最初の一歩を、このルータで提供する。

この用途を実現するには、phpをつかったファイルの入出力と、簡単なWebUIを作るだけなので、いとも簡単に動作した。これくらいの軽作業なら、問題なく動くことがわかった。


GDライブラリをつかった画像の加工


phpでGDライブラリを呼び出し、文字入れをした画像ファイルを、動的に生成することができた。
ただしTrueTypeFontをつかって埋め込むことはできなかった(メモリ不足)。

画像を小さくリサイズ処理して、サムネ一覧を作りたかったのだが、これは厳しい結果となった。
100KB以下のjpgファイルなら可能だった。しかし、結果が出るまで、20秒ほど待たされる。
100KBを超えると、さすがにメモリ不足で、読み込む時点でhttpdがタイムアウトでエラーになった。

タイムアウトと無縁なコンソール上でphpを実行してみたが、SDcardに用意したswap領域を盛大に使う形で処理が遅くなり、数分後に結果が出てきた。実用的な使い方はできそうにない。

一応それでもルータがリブートするなどの挙動不審な動作はなかったので、単純にメモリ不足が原因と思われる。



ルータの状況表示とかに使えそう


以上の実験から、ルータの状況表示のような使い方で応用するならば、

  • クライアントブリッジ運用で、親機のAPとの通信が成立したり途切れたときのログを追えるように
(周囲にどんなWifi機器があって、どのchをつかってるかなども同時に記録しておけば、
 接続のトラブルが発生した際、途切れる原因となるデバイス、時間帯、電波状況を確認できる)

  • アクセスポイント運用で、どんな端末がいつ繋がれたか記録

などを、グラフをつかって動的に描画する用途に使える。

こういう用途は、MRTGというツールが有名で、dd-wrtのページでも書かれている。


このページで書かれている内容は、実際にMRTGを動かすのは、dd-wrt以外の場所であり、
必要なデータを、稼働中のdd-wrtからどうやって引き出すか、について言及されている。

dd-wrtそのもので動かすことは、メモリや処理能力の観点で、相当な無茶になりそうだが、
ipkg-opt install mrtg で、インストール自体はできた。

ipkg-opt list | grep mrtg
mrtg - 2.17.2-1 - Multi Router Traffic Grapher


ipkg-opt install mrtg

Installing mrtg (2.17.2-1) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/mrtg_2.17.2-1_mipsel.ipk
Installing perl (5.8.8-24) to /opt/...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/perl_5.8.8-24_mipsel.ipk
Configuring mrtg
MRTG is now installed, you now need to make a config file
for it and set up a cron job to run it.
See the cfgmaker man page for the former. Setting up crontab
depends on the version of cron you are running.
Configuring perl
Successfully terminated.


まだ詳細を試していないが、メモリの消費量次第で、自分が必要とする表示を独自に実装するか、
処理をMRTGに全部お任せするか、選択することにする。うまく動いたら、別ページで発表しようと思う。